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