matplotlib 调整Axes3D标签定位

vh0rcniy  于 2023-05-01  发布在  其他
关注(0)|答案(8)|浏览(146)

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

xesrikrc

xesrikrc1#

我和你一样沮丧。我花了整整半个小时,但毫无进展。文档说set_xlabel接受一个arg labelpad,但我得到一个错误(AttributeError:未知属性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()

bjp0bcyl

bjp0bcyl2#

为每个轴添加此值,调整数字:

axes.yaxis.labelpad=30

亚当·休斯在链接中提到它不起作用,但它对我有效。

qhhrdooz

qhhrdooz3#

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

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

请参阅此处的解释:
https://github.com/matplotlib/matplotlib/issues/3610
在v1上测试。4,应该在版本〉1中工作。1我相信

ubby3x7f

ubby3x7f4#

我真的需要经常关注StackOverflow。我是mplot3d的维护者。通常在常规2d图中工作的各种技巧不适用于3d图的原因是因为mplot3d最初是用硬编码的默认值编写的。mplot3d在计算渲染标签的Angular 时也有错误。
v1.1.0包含几个修复程序来改善状态。我修正了轴标签Angular 的错误计算,并对间距做了一些调整。对于下一个版本,我希望3d轴占用的空间超过默认轴间距,因为默认设计是考虑到刻度标签和轴标签将在轴之外,而mplot3d不是这种情况。由于间距是由mplot3d中的相对比例决定的,因此在较小的空间内工作会迫使标签靠得更近。
至于其他可能的变通方法,请参阅此处的说明。一个公平的警告,这本私人字典并不是要成为一个永久的解决方案,而是一个必要的邪恶,直到mplot3d的重构完成。
另外,v1.1.0包含了对mplot3d API的许多更新。请在这里查看修订后的文档。

holgip5t

holgip5t5#

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

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

zour9fqk6#

作为一种设计实践,转换后的文本不是很清晰。我建议你使用标签为您的轴,也许颜色编码。这就是在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()

q1qsirdb

q1qsirdb7#

您可以使用labelpad,然后绘制您的图形:

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

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

ax.dist = 13
zpqajqem

zpqajqem8#

我用的是MPL3。4.3我仍然有这个问题。我应该注意到我使用的是3D子情节,也许这是我的问题?

fig = plt.figure(figsize=(3,2))
ax = fig.add_subplot(1,2,i,projection='3d')

我觉得我已经尝试了一切,包括这里的答案。我只是不能让我的刻度标签或轴标签在我想要的地方。
不接触填充我有(注意左边图的z轴标签是关闭的图):

下面的代码将标签推得很远,正如预期的那样:

ax.xaxis.labelpad = 20
ax.yaxis.labelpad = 20
ax.zaxis.labelpad = 20

所以我认为减少这些数字应该会让他们更接近。下面的代码使yaxis(实现)非常接近刻度标签,但不是xaxis和zaxis标签:

ax.xaxis.labelpad = 1
ax.yaxis.labelpad = 1
ax.zaxis.labelpad = 1

在xaxis和zaxis上稍微调整一下不会有任何效果:

ax.xaxis.labelpad = 0.1
ax.yaxis.labelpad = 1
ax.zaxis.labelpad = 0.001

对不起,这不是一个答案,但我觉得我在这里提出的调整和意外的行为可能有助于刺激一个适当的答案?

相关问题