【问题标题】:Hiding axis text in matplotlib plots在 matplotlib 图中隐藏轴文本
【发布时间】:2011-01-11 16:42:50
【问题描述】:

我正在尝试在任一轴上绘制一个没有刻度线或数字的图形(我使用传统意义上的轴,而不是 matplotlib 命名法!)。我遇到的一个问题是 matplotlib 通过减去一个值 N 来调整 x(y)ticklabels,然后在轴的末端加上 N。

这可能含糊不清,但下面的简化示例突出了这个问题,'6.18' 是 N 的违规值:

import matplotlib.pyplot as plt
import random
prefix = 6.18

rx = [prefix+(0.001*random.random()) for i in arange(100)]
ry = [prefix+(0.001*random.random()) for i in arange(100)]
plt.plot(rx,ry,'ko')

frame1 = plt.gca()
for xlabel_i in frame1.axes.get_xticklabels():
    xlabel_i.set_visible(False)
    xlabel_i.set_fontsize(0.0)
for xlabel_i in frame1.axes.get_yticklabels():
    xlabel_i.set_fontsize(0.0)
    xlabel_i.set_visible(False)
for tick in frame1.axes.get_xticklines():
    tick.set_visible(False)
for tick in frame1.axes.get_yticklines():
    tick.set_visible(False)

plt.show()

