在matplotlib中更改x或y轴上的“打勾频率”?
我正试图修复python如何绘制我的数据。
说
x = [0,5,9,10,15]
和
y = [0,1,2,3,4]
然后我会做:
matplotlib.pyplot.plot(x,y) matplotlib.pyplot.show()
和x轴的刻度以5为间隔绘制。有没有办法让它显示1的间隔?
你可以明确地设置你想用plt.xticks
来标记的plt.xticks
:
plt.xticks(np.arange(min(x), max(x)+1, 1.0))
例如,
import numpy as np import matplotlib.pyplot as plt x = [0,5,9,10,15] y = [0,1,2,3,4] plt.plot(x,y) plt.xticks(np.arange(min(x), max(x)+1, 1.0)) plt.show()
(使用np.arange
而不是Python的range
函数,以防min(x)
和max(x)
是float而不是ints。)
plt.plot
(或ax.plot
)函数将自动设置默认的x
和y
限制。 如果你想保持这些限制,只是改变勾号的步长,那么你可以使用ax.get_xlim()
来发现Matplotlib已经设置的限制。
start, end = ax.get_xlim() ax.xaxis.set_ticks(np.arange(start, end, stepsize))
默认的刻度盘格式化程序应该做一个体面的工作,将刻度值四舍五入到合理的有效位数。 但是,如果您希望对格式有更多的控制,则可以定义自己的格式化程序。 例如,
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))
这是一个可运行的例子:
import numpy as np import matplotlib.pyplot as plt import matplotlib.ticker as ticker x = [0,5,9,10,15] y = [0,1,2,3,4] fig, ax = plt.subplots() ax.plot(x,y) start, end = ax.get_xlim() ax.xaxis.set_ticks(np.arange(start, end, 0.712123)) ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f')) plt.show()
另一种方法是设置轴定位器:
import matplotlib.ticker as plticker loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals ax.xaxis.set_major_locator(loc)
根据您的需要,有几种不同types的定位器。
我喜欢这个解决scheme(来自Matplotlib Plotting Cookbook ):
import matplotlib.pyplot as plt import matplotlib.ticker as ticker x = [0,5,9,10,15] y = [0,1,2,3,4] tick_spacing = 1 fig, ax = plt.subplots(1,1) ax.plot(x,y) ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing)) plt.show()
这个解决scheme通过ticker.MultipleLocater()
给出的数字给出了对tick间距的明确控制,可以自动确定极限,以后很容易阅读。
如果任何人对一般的单线程感兴趣,只需获取当前的标记,并通过对每个其他标记进行抽样来设置新的标记。
ax.set_xticks(ax.get_xticks()[::2])
这有点不好意思,但是到目前为止,我已经find了最简单,最容易理解的例子。 这是从这里的答案:
最干净的方法来隐藏Matplotlib颜色条中的每一个滴答标签?
for label in ax.get_xticklabels()[::2]: label.set_visible(False)
然后你可以循环标签设置为可见或不依赖于你想要的密度。
编辑:请注意,有时matplotlib设置标签== ''
,所以它可能看起来像一个标签是不存在的,实际上它只是不显示任何东西。 为了确保你正在循环显示实际的可见标签,你可以尝试:
visible_labels = [lab for lab in ax.get_xticklabels() if lab.get_visible() is True and lab.get_text() != ''] plt.setp(visible_labels[::2], visible=False)
这是一个古老的话题,但我时不时碰到这个问题,并做了这个function。 这非常方便:
import matplotlib.pyplot as pp import numpy as np def resadjust(ax, xres=None, yres=None): """ Send in an axis and I fix the resolution as desired. """ if xres: start, stop = ax.get_xlim() ticks = np.arange(start, stop + xres, xres) ax.set_xticks(ticks) if yres: start, stop = ax.get_ylim() ticks = np.arange(start, stop + yres, yres) ax.set_yticks(ticks)
这样控制滴答的一个警告就是,在添加一行之后,不再享受最大规模的交互式自动更新。 然后呢
gca().set_ylim(top=new_top) # for example
并再次运行resadjust函数。
我开发了一个不雅的解决scheme。 考虑我们有X轴,也是X中每个点的标签列表。
例:
import matplotlib.pyplot as plt x = [0,1,2,3,4,5] y = [10,20,15,18,7,19] xlabels = ['jan','feb','mar','apr','may','jun']
假设我想只显示'feb'和'jun'的刻度标签
xlabelsnew = [] for i in xlabels: if i not in ['feb','jun']: i = ' ' xlabelsnew.append(i) else: xlabelsnew.append(i)
好,现在我们有一个虚假的标签列表。 首先,我们绘制了原始版本。
plt.plot(x,y) plt.xticks(range(0,len(x)),xlabels,rotation=45) plt.show()
现在,修改版本。
plt.plot(x,y) plt.xticks(range(0,len(x)),xlabelsnew,rotation=45) plt.show()
xmarks=[i for i in range(1,length+1,1)] plt.xticks(xmarks)
这对我有效
如果你想在[1,5](1和5)之间select,则更换
length = 5
这里是一个纯粹的Python实现所需的function,可以处理任何具有正值,负值或混合值的数字序列(int或float):
def computeTicks (x, step = 5): """ Computes domain with given step encompassing series x @ params x - Required - A list-like object of integers or floats step - Optional - Tick frequency """ import math as Math xMax, xMin = Math.ceil(max(x)), Math.floor(min(x)) dMax, dMin = xMax + abs((xMax % step) - step) + (step if (xMax % step != 0) else 0), xMin - abs((xMin % step)) return range(dMin, dMax, step)
示例输出:
# Negative to Positive series = [-2, 18, 24, 29, 43] print(list(computeTicks(series))) [-5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45] # Negative to 0 series = [-30, -14, -10, -9, -3, 0] print(list(computeTicks(series))) [-30, -25, -20, -15, -10, -5, 0] # 0 to Positive series = [19, 23, 24, 27] print(list(computeTicks(series))) [15, 20, 25, 30] # Floats series = [1.8, 12.0, 21.2] print(list(computeTicks(series))) [0, 5, 10, 15, 20, 25] # Step – 100 series = [118.3, 293.2, 768.1] print(list(computeTicks(series, step = 100))) [100, 200, 300, 400, 500, 600, 700, 800]
和样本用法:
import matplotlib.pyplot as plt x = [0,5,9,10,15] y = [0,1,2,3,4] plt.plot(x,y) plt.xticks(computeTicks(x)) plt.show()