所以我有两个列表,一个包含一堆年份,另一个包含一些整数,每个列表都有17个值。 当我制作一个简单的条形图
plt.bar(keys,values)
plt.show()
在图的X轴上,它仅包含键列表中的某些年份,例如:图仅具有2000、2002、2005、2007、2010、2012、2015。它错过了2001、2003、2006、2008、2009等。
是因为条形图中允许最大数量的键,所以它随机地获取了一些键吗?
如果没有,我该如何解决?
答案 0 :(得分:1)
在matplotlib轴上最大数量的刻度标签。但是,此限制远高于1000,创建图形时首先会遇到严重的滞后。
matplotlib通常自动打勾的是,轴配备了所需数量的标签。即如果您在地块上绘制50个点,那么您也不想拥有50个标签。此外,如果在0.853164处绘制点,则您不希望在轴上将此类奇数显示为刻度标签。
现在,我想不出任何原因matplotlib都会生成您报告的标签2000,2002,2005,2007,2010,2012,2015
,因为刻度线的自动定位器会选择轴上的等距点。对于有关此特定问题的任何帮助,将需要使用MCVE。
但是一般来说,您可以选择两个概念。
在绘制数字时,默认情况下,matplotlib将选择一个线性轴并如上所述自动对其打勾。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(2000, 2017)
y = np.random.randint(5,21, size=len(x))
plt.bar(x,y)
plt.show()
在这种情况下,选择等距的刻度为2.5个单位,以在轴上有7个间隔良好的刻度。相反,如果您希望每个条都被打勾,则可以使用自定义股票代码。
例如一个MultipleLocator
,间隔设置为1
,
import matplotlib.ticker as mticker
plt.gca().xaxis.set_major_locator(mticker.MultipleLocator(1))
plt.gca().tick_params(axis="x", rotation=90)
或者,将FixedLocator
的位置设置为小节的x值,
import matplotlib.ticker as mticker
plt.gca().xaxis.set_major_locator(mticker.FixedLocator(x))
plt.gca().tick_params(axis="x", rotation=90)
您也可以决定xaxis是分类的。这意味着每个唯一值都有自己的刻度线,并且这些刻度线等距分布,而与它们的值无关。通过将数字转换为字符串最容易实现。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(2000, 2017)
y = np.random.randint(5,21, size=len(x))
cats = list(map(str, x))
plt.bar(cats,y)
plt.gca().tick_params(axis="x", rotation=90)
plt.show()
结果在视觉上与上面相同,但是这次,数字2000
不在位置2000
处,而是索引0
处,2001
在位置1
,依此类推。
答案 1 :(得分:1)
您可以通过以下方式显示所有刻度:
plt.xticks(np.arange(min(keys), max(keys)+1, 1.0), rotation=45)
示例:
keys = [2000, 2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016]
values = range(1,18)
import matplotlib.pyplot as plt
plt.bar(keys,values)
plt.xticks(np.arange(min(keys), max(keys)+1, 1.0), rotation=45)
plt.show()