使用Python Matplotlib绘制x轴,使第一个x轴值标记为1而不是0

16

我正在尝试使用Python和Matplotlib绘制向量。

我的问题是,在Matplotlib.pyplot中,我的数据的x轴从0开始,到23结束。在图表中也是如此。

我想要的是这个轴以标签1开始(它与第一个y值有关,或自然Python索引中的值#0),并以24结束(与最后一个y值有关,或自然Python索引中的值#23)。

我尝试了pp.xlim(xmin=1),但问题是,这样,第一维度(0)消失在图表中,上限仍然是23。我希望它是24,而第一个y值的x值标记为1(而不是0)。

这个解决方案对我不起作用。我想在图表的x轴上使用标签[1,24],而不是[0,23]。正如我所写的,如果我使用xlim=1或set_xlim=1从x轴开始,第一个y值(向量的维度0)就不会在图表中显示。它从第二个y值(向量的维度1)开始,并以最后一个值结束。我不想要这个。这里是我正在使用的源代码。

import matplotlib.pyplot as pp
import numpy as np

a=np.array( [0.10478151, 0.09909564, 0.01319826, 0.00743225, 0.00483721, 0.18202419, 0.01732046, 0.04153536, 0.03317991, 0.0536289, 0.00585423, 0.00929871, 0.00629363, 0.12180654, 0.00607781, 0.03752038, 0.05547452, 0.01459015, 0.00604909, 0.01132442, 0.00710363, 0.11159429, 0.0079922, 0.04198672])

pp.xlabel('Dimension') 
pp.ylabel('Importance')
ax=pp.subplot(111)
ax.set_xlim(1, 24)
dim=np.arange(1,24,1);
ax.plot(a, 'ro', color='r',linewidth=1.0, label="Graph2")
pp.xticks(dim)
pp.grid()   
pp.show()    
pp.close()

当我运行代码时,得到的图像如下所示:

enter image description here

预期第一个y值将显示在x=1处,最后一个将显示在x=24处。但是Python索引从0开始,因此代码似乎正在“移位”值,从x=2开始(或在Python自然索引中从x=1开始)。

这里提出的解决方案对我没有帮助,因为它不会显示第一个值(0)。我想要显示所有的值,但标签必须以1开头,以24结尾。问题在于Python索引从0开始到23结束。

如何在Python中解决这个问题?


@tcaswell,这是我的另一篇帖子中写的选项之一。如果这让您不舒服,我很抱歉。 - mad
1
谁建议删除并重新发布的?请不要再这样做。 - tacaswell
@tcaswell 在我收到重复警告后写在我的帖子上。也许我没有理解它的方式。 - mad
抱歉 @tcaswell,我只是想清理一下 SO 上的垃圾 :-) - mad
5个回答

24

我知道这是一个非常老的问题,但我找到了一个非常简单的解决方案:

import matplotlib.pyplot as pp
import numpy as np

a=np.array( [0.10478151, 0.09909564, 0.01319826, 0.00743225, 0.00483721, 0.18202419, 0.01732046, 0.04153536, 0.03317991, 0.0536289, 0.00585423, 0.00929871, 0.00629363, 0.12180654, 0.00607781, 0.03752038, 0.05547452, 0.01459015, 0.00604909, 0.01132442, 0.00710363, 0.11159429, 0.0079922, 0.04198672])

pp.xlabel('Dimension') 
pp.ylabel('Importance')
pp.plot(a, 'ro', color='r',linewidth=1.0, label="Graph2")

# just the following line will do it
pp.xticks(np.arange(len(a)), np.arange(1, len(a)+1))

pp.grid()   
pp.show()    
pp.close()


由于我现在更熟悉Python,所以我想提一下@tacaswell的答案可能比我的更具有Python特色:dim = np.arange(1, len(a)+1)pp.plot(dim, a, ...)pp.xticks(dim) - Isi

10
# boiler plate imports
import numpy as np
import matplotlib.pyplot as plt

# make your axes 
fig, ax = plt.subplots(1, 1)
# set the x and y labels
ax.set_xlabel('Dimension') 
ax.set_ylabel('Importance')
# set the xlim
ax.set_xlim(1, 24)
# get your locations
dim = np.arange(1,25,1);
# plot dim vs a
ax.plot(dim, a, 'ro', color='r',linewidth=1.0, label="Graph2")
# set the locations of the xticks to be on the integers
ax.set_xticks(dim)
# turn the grid on
ax.grid()   
# call show for good measure (to make sure the graph shows up)
plt.show()

