首页 > 解决方案 > 在 matplotlib 中绘制分类数据时避免将字符串解释为日期

问题描述

我正在尝试使用看起来像日期但不是日期的字符串条目在 matplotlib 中绘制分类数据。Matplotlib 尝试自动将字符串转换为日期时间对象,但失败了。如何强制 matplotlib 将类别视为字符串并阻止它尝试将字符串转换为日期时间对象?

这是我的例子:

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

对于它的价值,在我的示例中,字符串代表学年(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)

在此处输入图像描述

但我更喜欢使用较短的版本 YYYY-YY 而不是较长的 YYYY-YYYY。

标签: pythonmatplotlibcategorical-datapython-datetime

解决方案


虽然您的代码在我的旧版本 ( 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);

推荐阅读