DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
晚安云;香港 CN2 ¥15/月
雨云;给项目一台云服务器

改了 NumPy 数组,旧图刻度也跟着变:set_xticks 输入要保留副本

set_xticks接收ndarray后,FixedLocator可能与调用方继续共享同一数组;后续原地加偏移会改变已设刻度。3.11.2没有统一隔离承诺,应用应在需要固定的位置复制。

第一张极坐标图的刻度已经设置好,随后为了画第二张图给 theta 原地加上 2π,第一张图的刻度却一起变了。如果传给 set_xticks() 的是 NumPy 数组,应检查两张图是否仍在使用同一份可变数据。

Matplotlib 3.11.2 的 FixedLocator 使用 np.asarray(locs) 保存刻度;传入现成 ndarray 时,这一步可能不复制。单位转换路径也不保证总产生新对象,因此不能把一次 setter 调用视为已取得独立快照。

在交给第一张图时固定其刻度数据

如果后续还要修改同一个数组,可以为每张图明确给出副本:

import numpy as np
import matplotlib.pyplot as plt

labels = ["Speed", "Reliability", "Comfort", "Safety", "Efficiency"]
theta = np.linspace(0, 2 * np.pi, len(labels), endpoint=False)
fig, axes = plt.subplots(2, 1, subplot_kw={"projection": "polar"})
axes[0].set_xticks(theta.copy(), labels=labels)

theta += 2 * np.pi
axes[1].set_thetamin(360)
axes[1].set_thetamax(720)
axes[1].set_xticks(theta.copy(), labels=labels)

这里第一张图持有的刻度数据不再是稍后被修改的 theta。第二张图的角度区间仍单独指定;不能只因为极坐标角度相差一周看起来相同,就忽略 locator 保存的实际数值与视图区间。

如果只想派生第二组坐标,也可以保留 theta,用 shifted = theta + 2 * np.pi 生成新数组,而不用 theta += ...。前者创建新结果,后者修改原对象;变量名相同或不同本身都不构成隔离保证。

不依赖传入数组的隐式更新

刻度需要改变时,使用公开的 set_xticks() 再次设置,明确让轴处理刻度位置、标签与视图范围。不要把修改旧数组当作更新图表的正式接口,它既没有通用隔离承诺,也不保证完成所有应有的状态更新。

把 ndarray 换成列表后现象可能消失,因为转换列表通常会创建数组;但这不意味着所有 array-like 输入都有同样复制行为。明确复制更能表达“这一张图保存当时的位置”的目的。

复制只隔离刻度坐标,不会自动隔离共享的 Axes、其他 Artist 或单位转换对象。若图表使用共享坐标轴,仍应按共享关系检查刻度是否本就应同步变化。

验收在修改第二组数据之前保存第一张图的预期刻度,修改后再比较实际位置,并检查重绘与最终导出。标签数量与位置需一一对应,不能只看曲线仍存在。后续依赖更新也应保留这一对照,避免把未定义的共享行为误当成稳定契约。