无法在matplotlib子图中反转xticks

4

我使用matplotlib设计了一个子图。我正在尝试反转绘图的xticks。请参见以下示例代码-

import numpy as np
import matplotlib.pyplot as plt

# generate the data
n = 6
y = np.random.randint(low=0, high=10, size=n)
x = np.arange(n)

# generate the ticks and reverse it
xticks = range(n)
xticks.reverse()

# plot the data
plt.figure()
ax = plt.subplot(111)
ax.bar(x, y)
print xticks # prints [5, 4, 3, 2, 1, 0]
ax.set_xticks(xticks)
plt.show()

请查看下面生成的图表- enter image description here 请注意xticks。尽管使用了ax.set_xticks(xticks),但xticks没有改变。我是否漏掉了某个函数调用来重新渲染图表?
以下是系统信息-
matplotlib.__version__
'2.1.1'

matplotlib.__version__numpy__
'1.7.1'

python --version
Python 2.7.15rc1

请注意,我只想反转刻度,而不想翻转坐标轴。
3个回答

5

使用ax.set_xticks时,你当前正在指定与列表顺序无关的刻度位置。无论你传递[0, 1, 2, 3, 4, 5]还是[5, 4, 3, 2, 1, 0],都不会在刻度上产生差异。相反,你想要的是颠倒刻度标签,此时你应该使用set_xticklabels(xticks[::-1])。有两种方法可以实现:

方法一

使用plt.xticks,其中第一个参数指定刻度位置,第二个参数指定相应的刻度标签。具体来说,xticks将提供刻度位置,而xticks[::-1]将以颠倒顺序标记你的图形的刻度。

xticks = range(n)

# plot the data
plt.figure()
ax = plt.subplot(111)
ax.bar(x, y)

plt.xticks(xticks, xticks[::-1])

方法2:在需要使用set_xticklabels的地方使用ax,以便获得您想要的结果。

ax.set_xticks(xticks)
ax.set_xticklabels(xticks[::-1])

enter image description here


非常感谢您的解释!我意识到了我的错误。我喜欢Way 2 - ravi
@RaviJoshi:不用谢,很高兴能帮忙。然而第一种方法是直接的。 - Sheldore

2

使用:

# generate the data
n = 6
y = np.random.randint(low=0, high=10, size=n)
x = np.arange(n)

# generate the ticks and reverse it
xticks = range(n)
# xticks.reverse()

# plot the data
plt.figure()
ax = plt.subplot(111)
ax.bar(x, y)
# print xticks # prints [5, 4, 3, 2, 1, 0]
ax.set_xticklabels(xticks[::-1])          # <- Changed
plt.show()

out


谢谢!它可以工作,但是我不理解以下内容:将 range(n) 更改为 range(n + 1) - ravi
这里不需要n+1。range(6)会生成0、1、2、3、4、5。这就是OP所需的全部内容。range(7)将生成0、1、2、3、4、5、6。这里不需要6 - Sheldore
@Bazingaa 如果你这么说的话。 - meW
@meW:不是因为我这么说,而是因为只有6个条形图。所以你需要从0到5开始的索引,这些索引是由range(6)生成的。 - Sheldore
我同意。只是当我进行实验时,我没有收到最后一个带有n的标记,所以使用了n+1。无论如何,我也同意range(6),这很有道理。 - meW
这是因为随机数生成器有时不会返回特定值,因此在这种情况下该条形图中的柱子会缺失。 - Sheldore

2

您还可以反转轴的顺序 ax.set_xlim([5.5,-0.5])

import numpy as np
import matplotlib.pyplot as plt

n = 6
x = np.arange(n)
y = (x+1) **(1/2)

fig, axs = plt.subplots(1, 3, constrained_layout=True)
axs[0].bar(x, y)
axs[0].set_title('Original data')

axs[1].bar(x[::-1], y)
axs[1].set_xlim(5.5, -0.5)
axs[1].set_title('x index reversed\nand axis reversed')

axs[2].bar(x, y)
axs[2].set_xlim(5.5, -0.5)
axs[2].set_title('just axis reversed')

plt.show()

enter image description here


不确定为什么这个被投票否决了 - 这是正确的反转刻度顺序的方法,而不是更改所有标签。 - Jody Klymak

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