调整matplotlib的Axes3D中的标签定位

时间:2011-04-02 20:50:30

标签: 3d matplotlib

我在使用matplotlib中的轴标签重叠刻度标签时遇到问题。我试图通过应用变换或调用set_y()来“手动”重新定位标签,但没有用。

这是一个重现问题的片段:

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标签如何与刻度相冲突。我可以优雅地解决这个问题吗?

7 个答案:

答案 0 :(得分:37)

我分享你的沮丧。我工作了半个小时,无处可去。文档说set_xlabel采用了一个arg labelpad,但是我得到一个错误(AttributeError:Unknown property labelpad)!在事实之后设置它不会做任何事情,在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

答案 1 :(得分:20)

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

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

请参阅此处的解释:

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

在v1.4上测试,应该在版本>中工作1.1我相信。

答案 2 :(得分:16)

我真的需要更频繁地关注StackOverflow。我是mplot3d的当前维护者。通常在常规2d图中工作的各种技巧不适用于3d图的原因是因为mplot3d最初是用硬编码的默认值编写的。 mplot3d如何计算渲染标签的角度也存在缺陷。

v1.1.0包含几个用于改善状态的修复程序。我修正了轴标签角度的错误计算,并对间距进行了一些调整。对于下一个版本,我希望让3d轴占用超过默认的轴间距,因为默认设计是考虑到刻度标签和轴标签在轴外,mplot3d不是这种情况。 。因为间距是由mplot3d中的相对比例决定的,所以在较小的空间内工作会迫使标签靠近在一起。

至于其他可行的解决方法,请参阅说明here。 一个公平的警告,这个私人字典不是一个永久的解决方案,而是一个必要的邪恶,直到mplot3d的重构完成。

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

答案 3 :(得分:8)

为每个轴添加此项,修改数字:

axes.yaxis.labelpad=30

Adam Hughes在链接中提到它不起作用,但它适用于我。

答案 4 :(得分:5)

这会在一次拍摄中更改所有(x,y,z)标签的填充。我最喜欢这种方法:

from matplotlib import rcParams
rcParams['axes.labelpad'] = 20

答案 5 :(得分: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

答案 6 :(得分:0)

绘制图形后,可以使用labelpad

axes = fig.gca(projection='3d')
axes.xaxis.labelpad=20
axes.yaxis.labelpad=20
axes.zaxis.labelpad=20

这可能会导致轴标签超出3D图,因此您必须使用dist方法来调整距离:

ax.dist = 13