为matplotlib 3D绘图标记标签位置

ran*_*.me 7 python matplotlib

我试图找出如何设置/纠正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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

Hoo*_*ked 12

通过使用这些对齐,我可以获得更好的展示位置:

ax.set_yticklabels(labels,rotation=-15,
                   verticalalignment='baseline',
                   horizontalalignment='left')
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述


Rut*_*ies 5

它们对齐,但水平位置以刻度为中心.由于3D视图,这使它们看起来有点低于您期望它们的位置.效果与蜱的数量无关,但与宽度有关.

具体设置对齐将有所帮助.尝试添加:

ax.set_yticklabels(labels,rotation=-15, va='center', ha='left')
Run Code Online (Sandbox Code Playgroud)

通过不同的比对来玩一下,看看你喜欢哪个,我想你是在ha ='left'之后.

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

在此输入图像描述

  • 作为OP的注释:`va`与我的例子中的`verticalalignment`是同义的."ha"和"horizo​​ntalalignment"也是如此. (2认同)