matplotlib轴中是否有最大数量的ticklabel?

时间:2018-07-31 10:45:24

标签: python-3.x matplotlib graph

所以我有两个列表,一个包含一堆年份,另一个包含一些整数,每个列表都有17个值。 当我制作一个简单的条形图

plt.bar(keys,values)
plt.show()

在图的X轴上,它仅包含键列表中的某些年份,例如:图仅具有2000、2002、2005、2007、2010、2012、2015。它错过了2001、2003、2006、2008、2009等。

是因为条形图中允许最大数量的键,所以它随机地获取了一些键吗?

如果没有,我该如何解决?

2 个答案:

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

enter image description here

在这种情况下,选择等距的刻度为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)

enter image description here

或者,将FixedLocator的位置设置为小节的x值,

import matplotlib.ticker as mticker
plt.gca().xaxis.set_major_locator(mticker.FixedLocator(x))
plt.gca().tick_params(axis="x", rotation=90)

enter image description here

分类轴

您也可以决定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,依此类推。

enter image description here

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

enter image description here