Python MatplotLib 绘制 x 轴,第一个 x 轴值标记为 1(而不是 0)

Python MatplotLib plot x-axis with first x-axis value labeled as 1 (instead of 0)

我正在尝试使用 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)。

这个 solution 对我不起作用。我试图在图表的 x 轴上使用标签 [1,24] 而不是 [0,23]。如我所写,如果我使用 xlim=1 或 set_xlim=1 在 x 轴上从 1 开始,则第一个 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()

当我运行代码时,生成的图像如下图:

预计第一个 y 值将在 x=1 中显示,最后一个在 x=24 中显示。但是 Python 索引从 0 开始,所以,看起来代码是 'shifting' 值,从 x=2 开始(或者 python 自然索引中的 x=1)。

solution proposed here对我没有帮助,因为它不会显示第一个值(0)。我想要显示所有值,但标签必须以 1 开头并以 24 结尾。问题是 python 索引将以 0 开头并以 23 结尾。

如何在python中处理这个问题?

您可以通过使用 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()

结果图如下所示:

注意行中的变化

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

需要绘制从 1 到 24 的 x 轴刻度线。

# 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))

这将在整数上打勾。如果您 pan/zoom 超出这些限制或现在想要在不同的范围内绘图,这将使您的代码有意义。

如果您希望数据的 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 文档的相关 link:http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.plot

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

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()