在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 )函数将自动设置默认的xy限制。 如果你想保持这些限制,只是改变勾号的步长,那么你可以使用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()