matplotlib.units.ConversionError: Failed to convert value(s) to axis units的解决及对plt.show()的理解

背景故事

  • 最近两天在做日志分析,想整个 周访问量折线图月访问量柱状图
  • 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() 函数,将图表显示,并暂时终止对该图表的配置

  • 当然,这些都是我的理解,各位大佬有什么不同的观点可以在评论区里留言



结尾

以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。
在这里插入图片描述

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,你遇到的问题是在导入`matplotlib.pyplot`模块时出现了`AttributeError: module 'json' has no attribute 'loads'`的错误。这个错误通常是由于`json`模块与`matplotlib`的某些依赖库之间的冲突引起的。 为了解决这个问题,你可以尝试以下几种方法: 1. 确保你的`json`模块正常工作。你可以尝试在Python交互式环境中导入`json`模块并调用`loads`函数来确认它是否正常工作。如果出现任何错误,请尝试修复`json`模块或重新安装它。 2. 更新`matplotlib`和相关依赖库。你可以尝试更新`matplotlib`和其它相关的库,以确保它们是最新版本。你可以使用以下命令来更新`matplotlib`和`numpy`库: ```shell pip install --upgrade matplotlib numpy ``` 3. 检查Python环境中是否存在冲突的库。有时候,不同的库可能会引起冲突。你可以尝试在导入`matplotlib.pyplot`之前,先导入`json`模块并调用`loads`函数,以确保它正常工作。如果出现错误,请检查是否有其他库与`json`模块冲突,并尝试解决冲突。 4. 重新安装`matplotlib`和相关依赖库。如果以上方法都没有解决问题,你可以尝试重新安装`matplotlib`和相关依赖库。你可以使用以下命令来重新安装`matplotlib`和`numpy`库: ```shell pip uninstall matplotlib numpy pip install matplotlib numpy ``` 希望以上方法能够帮助你解决问题。如果问题仍然存在,请提供更多的错误信息和上下文,以便我们能够更好地帮助你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值