背景故事

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

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



结尾

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