【问题标题】:Adjust label positioning in Axes3D of matplotlib在 matplotlib 的 Axes3D 中调整标签定位
【发布时间】:2011-07-28 09:38:16
【问题描述】:

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

这是一个重现问题的 sn-p:

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

【问题讨论】:

    标签: 3d matplotlib


    【解决方案1】:

    我分享你的挫败感。我为此工作了半个小时,却一无所获。文档说 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()
    

    【讨论】:

    • 我发誓,我尝试了几十种变通方法,但我没有想到只是在标签的开头添加换行符!聪明的 !谢谢!
    • 这让我发疯了,直到我遇到了你简单但非常聪明的方法。谢谢...
    • 这也适用于我,而且我最近意识到在标签字符串的 end 上放置一两个换行符也可以帮助强制它进入可读位置。
    • rcParams["text.usetex"]选项设置为True时,你知道如何将它与latex命令结合起来吗?
    • 仍然像魅力一样工作(使用版本 3.4.2)!!非常感谢:D
    【解决方案2】:

    在新版本的 matplotlib 中,这是这样做的:

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

    请看这里的解释:

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

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

    【讨论】:

    • 我有 1.5.1 在 Jupyter 中运行,这个表达式没有明显的效果。
    【解决方案3】:

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

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

    关于其他可能的变通方法,请参阅注释here。 一个公平的警告,这个私有字典并不是一个永久的解决方案,而是一个必要的邪恶,直到 mplot3d 的重构完成。

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

    【讨论】:

    • 有没有关于如何访问和更改 self._axinfo 的示例?尤其是填充?
    • ^^^^^^^ 看我的回答
    【解决方案4】:

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

    axes.yaxis.labelpad=30
    

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

    【讨论】:

    • 这是对我使用 mpl v2.0.2 的唯一修复。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • 彩色编码不是一个坏主意,但这是一篇学术文章,它必须在黑白打印中清晰易读。感谢分享!
      【解决方案7】:

      您可以在绘制图形之后使用labelpad

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

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

      ax.dist = 13
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        • 2023-02-10
        • 2021-10-02
        相关资源
        最近更新 更多