【发布时间】:2019-05-18 16:51:35
【问题描述】:
我正在尝试制作 3d matplot 图。我无法使用对齐良好的标签来显示整个轴。我在下面概述了我尝试过的步骤。
1) 我可以使用以下方法设置 y 轴标签:
yTicks = list(range(0,90,5)
ax.set_yticks(range(len(yTicks)), True)
但是,如您所见,标签对齐非常糟糕。它也与我实际定义的不匹配,应该是按 5 而不是 10 计数的滴答声。
2) 如果我也尝试使用set_yticklabels,则对齐会修复,但它只会打印轴的一部分。这是代码和图像:
ax.set_yticklabels(yTicks, verticalalignment='baseline',
horizontalalignment='left')
注意 y 轴如何从 80 变为 40。
3) 如果我去掉 set_yticks 中的 True,一切都会挤在一起:
4) 最后,如果我在标签函数中同时使用set_yticks 和set_yticklabels 调用get_yticks(),它几乎可以工作,但您可以看到轴线延伸到图形的“表面”之外:
ax.set_yticks(range(len(yTicks)), True)
ax.set_yticklabels(ax.get_yticks(), verticalalignment='baseline',
horizontalalignment='left')
5)这是我的代码的更完整版本供参考:
plt.clf()
ax = plt.axes(projection='3d')
ax.bar3d(x,y,z,
1,1,[val*-1 if val != 0 else 0 for val in z])
xTicks = list(range(0,25,2))
yTicks = list(range(30,90,5))
ax.set_zlim(0, 1)
ax.set_xticks(range(len(xTicks)), True)
ax.set_yticks(range(len(yTicks)), True)
ax.set_xticklabels(ax.get_xticks(),
verticalalignment='baseline',
horizontalalignment='left')
ax.set_yticklabels(ax.get_yticks(),
verticalalignment='baseline',
horizontalalignment='left')
plt.savefig(file_path)
如何让它以 5 的间隔显示我的全轴 (0-90) 并使其对齐良好?
6) 更新:根据下面与@ImportanceOfBeingErnest 的对话,这是我在使用以下代码时仍然遇到的问题:
x=[15,28,20]; y=[30,50,80]; z=[1,1,1]
plt.clf()
ax = plt.axes(projection='3d')
ax.bar3d(x,y,z,
1,1,[val*-1 if val != 0 else 0 for val in z])
xTicks = list(range(0,25,2))
yTicks = list(range(30,90,5))
ax.set_xticks(xTicks)
ax.set_yticks(yTicks)
ax.set_yticklabels(ax.get_yticks(),
verticalalignment='baseline',
horizontalalignment='left')
ax.set_zlim(0, 1)
plt.savefig(getSaveGraphPath(save_name))
【问题讨论】:
-
set_yticks的第二个参数是一个布尔值,指定第一个参数是否是次要刻度。提供一个列表作为第二个参数似乎没有任何意义。然而,真正的问题在这里无法解决,因为我们根本不知道您的柱的实际数据单位。见minimal reproducible example。 -
示例中可以看到条形的实际数据单元,但这也无所谓。任何值都会产生相同的结果。问题不在于条形,而在于轴值,我确实在上面的描述中提供了该信息。
set_yticks是对的(与 plt.yticks() 不同),但删除该参数会产生更糟糕的结果。它从字面上停止计算轴的一部分 -
如果任何值都产生相同的结果,那将是问题的核心。但我无法重现这一点。我没有看到您声称没有对轴进行任何修改的任何图片,所以不,我无法“查看示例中条形的实际数据单元”。
-
我已经在上面添加了我的代码,所以你可以看到。您可以为 x、y、z 选择任何值,只要它们在我定义的标签范围内即可。
-
如果没有实际数据,唯一的答案是您可以通过
ax.set_yticks(np.arange(0,90,5))设置刻度这一微不足道的事实。
标签: python matplotlib 3d bar-chart axis