Matplotlib RuntimeError: превышает Locator.MAXTICKS при использовании MultipleLocator - PullRequest
0 голосов
/ 26 декабря 2018

Я строю диаграмму Matplotlib с 10000 точками данных оси x.Чтобы избежать наложения меток оси X, я использовал Major MultipleLocator из 40 и вспомогательный MultipleLocator из 10. Этот код работает для 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 голосов
/ 27 декабря 2018

Прежде всего, вы должны удалить эти две строки:

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), поэтому в результате моего тестирования вы должны изменить аргумент как минимум на 12.

Изменить аргумент mticker.MultipleLocator() чем больше, тем меньше тиков.

Несмотря на все причины, если вам нужно 277 основных тиков (40) и 1102 малых тиков (10), вы можете изменить «MAXTICKS» на mticker.Locator.MAXTICKS = 2000

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...