2011-04-02 44 views
20

我在matplotlib中的轴标签重叠刻度标签时遇到了问题。我尝试通过应用转换或通过调用set_y()来“手动”重新定位标签,但无济于事。在matplotlib的Axes3D中调整标签的位置

下面是重现该问题的一个片段:

import matplotlib 
matplotlib.use("TKAGG") 
import matplotlib.pyplot as pyplot 
import mpl_toolkits.mplot3d 

figure = pyplot.figure() 
figure.subplots_adjust(bottom=0.25, top=0.75) 
axes = figure.gca(projection='3d') 
xLabel = axes.set_xlabel('XXX xxxxxx xxxx x xx x') 
yLabel = axes.set_ylabel('YY (y) yyyyyy') 
zLabel = axes.set_zlabel('Z zzzz zzz (z)') 
plot = axes.plot([1,2,3],[1,2,3]) 

pyplot.show() 

注意x和y标签冲突如何与蜱。我可以优雅地解决这个问题吗?

回答

32

我分享你的无奈做到这一点。我在这里工作了半个小时,没有任何进展。该文档说set_xlabel采用参数labelpad但我得到一个错误(AttributeError:未知属性标签板)!在xaxis或w_xaxis之后,在事实之后设置它什么也不做。

这里的粗解决方法:

import matplotlib 
matplotlib.use("TKAGG") 
import matplotlib.pyplot as pyplot 
import mpl_toolkits.mplot3d 

figure = pyplot.figure(figsize=(8,4), facecolor='w') 
ax = figure.gca(projection='3d') 

xLabel = ax.set_xlabel('\nXXX xxxxxx xxxx x xx x', linespacing=3.2) 
yLabel = ax.set_ylabel('\nYY (y) yyyyyy', linespacing=3.1) 
zLabel = ax.set_zlabel('\nZ zzzz zzz (z)', linespacing=3.4) 
plot = ax.plot([1,2,3],[1,2,3]) 
ax.dist = 10 

pyplot.show() 

enter image description here

+6

我发誓你,我尝试了几十个解决方法,但是没有发生我简单地在标签的开头添加换行符!聪明!谢谢 ! – AbsentmindedProfessor 2011-04-05 00:49:38

+0

巧妙(添加换行符)!!! – 2017-01-17 19:29:11

+0

它让我发疯,直到我遇到你简单但非常聪明的方法。谢谢... – Memin 2017-10-13 21:32:19

3

作为一种设计实践,转换后的文字不是很清晰。 我建议你为你的轴使用标签,也许颜色编码。 这是你如何在matplotlib

import matplotlib 
matplotlib.use("TKAGG") 
import matplotlib.pyplot as pyplot 
import mpl_toolkits.mplot3d 

figure = pyplot.figure() 
figure.subplots_adjust(bottom=0.25, top=0.75) 
axes = figure.gca(projection='3d') 
xLabel = axes.set_xlabel('X', fontsize=14, fontweight='bold', color='b') 
yLabel = axes.set_ylabel('Y',fontsize=14, fontweight='bold', color='r') 
zLabel = axes.set_zlabel('Z',fontsize=14, fontweight='bold', color='g') 


x = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='b') 
y = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='r') 
z = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='g') 

handles, labels = axes.get_legend_handles_labels() 
axes.legend((x,y,z),("XXXXXX","YYYYY","ZZZZZZ"),'best') 


plot = axes.plot([1,2,3],[1,2,3]) 


pyplot.show() 

Image result

+1

颜色编码并不是一个坏主意,但这是一个学术文章,它必须在B&W印刷品中清晰可见。感谢分享 ! – AbsentmindedProfessor 2011-04-05 00:47:54

13

我真的需要遵循的StackOverflow更频繁。我是mplot3d的当前维护者。为什么通常在常规2D图中工作的各种技巧不适用于3D图,这是因为mplot3d最初是用硬编码的默认值编写的。 mplot3d如何计算渲染标签的角度也存在一些错误。

v1.1.0包含几个修复程序来改善事物的状态。我修正了轴标签角度的错误计算,并对间距进行了一些调整。对于下一个版本,我想让3D轴占用超过默认轴间距,因为默认设计考虑到了刻度标签和轴标签会在轴之外,而mplot3d则不是这种情况。由于间距是由mplot3d中的相对比例决定的,因此在标签内部有较小的空间可以使标签更紧密地连接在一起。

至于其他可能的解决方法,请参阅注释here。 公正的警告,这个私人词典不是一个永久的解决方案,而是一个必要的罪恶,直到mplot3d的重构完成。

此外,v1.1.0包含许多mplot3d api的更新。请查看修订后的文档here

+0

有没有关于如何访问和更改self._info的示例?特别是填充? – mab 2013-08-07 14:58:42

+0

^^^^^^^ 查看我的回答 – 2014-11-06 00:12:42

19

在matplotlib的新版本,这是如何做到这一点:

ax.xaxis._axinfo['label']['space_factor'] = 2.8 

看这里的解释:

https://github.com/matplotlib/matplotlib/issues/3610

在测试了V1.4,应在版本工作> 1.1我相信。

+2

非常感谢,只有解决方案有效 – fsociety 2014-10-20 19:12:48

+1

我有1.5.1在Jupyter中运行,这个表达式没有明显的效果。 – user5920660 2017-11-30 22:32:28

3

添加这对于每个轴,适应数:

axes.yaxis.labelpad=30 

它是由亚当休斯不工作的链接被提及,但它为我工作。