Matplotlib RuntimeError:使用MultipleLocator时超过Locator.MAXTICKS

时间:2018-12-25 21:36:53

标签: python-3.x matplotlib

我正在绘制具有10000 x轴数据点的Matplotlib图表。为避免X轴标签重叠,我使用了40的Major MultipleLocator和10的minor MultipleLocator。此代码适用于1000个数据点。

from matplotlib import pyplot as plt
import numpy as np
import matplotlib.ticker as mticker

##generating 1000 data points
years = [i for i in range(1,10000)]
data = np.random.rand(len(years))

fig, ax = plt.subplots(figsize = (18,6))

ind = np.arange(len(data))

bars1 = ax.bar(ind, data, 
        label='Data')

ax.set_title("Data vs Year")

#Format Y Axis
ax.set_ylabel("Data")
ax.set_ylim((0,1))

#Format X Axis
ax.set_xticks(range(0,len(ind)))
ax.set_xticklabels(years)
ax.set_xlabel("Years")
ax.xaxis.set_major_locator(mticker.MultipleLocator(40))
ax.xaxis.set_major_formatter(mticker.FormatStrFormatter('%d'))

ax.xaxis.set_minor_locator(mticker.MultipleLocator(10))
fig.autofmt_xdate()
ax.xaxis_date()
plt.tight_layout()

plt.show()

上面的图表产生以下错误。

RuntimeError: Locator attempting to generate 1102 ticks from -510.0 to 10500.0: exceeds Locator.MAXTICKS

您能告诉我这张图表中的错误吗?

1 个答案:

答案 0 :(得分:1)

首先,您应该删除以下两行:

ax.set_xticks(range(0,len(ind)))
ax.set_xticklabels(years)

这些行首先设置10000个刻度。由于您使用了ax.xaxis.set_major/minor_locator(),因此不需要这两行。然后,行ax.xaxis.set_minor_locator(mticker.MultipleLocator(10))将产生1102个刻度(mticker.Locator.MAXTICKS == 1000),因此,根据我的测试,您应该将arg至少更改为12。

mticker.MultipleLocator()的arg更改较大将获得较少的滴答声。

尽管有任何原因,如果您确实需要277个大刻度线(40)和1102个小刻度线(10),则可以通过mticker.Locator.MAXTICKS = 2000更改'MAXTICKS'