关于python:在matplotlib图中隐藏轴文本

Hiding axis text in matplotlib plots

我试图在任意一个轴上绘制一个没有记号或数字的图形(我使用传统意义上的轴,而不是matplotlib术语!)我遇到的一个问题是matplotlib通过减去一个值n来调整x(y)标记标签,然后在轴的末尾加上n。

这可能是模糊的,但下面的简化示例强调了这个问题,其中"6.18"是n的违规值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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()

我想知道的三件事是:

  • 如何首先关闭这种行为(尽管在大多数情况下它是有用的,但并不总是如此!)我查过matplotlib.axis.XAxis,找不到合适的东西。

  • 如何使n消失(即X.set_visible(False))

  • 有没有更好的方法来完成以上的工作?如果相关的话,我的最后一个图是4x4子图。


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

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

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

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

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


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

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

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


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

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


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

    设置X轴的主要格式设置工具

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


    实际上,我无法基于这里的任何代码片段(甚至是在回答时接受的代码片段)呈现没有边框或轴数据的图像。在浏览了一些API文档之后,我找到了这个代码来呈现我的图像。

    1
    2
    3
    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调用基本上关闭了可能呈现的任何额外信息,并且在输出文件中有一个完美的图形。


    我把这个数字用彩色编码来简化这个过程。

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

    enter image description here

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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)


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

    假设你用

    1
    2
    fig, ax = plt.subplots(1)
    ax.plot(x, y)

    如果只想删除勾号标签,可以使用

    1
    ax.set_xticklabels([])

    或者,要完全删除勾号,可以使用

    1
    ax.set_xticks([])

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


    一个技巧是将勾号标签的颜色设置为白色以隐藏它!

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