【问题标题】:Python MatplotLib plot x-axis with first x-axis value labeled as 1 (instead of 0)Python MatplotLib 绘制 x 轴,第一个 x 轴值标记为 1(而不是 0)
【发布时间】:2015-04-02 00:39:21
【问题描述】:

我正在尝试使用 python 和 matplotlib 绘制一个向量。

我的问题是,在 matplotlib.pyplot 中,我的数据的 x 轴从 0 开始,到 23 结束。并且在图中也考虑了这一点。

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

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

这个solution 不适合我。我试图在图表的 x 轴上使用标签 [1,24] 而不是 [0,23]。正如我所写的,如果我在 x 轴上使用 xlim=1 或 set_xlim=1 从 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 中,最后一个 y 值将显示在 x=24 中。但是 Python 索引从 0 开始,因此,看起来代码正在“移动”值,从 x=2(或 python 自然索引中的 x=1)开始。

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

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

【问题讨论】:

  • @tcaswell 在我的另一篇文章中写道,这是我的选择之一。抱歉,如果这给您带来了困扰。
  • 谁建议删除和重新发布?请不要再这样做了。
  • @tcaswell 它是在重复警告后写在我的帖子上的。也许我没有按我应该的方式理解它。
  • 对不起@tcaswell,我只是想把垃圾从 SO 中拿出来 :-)

标签: python python-2.7 matplotlib plot


【解决方案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')
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 的回答可能比我的更 Pythonic:dim = np.arange(1, len(a)+1)pp.plot(dim, a, ...)pp.xticks(dim)
【解决方案2】:
# 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))

这将在整数上打勾。如果您在这些限制之外平移/缩小或者现在想要在不同的范围内绘图,这将使您的代码有意义。

【讨论】:

  • pyplot 的行为比 ggplot 更糟糕,也更不干净。
  • @tcaswell 当维数较高并且我想在不同的间隔中绘制 x 的值时,此解决方案是否有效?例如,如果我的向量 a 有更多维度(例如,96)并且我想做 dim = np.arange(1,97,3) 在 3 个值之后在图表中显示 x 值,当我绘制图表时,错误显示了 dim 和 a 必须具有相同的尺寸。如何使用您建议的解决方案来处理这个问题?
  • @tcaswell set_xticks 解决了我上一篇文章的问题。正确的函数是我的python(2.7)上的matplotlib.ticker.MultipleLocator(1)。谢谢您,给您带来的不便深表歉意。
【解决方案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()

结果图如下:

注意这一行的变化

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

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

【讨论】:

  • 这正是我想要的。谢谢。
  • 这是不必要的复杂并且对您的数据做相当可怕的事情以避免使用设计为使用的api。
【解决方案4】:

如果您希望数据的 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的维度不匹配,即24。那么这个答案是一样的来自@tacaswell(虽然这个看起来不那么复杂):)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2018-08-31
相关资源
最近更新 更多