matplotlib.units.ConversionError: Failed to convert value to axis units 的解决
背景故事
- 最近两天在做日志分析,想整个
周访问量折线图
和月访问量柱状图
- 在
jupyter
中代码运行的没有问题,正确的显示了图像 - 而当我将代码复制粘贴到
py
文件中就报了错
问题再现
- 我的代码
'''
df.create_time
0 2020-12-22 11:17:29
1 2020-12-22 11:17:29
2 2020-12-22 11:17:30
3 2020-12-22 11:17:30
4 2020-12-22 11:17:31
...
66370 2021-04-13 11:20:24
66371 2021-04-13 11:48:08
66372 2021-04-13 11:48:08
66373 2021-04-13 12:07:17
66374 2021-04-13 12:07:17
Name: create_time, Length: 66375, dtype: datetime64[ns]
'''
# 周访问量折线图
week_split = df.groupby(df.create_time.dt.week)['create_time'].count()
weekly = pd.date_range(df.iloc[0].create_time, periods=len(week_split), freq='w')
week_plot = plt.plot(weekly, week_split, marker='^', label='count')
plt.legend()
# 月访问量柱状图
month_split = df.groupby(df.create_time.dt.month)['create_time']
months = ['%d月' % i for i in month_split.groups.keys()]
# 报错的那一句
month_bar = plt.bar(months, month_split.count().values, color='orange', width=0.3)
plt.show()
- 结果运行的时候报了个错
matplotlib.units.ConversionError: Failed to convert value(s) to axis units
- 这个报错的意思是
- (我英语不好,🤫)
- 这就很奇怪了,因为我在
jupyter
中运行的时候没有错呀,怎么到这里就有错了
解决 bug
第一次尝试
- 于是我再次向万能的百度求救,翻到了这篇文章
- 我以为是这个错误,但看了看我这里没有使用
plt.xticks()
呀 - 但我还是尝试了一下,将代码改成了如下(只是报错的那一句):
month_bar = plt.bar([i for i in range(len(months))], month_split.count().values, color='orange', width=0.3)
plt.xticks([i for i in range(len(months))], months)
- 思路是: 先将柱状图的横轴设置成数字类型,再使用 plt.xticks() 函数重写横轴
- 最后真的没有报错
- 展示的图如下:
两张图重叠了!!!
- 成功了,但没有完全成功😭
- 那这个方法肯定不对
第二次尝试
-
于是我再次查看了我的代码
-
发现了这里
-
没有 plt.show() !!!
-
可能你会好奇,这是什么,为什么那么重要
函数 plt.show() 的作用
- 以我的理解,这个函数大概的作用是
暂时终止配置
,显示图表图片
,不与后边对其他图表的配置冲突
- 这是你可能会问,这有什么用嘛?
- 当然有用!
plt.show()
会将这句话前边的语句综合起来,创建一张设置好的图表,并显示出来- 我这里错误的原因是没有使用
plt.show()
暂时终止对周访问量折线图
的配置,导致周访问量折线图
和月访问量柱状图
的配置重叠,并引发异常 - 所以在
py
文件中创建好一张图表后一定要及时使用plt.show()
函数暂时终止对该表的配置,防止表的配置冲突
为什么 jupyter 中不使用 plt.show() 也不会报错
- 我的理解:
jupyter
中一个代码块中如图
- 当执行完这个代码块中的代码后,会自动地调用
plt.show()
函数,将图表显示,并暂时终止对该图表的配置
- 当然,这些都是我的理解,各位大佬有什么不同的观点可以在评论区里留言
结尾
以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。