DEBUG.WIKI
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
丽萨主机;为跨境业务选好 IP;原生 / 住宅 IP · 按套餐选择;查看 IP →

Matplotlib 三维图 twinx 报 tick_left 错误,Axes3D 不支持双轴

Matplotlib 3.10.8 的 Axes3D 调用 twinx 可能报 tick_left,3.11.2 则明确拒绝。按二维比较或真实三维数据选择图形,不把错误提示改善当成功能新增。

在三维坐标轴上调用 ax.twinx(),报错却指向刻度方法:

AttributeError: 'YAxis' object has no attribute 'tick_left'

把它换成 twiny(),又可能出现 ValueError: 'bottom' is not a valid value for position。Matplotlib 3.10.8 出现过这两种表现,先确认 ax 是否由 projection="3d" 创建;这不是给 YAxis 补一个方法就能解决的双轴需求。

三维坐标轴没有二维 twin 的布局约定

二维 twinx() 创建一个共享 x 轴的新 Axes,把两组 y 刻度分别摆在左右两边。旧版 Axes3D 继承了这个入口,却不具备那套二维刻度位置接口,调用深入内部后才失败。

Matplotlib 3.11.2 已将 Axes3D 的 twinx、twiny 明确标为不支持,调用会抛出 UnsupportedError。新的错误更直接,但没有给三维图增加双 y 轴或双 z 轴功能。secondary_xaxis、secondary_yaxis 也不能在三维图上替代它们。

先写清楚想比较什么:一组共享横坐标的二维曲线,还是确实需要 x、y、z 三个坐标的空间关系。两种目标对应不同的图,不宜为了消除异常随意丢掉一个维度。

数据本来就是二维关系时,使用普通 Axes

如果只是两组随同一横坐标变化、单位不同的曲线,可以在二维 Axes 上创建 twin。例如:

import matplotlib.pyplot as plt

x = [1, 2, 3]
temperature = [18, 21, 20]
pressure = [1000, 1006, 1003]

fig, left = plt.subplots()
right = left.twinx()
left.plot(x, temperature, color="tab:blue")
right.plot(x, pressure, color="tab:red")
left.set_ylabel("Temperature (C)")
right.set_ylabel("Pressure (hPa)")
fig.savefig("two-dimensional-comparison.png")

示例只表达两组二维数据,不是三维数据的通用降维算法。双轴刻度会影响视觉比较,单位、颜色和图例要让读者明确区分两组量,不能仅因曲线重合就暗示数值相等或相关。

如果 z 坐标不可省略,保留三维表示,把两组数据放到独立的三维子图中,分别标明单位、坐标范围与视角。比较时按需要对齐共同的坐标范围;不要给另一张普通二维 Axes 叠在三维图上,就把它当作共享空间坐标的 twin,旋转与缩放后尤其容易错位。

验收要包含实际绘制和保存文件,检查每个轴的单位、范围、图例以及交互旋转后的含义。仅看到窗口出现不足以证明原本需要比较的第三维仍然存在。已有异常还涉及其他 Artist 或自定义投影时,应沿完整栈继续定位,不能把所有 tick_left 错误都归给 Axes3D。