在matplotlib中打印分类数据时,避免将字符串解释为日期

2024-04-19 13:41:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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

值得一提的是,在我的示例中,字符串表示学年(2019-2020年和2020-2021年),但matplotlib假设它们是YYYY-MM格式的日期,并在尝试将“20”和“21”转换为有效月份时抛出和出错

如果我将categories更改为['2019-2020'、'2020-2021'],代码工作正常(matplotlib不再假设字符串表示datetime对象)

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版本


Tags: 对象字符串import版本datetimeplotmatplotlibas
2条回答

如果传入两个位置参数,plt.plot将尝试进行X-Y笛卡尔坐标类型的打印。我想您只需要像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

虽然在我的旧版本(matplotlib 2.2.2)中编写的代码可以正常工作,但您可以尝试以下解决方法。诀窍是使用categories作为定制的x标签

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);

相关问题 更多 >