如何调整字符串X轴的“刻度频率”

18

我有一个清单要绘制。有没有一种方法可以显示x轴标签的一部分,例如x[0],x[10],...,但保持图形不变?

x = ['alice', 'bob', ...] # string list, len > 100
y = [23, 323, ...] # int list
plt.plot(x, y)
plt.show()

旋转90度后的图片

编辑1:有一些类似于如何在matplotlib中更改x或y轴上的“刻度频率”?的其他问题,涉及整数标签。但对我没有用。

编辑2:旋转x轴标签无济于事。

3个回答

18

您可以通过减少x轴上的刻度数量来实现此目的。您可以使用ax.set_xticks()设置刻度。在此处,您可以使用切片符号[::2]x列表切片,在每个第二个条目处设置刻度。然后,使用相同的切片在设置刻度时使用ax.set_xticklabels()设置x刻度标签。

例如:

x = ["Ant", "Bob", "Crab", "Donkey", "Elephant", "Fire", "Giant","Hello",
     "Igloo", "Jump", "Kellogg","Llama", "More", "Night"]
y = np.random.randint(0,10,14)

fig, (ax1, ax2) = plt.subplots(1,2, figsize=(9,5))
ax1.plot(x,y)
ax1.set_title("Crowded x axis")

ax2.plot(x,y)
ax2.set_xticks(x[::2])
ax2.set_xticklabels(x[::2], rotation=45)
ax2.set_title("Every 2nd ticks on x axis")

plt.show()

在这里输入图片描述


哇,太棒了。但是有一个问题,在x-radis中它显示的是Ant、Bob和Crab(x[0]、x[1]、x[2])。它应该显示Ant、Donkey和Gaint(x[0]、x[3]、x[6])吗? - Joe Lu
@JoeLu 我已经更新了答案(我不得不设置刻度和刻度标签)。看看是否有帮助? - DavidG

10

如果我理解正确,您提到要减少显示的刻度数。根据您的绘图方式,有多种方法可以实现此目的,例如:

示例代码:

import matplotlib.pyplot as plt
import numpy as np

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
    14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
    25, 26, 27, 28, 29, 30, 31, 32]

y = [1, 4, 9, 6, 2, 4, 5, 6, 7, 2, 1, 
     4, 6, 5, 2, 3, 1, 4, 9, 6, 2, 4, 
     5, 6, 7, 2, 1, 4, 6, 5, 2, 3]

labels = ["Ant", "Bob", "Crab", "Donkey", "Elephant", "Fire", "Giant","Hello",
          "Igloo", "Jump", "Bull","Even", "More", "Words", "other", "Bazboo", 
          "Ant", "Bob", "Crab", "Donkey", "Hippo", "Fire", "Giant","Hello",
          "Igloo", "Hump", "Kellogg","Even", "More", "Words", "Piano", "Foobar"]

plt.xticks(x, labels[::2], rotation='vertical')
plt.locator_params(axis='x', nbins=len(x)/2)
plt.plot(x, y, 'g-', color='red')
plt.tight_layout(pad=4)
plt.subplots_adjust(bottom=0.15)
plt.show()

使用plt.locator_params和列表的长度,可以将其分成一半,例如:

plt.xticks(x, labels[::2], rotation='vertical') # set divisor
plt.locator_params(axis='x', nbins=len(x)/2)  # set divisor 

这应该显示出一半的刻度数(x / 2),同时保持你的图表均匀。由于长度(len)从列表中获取,因此它适用于字符串和整数的x

plot 1

plt.xticks(x, labels, rotation='vertical')
plt.locator_params(axis='x', nbins=len(x))

plot 2

如果您想要更紧密的间距,请不使用除数或相应地进行调整。


@JoeLu:我不确定我理解你的意思。我回答的函数将获取你的列表 ["alice", "bob", ...] 并将其截断,使它只有两个字符。我以为这就是你想做的事情。 - l'L'l
@I'L'I 我的意思是我不想让我的x标签被截断。您可以查看我的更新问题。即使我将x标签旋转90度,它仍然看起来不舒服。 - Joe Lu
@JoeLu:不应该出现这种情况,我认为你可能把它和其他答案混淆了。这种方法将均匀分配刻度,因此您不会遇到该问题。 - l'L'l
@I'L'I 没有,我已经尝试过了,看起来跟我说的差不多。 - Joe Lu
@I'L'I 我已经尝试了你说的所有方法,但实际上都没有起作用。你应该自己尝试一下并发布结果。 - Joe Lu
显示剩余2条评论

2
如果x轴过于拥挤,我建议您使用另一种解决方案:您可以使用plt.xticks(rotation=45)旋转x值。

enter image description here


1
好的建议,因为它是针对pyplot的,我也可以建议加上rotation='vertical'。+1 - l'L'l
@AlessandroPeca,我刚刚更新了我的问题,它不是很好。 - Joe Lu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接