【问题标题】:Is there a maximum amount of ticklabels in a matplotlib axes?matplotlib 轴中是否有最大数量的刻度标签?
【发布时间】:2019-01-07 17:47:21
【问题描述】:

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

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

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

是不是因为条形图中允许的键数量上限所以随机取了一些键?

如果不是,我该如何解决?

【问题讨论】:

    标签: python-3.x matplotlib graph


    【解决方案1】:

    matplotlib 轴上有最大数量的刻度标签。但是,此限制远高于 1000,您在创建图形时首先会遇到严重滞后。

    matplotlib 通常的自动标记是轴配备了所需数量的标签。 IE。如果您在绘图上绘制 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,而是在它的索引020011等等。

    【讨论】:

    • 感谢您的两个回答对我帮助很大
    • 如果给出的任何答案都能解决您的问题,请参阅someone answers 了解您接下来可以做什么。你也可以重新审视你的老问题。
    【解决方案2】:

    你可以用这种方式显示所有的刻度:

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

    【讨论】:

      猜你喜欢
      • 2012-03-14
      • 2012-12-19
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 2020-03-29
      • 2016-10-09
      • 2014-11-26
      • 2021-06-14
      相关资源
      最近更新 更多