【问题标题】:tick label positions for matplotlib 3D plotmatplotlib 3D 绘图的刻度标签位置
【发布时间】:2013-04-17 13:27:30
【问题描述】:

我正在尝试研究如何设置/更正 3D matplotlib 图的刻度标签的位置。刻度标签不与刻度对齐。当需要许多刻度标签时,这个问题似乎尤为突出。

我修改了 matplotlib 文档中的一个示例 (http://matplotlib.org/examples/mplot3d/polys3d_demo.html) 来说明我的问题。

from mpl_toolkits.mplot3d import Axes3D
from matplotlib.collections import PolyCollection
from matplotlib.colors import colorConverter
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(10,10))
ax = fig.gca(projection='3d')

cc = lambda arg: colorConverter.to_rgba(arg, alpha=0.6)

xs = np.arange(0, 10, 0.4)
verts = []
zs = np.arange(50)
for z in zs:
    ys = np.ones(len(xs))*z
    ys[0], ys[-1] = 0, 0
    verts.append(list(zip(xs, ys)))

poly = PolyCollection(verts,facecolor='c')
poly.set_alpha(0.7)
ax.add_collection3d(poly, zs=zs, zdir='y')

ax.set_xlabel('X')
ax.set_xlim3d(0, 10)
ax.set_ylabel('Y')
ax.set_ylim3d(-1, len(zs))
ax.set_yticks(np.arange(len(zs)))
labels = {}
for l_c in zs:
    labels[l_c] = 'This Looks Bad'
ax.set_yticklabels(labels,rotation=-15)
ax.set_zlabel('Z')
ax.set_zlim3d(0, ys.max())

plt.show()

所以问题是:如何让刻度标签与刻度位置对齐?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    通过使用这些对齐方式,我得到了更好的展示位置:

    ax.set_yticklabels(labels,rotation=-15,
                       verticalalignment='baseline',
                       horizontalalignment='left')
    

    我已经用更少的刻度标记修改了示例,以便您可以看到位置:

    【讨论】:

    • 谢谢@Hooked。问题是我需要在那里拥有所有的刻度标签(至少有 50 个),所以使用较少的刻度标记不是一种选择。标签越多,错位就越明显。即使使用您的解决方案的变体(以及@Rutgers 的变体),标签看起来也不对齐。
    • @random.me 你总是可以减小标签的字体大小,但是你仍然有两个文本多和空间太小的根本问题!
    • @random.me 你需要ticks还是text
    • @tcaswell 我需要刻度标签。这将是文本。
    • @Hooked 是的,可以缩小字体大小,在我的问题中,图可以很大,字体很小,所以空间问题不太麻烦。
    【解决方案2】:

    它们确实对齐,但水平位置以刻度为中心。由于是 3D 视图,这使得它们看起来比您期望它们的位置略低。效果与刻度的数量无关,而与宽度有关。

    专门设置对齐方式会有所帮助。尝试添加:

    ax.set_yticklabels(labels,rotation=-15, va='center', ha='left')
    

    玩一下不同的对齐方式,看看你喜欢哪个,我想你是在 ha='left' 之后。

    减少填充,即与刻度线的距离,也可能有所帮助。

    【讨论】:

    • 作为对 OP 的说明:va 与我的示例中的 verticalalignment 同义。 hahorizontalalignment 也是如此。
    • 是的,感谢您澄清这一点,缩写词在输入很多时是幸福的。 :)
    • 感谢@Rutger。我想这是可以做到的最好的。我已经玩过这些(ha,va)并且几乎得到了我想要的东西。它在这个玩具示例上比在我试图解决的实际问题上效果更好。你能举一个如何减少填充的例子吗?也许添加到您现有的答案中。
    • 我在想ax.tick_params(axis='y', pad=30) 之类的东西,但事实证明它只适用于 2D 绘图。您能否澄清一下您在回应 Hooked 时提到的“错位”。我认为那里完全对齐。想象一个围绕旋转标签的矩形框,并想象每个角上的一个点和这些点之间的四个。那么问题是这 8 个点中的哪一个确实希望放置在刻度标签所在的位置(从实际刻度处填充)。
    • @RutgerKassies 是的,我也在尝试类似的事情,但没有任何成功。实际上,原始帖子经过编辑以使数字更小-最初是figsize=(20,20)。在这个规模上,与当前两个答案的不一致仍然存在。回答您的问题:我希望穿过想象中的矩形框中心的线,沿着水平轴,与刻度线对齐。我希望标签和刻度之间的差距更小,理想可控。
    【解决方案3】:

    您还可以在每个轴的 tick_params 选项中将 pad 参数设置为负数。像这样:

        ax.tick_params(axis='x', which='major', pad=-3)
    

    这可能有助于调整刻度标签和轴之间的距离。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-21
      • 2019-08-25
      • 2012-03-15
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      相关资源
      最近更新 更多