Старайтесь не интерпретировать строки как даты при построении категориальных данных в matplotlib - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь отобразить категориальные данные в matplotlib со строковыми записями, которые выглядят как даты, но не являются датами. Matplotlib пытается автоматически преобразовать строку в объект datetime, но не удается. Как я могу заставить matplotlib обрабатывать категории как строки и предотвращать попытки преобразования строки в объект datetime?

Вот мой пример:

import matplotlib.pyplot as plt
categories = ['2019-20', '2020-21']
vals = [5, 10]
plt.plot(categories, vals)

Что дает

ValueError: could not convert string to float: '2019-20'
<...snip...>
calendar.IllegalMonthError: bad month number 20; must be 1-12

Для чего это стоит, в моем примере строки представляют академические c годы (2019-2020 и 2020-2021), но matplotlib предполагает, что они являются датами в форме YYYY-MM, и выдает ошибку и когда пытаясь преобразовать «20» и «21» в действительный месяц.

Если я изменю категории на ['2019-2020', '2020-2021'], код работает нормально (matplotlib больше не предполагает строки представляют объект даты и времени).

import matplotlib.pyplot as plt
categories = ['2019-2020', '2020-2021']
vals = [5, 10]
plt.plot(categories, vals)

enter image description here

Но я предпочитаю использовать более короткую версию YYYY-YY, а не более длинную YYYY-YYYY.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

В то время как ваш код отлично работает в моей старой версии (matplotlib 2.2.2), вы можете попробовать следующий обходной путь. Хитрость заключается в том, чтобы использовать categories в качестве пользовательских x-ticklabels

import matplotlib.pyplot as plt

categories = ['2019-20', '2020-21']
vals = [5, 10]
plt.plot(range(len(categories)), vals)

plt.xticks(range(len(categories)), categories);
0 голосов
/ 07 февраля 2020

plt.plot попытается сделать XY декартову диаграмму типа координат, если вы передадите два позиционных аргумента. Я думаю, вам нужно только что-то вроде plot(vals), а затем вызвать plt.xticks:

import matplotlib.pyplot as plt
import numpy as np
categories = ['2019-20', '2020-21']
vals = [5, 10]
plt.plot(vals)
plt.xticks(np.arange(len(vals)), tuple(categories))

см. https://matplotlib.org/api/_as_gen/matplotlib.pyplot.xticks.html

...