通常使用set_xticks是个不好的选择,最好改为

ax.xaxis.set_major_locator(matplotlib.ticker.MultipleLocater(1))

这将在整数上打上勾号。如果你平移/缩放超出这些限制,或者现在想在不同的范围内绘图,这将使您的代码变得更加清晰易懂。

输入图像描述


2
pyplot的行为比ggplot更加粗糙和不干净。 - smci
@tcaswell 这个解决方案适用于维度更高且我想在不同区间内绘制x值的情况吗?例如,如果我的向量a具有更多维度(例如96),并且我想要进行dim = np.arange(1,97,3)以在每3个值后在图表中显示x值,则绘制图表时会显示dim和a必须具有相同维度的错误。如何使用您建议的解决方案来处理这个问题? - mad
@tcaswell解决了我上一篇帖子的问题,正确的函数是matplotlib.ticker.MultipleLocator(1),适用于我的Python(2.7)。谢谢你,对不便表示抱歉。 - mad

3
您可以使用 numpy.roll 来将您原始数组中想要的值移动到索引 1 到 23 上,然后将原始数组的最后一个元素附加到索引 24 上,以获得您想要的结果。
代码如下:
import matplotlib.pyplot as pp
import numpy as np

a=np.array( [0.10478151, 0.09909564, 0.01319826, 0.00743225, 0.00483721, 0.18202419, 0.01732046, 0.04153536, 0.03317991, 0.0536289, 0.00585423, 0.00929871, 0.00629363, 0.12180654, 0.00607781, 0.03752038, 0.05547452, 0.01459015, 0.00604909, 0.01132442, 0.00710363, 0.11159429, 0.0079922, 0.04198672])

pp.xlabel('Dimension') 
pp.ylabel('Importance')
ax=pp.subplot(111)
ax.set_xlim(1, 24)
dim=np.arange(1,25,1)
ax.plot(np.append(np.roll(a,1),a[23]), 'ro', color='r',linewidth=1.0, label="Graph2")
pp.xticks(dim)
pp.grid()   
pp.show()    
pp.close()

生成的图表如下:

enter image description here

请注意线条的变化。

更改

dim=np.arange(1,25,1)

是为了将x轴刻度标记从1到24进行绘制。


这正是我正在寻找的。谢谢你。 - mad
8
这太过复杂了,对你的数据进行了可怕的操作,只是为了避免按照API设计的方式使用它。 - tacaswell
这不应该是被接受的答案... - Isi

2
如果你想要数据的X轴数值不是默认的0到n-1,你可以将这些X轴数值作为绘图函数调用的第一个参数传递进去。因此,你的示例现在应该是这样的:
import matplotlib.pyplot as pp
import numpy as np

a = np.array([0.10478151, 0.09909564, 0.01319826, 0.00743225, 0.00483721, 0.18202419, 0.01732046, 0.04153536, 0.03317991, 0.0536289, 0.00585423, 0.00929871, 0.00629363, 0.12180654, 0.00607781, 0.03752038, 0.05547452, 0.01459015, 0.00604909, 0.01132442, 0.00710363, 0.11159429, 0.0079922, 0.04198672])

pp.xlabel('Dimension') 
pp.ylabel('Importance')

ax = pp.subplot(111)
ax.set_xlim(1, 24)
dim = np.arange(1, 25)  # Range up to but excluding value of second argument
# --> Note the first arguments to the plot() function below <--
ax.plot(dim, a, 'ro', color='r', linewidth=1.0, label="Graph2")
pp.xticks(dim)
pp.grid()

pp.show()
pp.close()

这是与matplotlib文档相关的链接:http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.plot

我认为应该是dim = np.arange(1, 25),否则数组仅包含23个值且维度不匹配a的维度,而a的维度为24。那么这个答案与@tacaswell的答案相同(尽管这一个看起来不太复杂) :) - Isi

2
 plt.xticks(range(len("YOUR LIST, DATAFRAME OR ETC.")+1)
            ,labels=range(1, len(YOUR LIST, DATAFRAME OR ETC.)+2))

只需使用这个


为了一行代码而不引入整个numpy库,真是太好了。 - duanev

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