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)
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)
And*_*ron 21
set_ticks()
轴对象有一个功能.
Pra*_*ssa 12
要解决刻度的自定义和外观问题,请参阅matplotlib网站上的“刻度定位器”指南
ax.xaxis.set_major_locator(plt.MaxNLocator(3))
将x轴上的刻度总数设置为3,并将其在整个轴上均匀分布。
还有一个很好的教程
如果您需要每 N=3 个刻度\xc2\xa0 一个刻度:
\nN = 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 = 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
)。
请注意,如果您愿意,您可以获得不均匀的刻度,例如myticks = [1, 3, 8]
。
然后你可以使用
\nplt.gca().set_xticks(myticks) # set new X axis ticks\n
Run Code Online (Sandbox Code Playgroud)\n或者如果您也想更换标签
\nplt.xticks(myticks, newlabels) # set new X axis ticks and labels\n
Run Code Online (Sandbox Code Playgroud)\n请注意,必须在轴刻度之后设置轴限制。
\n最后,您可能希望仅绘制任意一组刻度\xc2\xa0:
\nmylabels = ['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:
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)
小智 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)