2013-04-17 37 views
6

我正在设法解决如何设置/更正3D matplotlib绘图的刻度标签的位置。刻度线标签不与刻度线对齐。当需要许多刻度标签时,问题似乎尤其突出。为matplotlib 3D绘图勾选标签位置

我修改了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() 

enter image description here

因此问题是:如何才能得到刻度标记与刻度位置对齐?

回答

5

他们确实对齐,但是以tick为中心的水平位置。由于3D视图,这使得它们显得低于你期望的位置。效果与蜱的数量无关,但与宽度无关。

特别设置对齐将有所帮助。尝试添加:

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

玩了一下不同的路线,看看你更喜欢,我认为你是在哈='左'后。

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

enter image description here

+1

作为OP的一个注释:'va'与'verticalalignment'是同义的,如我的例子。 'ha'和'horizo​​ntalalignment'也是一样。 – Hooked

+0

是的,谢谢澄清,当输入他们很多时,缩写是幸福的。 :) –

+0

谢谢@Rutger。我想这是可以做到的最好的。我已经玩过这些(哈,瓦),几乎得到了我想要的。它在这个玩具的例子中比我想要解决的实际问题更好。你可以举一个如何减少填充的例子吗?也许添加到你现有的答案。 –

10

通过使用这些路线,我得到更好的展示位置:

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

我修改较少打勾标记的例子,所以你可以看到位置:

enter image description here

+0

Thanks @Hooked。问题是我需要在那里有所有的刻度标签(至少有50个),所以使用较少的刻度标记不是一个选项。随着更多标签的不一致,错位显得更加突出。即使使用您的解决方案(以及@Rutgers)的变体,标签也不会对齐。 –

+0

@ random.me你总是可以减小标签的字体大小,但你仍然有两个文本和太少空间的根本问题! – Hooked

+0

@ random.me你需要_ticks_还是_text_? – tacaswell