减少绘图滴答数

jlc*_*lin 137 python matplotlib

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

如何减少蜱的数量?

例如,我有蜱:

1E-6, 1E-5, 1E-4, ... 1E6, 1E7
Run Code Online (Sandbox Code Playgroud)

我只想要:

1E-5, 1E-3, ... 1E5, 1E7
Run Code Online (Sandbox Code Playgroud)

我已经尝试过了LogLocator,但是我还没弄清楚这一点.

bga*_*ari 242

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

pyplot.locator_params(nbins=4)
Run Code Online (Sandbox Code Playgroud)

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

# 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)
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的建议,也可以指定`pyplot.locator_params(axis ='x',nbins = 4)`(或`axis ='y'`)使这个过程非常简单.谢谢@bgamari! (26认同)
  • 这在以后的版本中不起作用. (12认同)
  • 使用对数比例,这与``numticks``而不是``nbins``一起使用 (7认同)
  • 这似乎没有将标签放置在应有的位置。例如,如果原始的刻度标签为“ [0,1,...,99]”,而现在设置为“ nticks = 10”,则新的稀疏标签将沿轴间隔十倍的距离放置,即现在,`1`将坐在`9`所在的位置,`2`将`19`在...的位置,而`9`将位于`99`的位置。 (4认同)
  • 更简单的解决方案 - 应该被标记为最佳. (3认同)
  • 在信任此方法之前检查您的结果。@Vim 是正确的。刻度值将被错误放置。 (2认同)
  • 我用这种方法得到了不正确的标签,但@Katerina 的工作符合预期。 (2认同)

Kat*_*ova 28

如果有人仍在搜索结果中显示此页面:

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)
Run Code Online (Sandbox Code Playgroud)

  • 在我使用 pandas 和数字间隔的情况下,这按预期工作,而 locator_params(nbins) 和 plt.MaxNLocator 给出了奇怪的行为。 (6认同)
  • 这实际上对所有其他没有做任何事情的答案都有效.谢谢 :) (3认同)
  • 这适用于非数字 x 轴标签,这很有帮助 (3认同)

And*_*ron 21

set_ticks()轴对象有一个功能.

  • 您可以先为轴对象调用`get_xticks()`或`get_yticks()`,根据需要进行编辑,然后将列表传回`set_ticks()`. (10认同)
  • 如果我事先知道我想要的蜱虫,这将有效.我上面给出的例子只是一个例子.我不知道蜱是什么,我只知道我想要的更少,即每隔一个蜱. (4认同)
  • 我没有`set_ticks()`,但我确实有`set_xticks()`和`set_yticks()`.这些是轴对象的属性,而不是轴.也许这在过去几年中发生了变化. (4认同)
  • 一个例子将大大有助于使这个答案有用。 (4认同)
  • 我不确定我是否应该,有些人发现你的答案很有用,只是因为它对我不同并不意味着它适合所有人. (2认同)

Pra*_*ssa 12

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

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

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

还有一个很好的教程

  • @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) '))` (2认同)

Ski*_*rou 6

如果您需要每 N=3 个刻度\xc2\xa0 一个刻度:

\n
N = 3  # 1 tick every 3\nxticks_pos, xticks_labels = plt.xticks()  # get all axis ticks\nmyticks = [j for i,j in enumerate(xticks_pos) if not i%N]  # index of selected ticks\nnewlabels = [label for i,label in enumerate(xticks_labels) if not i%N]\n
Run Code Online (Sandbox Code Playgroud)\n

或使用fig,ax = plt.subplots()\xe2\x80\xaf:

\n
N = 3  # 1 tick every 3\nxticks_pos = ax.get_xticks()\nxticks_labels = ax.get_xticklabels()\nmyticks = [j for i,j in enumerate(xticks_pos) if not i%N]  # index of selected ticks\nnewlabels = [label for i,label in enumerate(xticks_labels) if not i%N]\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

然后你可以使用

\n
plt.gca().set_xticks(myticks)  # set new X axis ticks\n
Run Code Online (Sandbox Code Playgroud)\n

或者如果您也想更换标签

\n
plt.xticks(myticks, newlabels)  # set new X axis ticks and labels\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

最后,您可能希望仅绘制任意一组刻度\xc2\xa0:

\n
mylabels = ['03/2018', '09/2019', '10/2020']\nplt.draw()  # needed to populate xticks with actual labels\nxticks_pos, xticks_labels = plt.xticks()  # get all axis ticks\nmyticks = [i for i,j in enumerate(xticks_labels) if j.get_text() in mylabels]\nplt.xticks(myticks, mylabels)\n
Run Code Online (Sandbox Code Playgroud)\n

(假设mylabels是有序的\xc2\xa0;如果不是,则排序myticks并重新排序)。

\n


rap*_*ael 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))
Run Code Online (Sandbox Code Playgroud)

  • 我不得不稍微修改最后一行,以使其将值返回为 int 而不是 float:`ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)` (2认同)

小智 5

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

尽管如此,显示的刻度标签不会是从原始分布中采样的值,而是从返回的数组索引中采样的值np.linspace(ymin, ymax, N)

要显示与原始刻度标签等距的 N 个值,请使用该set_yticklabels()方法。这是 y 轴的片段,带有整数标签:

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)
Run Code Online (Sandbox Code Playgroud)