减少绘图刻度数
- 2025-02-24 09:29:00
- admin 原创
- 55
问题描述:
我的图表上有太多刻度,它们互相冲突了。
我怎样才能减少滴答声的数量?
例如,我有勾号:
1E-6, 1E-5, 1E-4, ... 1E6, 1E7
我只想要:
1E-5, 1E-3, ... 1E5, 1E7
我曾尝试玩LogLocator
,但我还没能弄清楚。
解决方案 1:
或者,如果您只想设置刻度数,同时允许 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)
解决方案 2:
要解决刻度的定制和外观问题,请参阅matplotlib 网站上的刻度定位器指南
ax.xaxis.set_major_locator(plt.MaxNLocator(3))
会将 x 轴上的总刻度数设置为 3,并将它们均匀分布在轴上。
关于这一点还有一个不错的教程
解决方案 3:
如果有人仍然在搜索结果中看到此页面:
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)
解决方案 4:
有一个set_ticks()
针对轴对象的函数。
解决方案 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))
解决方案 6:
@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)
解决方案 7:
如果每 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(xticks_labels) if j.get_text() in mylabels]
plt.xticks(myticks, mylabels)
(假设mylabels
是有序的;如果不是,则对其进行排序myticks
并重新排序)。
解决方案 8:
xticks 函数使用范围函数自动迭代
起始编号 = 0
end_number = len(您拥有的数据)
step_number = 从起始到结束要跳过多少次
旋转 = 90 度倾斜将有助于长刻度
plt.xticks(range(start_number,end_number,step_number),rotation=90)
解决方案 9:
如果你想要 10 个刻度:
对于 y 轴:ax.set_yticks(ax.get_yticks()[::len(ax.get_yticks())//10])
对于 x 轴:ax.set_xticks(ax.get_xticks()[::len(ax.get_xticks())//10])
这只是获取您的刻度并选择列表的每个 10 个刻度并将其设置回您的刻度。您可以根据需要更改刻度数。
解决方案 10:
当使用对数刻度时,可以使用以下命令修复主刻度数
import matplotlib.pyplot as plt
....
plt.locator_params(numticks=12)
plt.show()
设置的值numticks
决定要显示的轴刻度数。
感谢@bgamari 的帖子介绍该locator_params()
函数,但当nticks
使用对数刻度时,该参数会引发错误。
扫码咨询,免费领取项目管理大礼包!