减少地块刻度


160

我的图表上有太多刻度线,它们彼此碰到。

如何减少刻度线的数量?

例如,我有勾号:

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

我只想要:

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

我曾经尝试过使用LogLocator,但是还无法弄清楚。

Answers:


266

另外,如果您想简单地设置刻度线的数量,同时允许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)

27
这是一个很好的建议,也可以指定pyplot.locator_params(axis = 'x', nbins = 4)(或axis = 'y')使该过程非常简单。谢谢@bgamari!
benjaminmgross 2012年

8
使用对数刻度,numticks而不是nbins
meduz '16

1
@bgamari,能否请您添加numticks@meduz指出的对数图解?
Løiten

7
这似乎没有将标签放置在应有的位置。例如,如果原始刻度线标签为,[0, 1, ..., 99]而现在为set nticks=10,那么新的稀疏标签将沿轴间隔十倍,即现在1将位于原处9,原219...和原999
Vim

2
信任此方法之前,请检查结果。@Vim是正确的。刻度值将放置不正确。
David J.

53

如果仍然有人在搜索结果中获得此页面:

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)

7
实际上,这与所有其他答案无济于事。谢谢:)
faizan

做得好。我花了一段时间才找到了它,但它确实做了我想要的。
约翰

谢谢您,这可以确保剩余的标签正确放置。可以改善此答案的另一个步骤是也删除刻度线。
David J.

一个简单的好答案-令SO社区不知道自定义方法的惊讶。这将是对lib的宝贵补充吗?
jabberwocky

32

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

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

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

还有一个很好的教程


仅选择前3个日期时间索引。当从pandas.DataFrame.plot获得斧头时 ax = df.plot()
秘银

@Mithril对不起,我不太理解您的评论。您能详细说明一下吗?
Prageeth Jayathissa

如果我具有pandas.DataFrame日期时间索引为[2019-01-01,... 2019-11-01] 的df(),请调用 ax = df.plot(),返回一个Figure对象。通话ax.xaxis.set_major_locator(plt.MaxNLocator(3)) 仅显示前3个索引[2019-01-01,2019-01-02,2019-01-03]。
秘银

1
@Mithril df.plot()通常显示minor_locator,因此您可能需要尝试ax1.xaxis.set_minor_locator(plt.MaxNLocator(3))。还请记住用代替3要显示的刻度数。对于大熊猫时间序列,我推荐 import matplotlib.dates as mdatesax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))使用ax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
Prageeth Jayathissa,

20

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


4
如果我事先知道我想要什么滴答声,这将起作用。我在上面给出的示例只是一个示例。我不知道the是什么,我只知道我要少一些,即每隔一个。
jlconlin 2011年

10
您可以调用get_xticks()get_yticks()首先调用axis对象,根据需要进行编辑,然后将列表传递回set_ticks()
user812786 2011年

4
我没有set_ticks(),但是我有set_xticks()set_yticks()。这些是轴对象而不是轴的属性。也许这在最近几年已经改变了。
Gauthier 2013年

2
我不确定是否应该,有些人发现您的答案仍然有用,仅仅因为它对我而言并不相同,并不意味着它对每个人都适用。
Gauthier

1
一个例子将大大有助于使这个答案有用。
理查德

10

万一有人仍然需要它,并且因为这里没有任何东西真正适合我,我想出了一种非常简单的方法,可以将生成的图的外观保持“原样”,同时将刻度数固定为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))

2
我不得不稍微修改最后一行,以使它以int而不是float的形式返回值:ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
Nick Settje

@NickSettje仍然和我一起漂浮!
Mohd

4

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

对于这个不错的调整感到很荣幸!
Mohd

2

使用对数刻度时,可以使用以下命令固定主要刻度数

import matplotlib.pyplot as plt

....

plt.locator_params(numticks=12)
plt.show()

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

@bgamari的帖子中介绍了该locator_params()功能,但是使用对nticks数刻度时,该参数会引发错误。


这个问题和答案是以前matplotlib,即1,和你指的是2
的Dawid Laszuk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.