我想知道的三件事是:

  1. 首先如何关闭此行为(尽管在大多数情况下它很有用,但并非总是如此!)我查看了 matplotlib.axis.XAxis 并找不到任何合适的东西

  2. 如何让 N 消失(即X.set_visible(False)

  3. 是否有更好的方法来完成上述操作?如果相关的话,我的最终图将是图中的 4x4 子图。

【问题讨论】:

  • 我有点怀疑这里的任何答案是否真的回答了这个问题。在我看来,这个问题似乎是在询问如何get rid of the offset。然而,所有答案都显示了如何摆脱 all 刻度标签的各种方法。如果问题已被答案取代,也许应该编辑问题以询问答案提供的解决方案是什么?

标签: python matplotlib plot


【解决方案1】:

您可以简单地将xlabel 设置为None,直接在您的轴上。下面是一个使用 seaborn 的工作示例

from matplotlib import pyplot as plt
import seaborn as sns

tips = sns.load_dataset("tips")

ax = sns.boxplot(x="day", y="total_bill", data=tips)
ax.set(xlabel=None)

plt.show()

【讨论】:

    【解决方案2】:

    一个技巧可能是将刻度标签的颜色设置为白色以隐藏它!

    plt.xticks(color='w')
    plt.yticks(color='w')
    

    或者更概括地说(@Armin Okić),您可以将其设置为"None"

    【讨论】:

    • 我发现这个解决方案比其他解决方案更简单,同时我要补充一点,可以将颜色设置为“无”,以便不依赖于背景颜色。
    • 我注意到这应该是字符串“None”,而不是 Python 文字 None。后者抛出异常
    【解决方案3】:

    我已对该图进行了颜色编码以简化流程。

    import matplotlib.pyplot as plt
    fig = plt.figure()
    ax = fig.add_subplot(111)
    

    您可以使用这些命令完全控制图形,以完成答案,我还添加了对样条线的控制:

    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    
    # X AXIS -BORDER
    ax.spines['bottom'].set_visible(False)
    # BLUE
    ax.set_xticklabels([])
    # RED
    ax.set_xticks([])
    # RED AND BLUE TOGETHER
    ax.axes.get_xaxis().set_visible(False)
    
    # Y AXIS -BORDER
    ax.spines['left'].set_visible(False)
    # YELLOW
    ax.set_yticklabels([])
    # GREEN
    ax.set_yticks([])
    # YELLOW AND GREEN TOGHETHER
    ax.axes.get_yaxis().set_visible(False)
    

    【讨论】:

    • ax.set_xticklabels([])ax.set_xticks([]) 对我不起作用,但 ax.axes.get_xaxis().set_visible(False) 对我有用。
    • ax.axes.get_xaxis().set_visible(False) 也隐藏了我的ax.set(xlabel='example'),但同时使用ax.set_xticklabels([])ax.set_xticks([]) 没有。
    【解决方案4】:

    我实际上无法根据此处的任何代码 sn-ps 渲染没有边框或轴数据的图像(即使是答案中接受的那个)。在浏览了一些 API 文档后,我找到了这段代码来渲染我的图像

    plt.axis('off')
    plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off', labelright='off', labelbottom='off')
    plt.savefig('foo.png', dpi=100, bbox_inches='tight', pad_inches=0.0)
    

    我使用tick_params 调用基本上关闭了任何可能呈现的额外信息,并且我的输出文件中有一个完美的图表。

    【讨论】:

    • 共享轴时,基于 set_ticklabels 的解决方案会在共享轴上传播。只有这个基于 tick_params 的解决方案对我来说效果很好。
    • plt.tick_params 需要 bool 而不是字符串。所以'off'' 实际上计算为True,因此与直觉相反,该命令实际上显示了刻度和标签。我没有找到任何信息,因为这是什么时候出现的行为。
    【解决方案5】:

    使用面向对象的 API 时,Axes 对象有两个有用的方法来删除轴文本,set_xticklabels()set_xticks()

    假设您使用

    创建了一个情节
    fig, ax = plt.subplots(1)
    ax.plot(x, y)
    

    如果你只是想删除刻度标签,你可以使用

    ax.set_xticklabels([])
    

    或者要完全去除蜱虫,你可以使用

    ax.set_xticks([])
    

    这些方法对于指定刻度线的准确位置以及标记方式非常有用。传递一个空列表会分别导致没有刻度或没有标签。

    【讨论】:

      【解决方案6】:

      您可以隐藏整个轴,而不是隐藏每个元素:

      frame1.axes.get_xaxis().set_visible(False)
      frame1.axes.get_yaxis().set_visible(False)
      

      或者,您可以将刻度设置为空列表:

      frame1.axes.get_xaxis().set_ticks([])
      frame1.axes.get_yaxis().set_ticks([])
      

      在第二个选项中,您仍然可以使用 plt.xlabel()plt.ylabel() 为坐标区添加标签。

      【讨论】:

      • 嘿 Ofri - 太好了,谢谢,但是现在(只是尴尬)如果我想添加一个 xlabel() 会发生什么?除了手动放置文本小部件。
      • 如何将此示例扩展到 3d? ax = plt.gca(projection='3d'), ax.axes.get_zaxis().set_visible(False) 给出'Axes3DSubplot' object has no attribute 'get_zaxis'
      • 这个答案不允许显示网格线。 @saullo castro 的答案确实......
      • 问题是当 x_axis 设置为不可见时,网格 dsappears :( 编辑:刚刚看到@Saullo Castro 的回答解决了这个问题。
      • @user989762 在您的情况下,此方法行不通,甚至get_xaxis().set_visible(False) 也行不通。我认为 matplotlib 在这种情况下会初始化一些参数,就好像绘图是 2D 一样。 ax.set_zticks([]) 会做你想做的事
      【解决方案7】:

      如果您只想隐藏保持网格线的轴文本:

      frame1 = plt.gca()
      frame1.axes.xaxis.set_ticklabels([])
      frame1.axes.yaxis.set_ticklabels([])
      

      执行set_visible(False)set_ticks([]) 也会隐藏网格线。

      【讨论】:

      • 这将删除共享该轴的 所有 个子图的标签:/
      【解决方案8】:

      如果你和我一样,在绘制图形时并不总是检索坐标轴ax,那么一个简单的解决方案就是这样做

      plt.xticks([])
      plt.yticks([])
      

      【讨论】:

        【解决方案9】:

        有点老线程但是,这似乎是使用最新版本的 matplotlib 更快的方法:

        设置 x 轴的主要格式化程序

        ax.xaxis.set_major_formatter(plt.NullFormatter())
        

        【讨论】:

        • 如果你只想做一次呢?
        • 是的,这仅对隐藏标签很有用,因为 .set_xticks([]) 也会自己删除刻度线。
        猜你喜欢
        • 2022-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多