【问题标题】:reducing number of plot ticks减少绘图刻度数
【发布时间】:2011-10-04 16:43:26
【问题描述】:

我的图表上有太多的刻度,它们相互碰撞。

如何减少刻度数?

例如,我有蜱:

1E-6, 1E-5, 1E-4, ... 1E6, 1E7

而我只想要:

1E-5, 1E-3, ... 1E5, 1E7

我尝试过使用LogLocator,但我无法弄清楚这一点。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    轴对象有一个set_ticks() 函数。

    【讨论】:

    • 如果我事先知道我想要什么滴答声,这将起作用。我上面给出的例子只是一个例子。我不知道蜱是什么,我只知道我想要更少的蜱,即每隔一个。
    • 您可以先调用get_xticks()get_yticks() 获取坐标区对象,根据需要进行编辑,然后将列表传回set_ticks()
    • 我没有set_ticks(),但我有set_xticks()set_yticks()。这些是轴对象的属性,而不是轴。也许这在过去几年发生了变化。
    • 我不确定我是否应该这样做,有些人发现您的回答照原样有用,仅仅因为它对我来说不同并不意味着它适用于每个人。
    • 一个例子对使这个答案有用。
    【解决方案2】:

    或者,如果您想简单地设置刻度数,同时允许 matplotlib 定位它们(​​目前只有MaxNLocator),有pyplot.locator_params

    pyplot.locator_params(nbins=4)
    

    您可以在此方法中指定特定轴,如下所述,默认为两者:

    # To specify the number of ticks on both or any single axes
    pyplot.locator_params(axis='y', nbins=6)
    pyplot.locator_params(axis='x', nbins=10)
    

    【讨论】:

    • 这是一个很好的建议,同时能够指定pyplot.locator_params(axis = 'x', nbins = 4)(或axis = 'y')使得这个过程非常简单。谢谢@bgamari!
    • 使用对数刻度,这适用于 numticks 而不是 nbins
    • @bgamari,您能否像@meduz 指出的那样为对数图添加numticks 解决方案?
    • 这似乎没有将标签放置在应有的位置。例如,如果原来的刻度标签是[0, 1, ..., 99],现在一组nticks=10,那么新的稀疏标签将沿轴放置十倍的距离,即现在1将位于9所在的位置, 2 其中19 是...和9 其中99 是。
    • 在信任此方法之前检查您的结果。 @Vim 是正确的。刻度值将被错误地放置。
    【解决方案3】:

    当使用对数刻度时,可以使用以下命令修复主要刻度数

    import matplotlib.pyplot as plt
    
    ....
    
    plt.locator_params(numticks=12)
    plt.show()
    

    设置为numticks 的值决定了要显示的轴刻度数。

    感谢@bgamari 的帖子介绍了locator_params() 函数,但nticks 参数在使用对数刻度时会引发错误。

    【讨论】:

    • 问题和答案是针对以前的matplotlib,即1,你指的是2。
    【解决方案4】:

    如果有人仍然在搜索结果中看到此页面:

    fig, ax = plt.subplots()
    
    plt.plot(...)
    
    every_nth = 4
    for n, label in enumerate(ax.xaxis.get_ticklabels()):
        if n % every_nth != 0:
            label.set_visible(False)
    

    【讨论】:

    • 在我的熊猫和数字间隔的情况下,这按预期工作,而 locator_params(nbins) 和 plt.MaxNLocator 给出了一个奇怪的行为。
    • 这是整个页面上唯一对我有用的解决方案
    • 这适用于非数字 x 轴标签,这很有帮助
    【解决方案5】:

    以防有人仍然需要它,因为没有 这里真的对我有用,我想出了一个非常 保持外观的简单方法 在固定数字时“按原样”生成图 精确到 N 的刻度:

    import numpy as np
    import matplotlib.pyplot as plt
    
    f, ax = plt.subplots()
    ax.plot(range(100))
    
    ymin, ymax = ax.get_ylim()
    ax.set_yticks(np.round(np.linspace(ymin, ymax, N), 2))
    

    【讨论】:

    • 我不得不稍微修改最后一行以使其返回值作为 int 而不是 float:ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
    • @NickSettje 仍然和我一起漂浮!
    【解决方案6】:

    要解决刻度的自定义和外观问题,请参阅 matplotlib 网站上的 Tick Locators 指南

    ax.xaxis.set_major_locator(plt.MaxNLocator(3))

    将 x 轴上的总刻度数设置为 3,并将其均匀分布在整个轴上。

    还有一个nice tutorial about this

    【讨论】:

    • 只选择前 3 个日期时间索引。当从 pandas.DataFrame.plot ax = df.plot() 得到斧头时
    • @Mithril 抱歉,我不太明白您的评论。能详细点吗?
    • 如果我有一个日期时间索引为 [2019-01-01, ...2019-11-01] 的 df (pandas.DataFrame),请调用 ax = df.plot(),返回一个图形对象。 call ax.xaxis.set_major_locator(plt.MaxNLocator(3)) 只显示前 3 个索引 [2019-01-01, 2019-01-02, 2019-01-03]。
    • @Mithril, df.plot() 经常显示minor_locator,所以你可能想试试ax1.xaxis.set_minor_locator(plt.MaxNLocator(3))。还要记住将3 替换为您要显示的刻度数。对于 pandas 时间序列,我推荐 import matplotlib.dates as mdates 并运行 ax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))ax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
    • 由于我有很多数据点要绘制,pyplot 每个轴打印了很多 (>500) 滴答声。这大大减慢了绘图过程。通过使用set_major_locator(5) 减少厚度的数量,绘图过程会更快。
    【解决方案7】:

    @raphael 给出的解决方案简单明了,很有帮助。

    不过,显示的刻度标签将不是从原始分布中采样的值,而是来自np.linspace(ymin, ymax, N) 返回的数组的索引

    要显示与原始刻度标签均匀分布的 N 个值,请使用 set_yticklabels() 方法。这是 y 轴的 sn-p,带有整数标签:

    import numpy as np
    import matplotlib.pyplot as plt
    
    ax = plt.gca()
    
    ymin, ymax = ax.get_ylim()
    custom_ticks = np.linspace(ymin, ymax, N, dtype=int)
    ax.set_yticks(custom_ticks)
    ax.set_yticklabels(custom_ticks)
    

    【讨论】:

    • 感谢这个漂亮的调整!
    【解决方案8】:

    如果您需要每 N=3 个滴答声进行一次滴答:

    N = 3  # 1 tick every 3
    xticks_pos, xticks_labels = plt.xticks()  # get all axis ticks
    myticks = [j for i,j in enumerate(xticks_pos) if not i%N]  # index of selected ticks
    newlabels = [label for i,label in enumerate(xticks_labels) if not i%N]
    

    fig,ax = plt.subplots():

    N = 3  # 1 tick every 3
    xticks_pos = ax.get_xticks()
    xticks_labels = ax.get_xticklabels()
    myticks = [j for i,j in enumerate(xticks_pos) if not i%N]  # index of selected ticks
    newlabels = [label for i,label in enumerate(xticks_labels) if not i%N]
    

    (显然你可以用(i+offset)%N调整偏移量)。

    请注意,如果您愿意,您可以得到不均匀的刻度,例如myticks = [1, 3, 8].

    然后就可以使用了

    plt.gca().set_xticks(myticks)  # set new X axis ticks
    

    或者如果你也想替换标签

    plt.xticks(myticks, newlabels)  # set new X axis ticks and labels
    

    请注意,轴限制必须在轴刻度之后设置。

    最后,您可能希望只绘制任意组刻度:

    mylabels = ['03/2018', '09/2019', '10/2020']
    plt.draw()  # needed to populate xticks with actual labels
    xticks_pos, xticks_labels = plt.xticks()  # get all axis ticks
    myticks = [i for i,j in enumerate(b) if j.get_text() in mylabels]
    plt.xticks(myticks, mylabels)
    

    (假设 mylabels 已排序;如果不是,则对 myticks 进行排序并重新排序)。

    【讨论】:

    • 这是一个被低估的答案!谢谢
    【解决方案9】:

    xticks 函数使用范围函数自动迭代

    start_number = 0

    end_number = len(你拥有的数据)

    step_number = 从层到尾要跳过多少次

    旋转 = 90 度倾斜有助于长刻度

    plt.xticks(range(start_number,end_number,step_number),rotation=90)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 2014-03-09
      相关资源
      最近更新 更多