【发布时间】:2011-10-04 16:43:26
【问题描述】:
我的图表上有太多的刻度,它们相互碰撞。
如何减少刻度数?
例如,我有蜱:
1E-6, 1E-5, 1E-4, ... 1E6, 1E7
而我只想要:
1E-5, 1E-3, ... 1E5, 1E7
我尝试过使用LogLocator,但我无法弄清楚这一点。
【问题讨论】:
标签: python matplotlib
我的图表上有太多的刻度,它们相互碰撞。
如何减少刻度数?
例如,我有蜱:
1E-6, 1E-5, 1E-4, ... 1E6, 1E7
而我只想要:
1E-5, 1E-3, ... 1E5, 1E7
我尝试过使用LogLocator,但我无法弄清楚这一点。
【问题讨论】:
标签: python matplotlib
轴对象有一个set_ticks() 函数。
【讨论】:
get_xticks() 或get_yticks() 获取坐标区对象,根据需要进行编辑,然后将列表传回set_ticks()。
set_ticks(),但我有set_xticks() 和set_yticks()。这些是轴对象的属性,而不是轴。也许这在过去几年发生了变化。
或者,如果您想简单地设置刻度数,同时允许 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
numticks 解决方案?
[0, 1, ..., 99],现在一组nticks=10,那么新的稀疏标签将沿轴放置十倍的距离,即现在1将位于9所在的位置, 2 其中19 是...和9 其中99 是。
当使用对数刻度时,可以使用以下命令修复主要刻度数
import matplotlib.pyplot as plt
....
plt.locator_params(numticks=12)
plt.show()
设置为numticks 的值决定了要显示的轴刻度数。
感谢@bgamari 的帖子介绍了locator_params() 函数,但nticks 参数在使用对数刻度时会引发错误。
【讨论】:
如果有人仍然在搜索结果中看到此页面:
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)
【讨论】:
以防有人仍然需要它,因为没有 这里真的对我有用,我想出了一个非常 保持外观的简单方法 在固定数字时“按原样”生成图 精确到 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))
【讨论】:
ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
要解决刻度的自定义和外观问题,请参阅 matplotlib 网站上的 Tick Locators 指南
ax.xaxis.set_major_locator(plt.MaxNLocator(3))
将 x 轴上的总刻度数设置为 3,并将其均匀分布在整个轴上。
【讨论】:
ax = df.plot() 得到斧头时
pandas.DataFrame),请调用 ax = df.plot(),返回一个图形对象。 call ax.xaxis.set_major_locator(plt.MaxNLocator(3)) 只显示前 3 个索引 [2019-01-01, 2019-01-02, 2019-01-03]。
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'))
set_major_locator(5) 减少厚度的数量,绘图过程会更快。
@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)
【讨论】:
如果您需要每 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 进行排序并重新排序)。
【讨论】:
xticks 函数使用范围函数自动迭代
start_number = 0
end_number = len(你拥有的数据)
step_number = 从层到尾要跳过多少次
旋转 = 90 度倾斜有助于长刻度
plt.xticks(range(start_number,end_number,step_number),rotation=90)
【讨论】: