使用matplotlib绘制时间序列图表

背景

前面通过selenium爬取了微信公众号“新世相”的所有文章链接,详见使用Selenium获取微信公众号的所有文章。获取到的信息有:文章发表的时间、标题以及对应的url。那么根据时间可以绘制出文章发表情况的图表,先上结果图:

思路

  • 读取csv

    1
    df_ori = pd.read_csv('articles.csv', sep=';', header=None)
  • 筛选数据

    我们获取到的源数据如下:

    1
    2
    3
    "2019-03-02;看到44岁潘粤明的脸,我发现面对痛苦的最好方式是温柔";http://mp.weixin.qq.com/s?__biz=MzI2OTA3MTA5Mg==&mid=2651791151&idx=1&sn=d24b36c7af7f3a13e8ab9b8d4d11143f&chksm=f11e58b4c669d1a2fe70afe9fd2f2fdfe3cc1a17d0c48d8efa51ae8e10d17239c7ff0f8649b4&scene=21#wechat_redirect
    "2019-03-01;“同时被3个男人追求,我选了最丑的”:看完这些70岁老人的遗憾,我啥都想开了";http://mp.weixin.qq.com/s?__biz=MzI2OTA3MTA5Mg==&mid=2651791096&idx=1&sn=eb68116d46fddf0e827475d9b26941b0&chksm=f11e5963c669d075ec8716073bec685f819df8c2dbc03b87f23347ba5b01ea4219864877b4a0&scene=21#wechat_redirect
    "2019-02-28;在同学会上遇见初恋:他盯了我 5 秒,说出我等了 10 年的那句话";http://mp.weixin.qq.com/s?__biz=MzI2OTA3MTA5Mg==&mid=2651790909&idx=1&sn=f642cd31fbc8d41d0b4fbe949b51425a&chksm=f11e59a6c669d0b0e5e7ee12cece0a4afaa995aa123b8e993f8ec10d8ba38cccdcf5290de25a&scene=21#wechat_redirect

    | 第一列 | 第二列 |
    | ——— | —— |
    | 日期;标题 | url |

    那么我们只要获取第一列,并根据分隔符;进行拆分就可以得到日期与标题的对应关系:

    1
    2
    3
    # 取第一列并分割日期与标题
    df = df_ori.iloc[:, 0]
    df = df.str.split(';', expand=True)
  • 格式化数据

    现在给数据设置列别名并进行格式化操作

    1
    2
    3
    4
    # 格式化日期,设置column,并将日期设置为index
    df.columns = ['date', 'title']
    df.date = pd.to_datetime(df.date)
    df = df.set_index('date')
  • 数据统计

    我们需要计算每个月新世相公众号发表的文章数,那么需要按月重新取样,并汇总统计文章数

    1
    2
    # 按月统计文章数"MS"为月初
    cacu = df.resample("MS").count()
  • 画图

    • 配置画布大小

      由于时间跨度从2015年至今比较长,我们需要先配置一下画布大小。

      1
      2
      # 画图
      fig, ax = plt.subplots(figsize=[20, 5])
    • 配置线条展示:值处用圆点加粗

      1
      2
      # 线条
      ax.plot(cacu, 'o-')
    • 配置中文展示

      1
      2
      3
      4
      5
      # 通过设置中文字体方式解决中文展示问题
      font = FontProperties(fname='../font/PingFang.ttc')
      ax.set_title("新世相文章统计", fontproperties=font)
      ax.set_xlabel("日期", fontproperties=font)
      ax.set_ylabel("文章数", fontproperties=font)
    • 配置横轴展示

      由于按月画图,我们横轴显示为年-月,我们这里对横轴设置两层坐标,第一层仅展示月份,第二层展示年份,这样可以防止因为横轴字符挤在一起。第二层坐标格式中增加\n\n用于换行,给第一层月份留出空间。

      1
      2
      3
      4
      5
      6
      7
      # 设置时间轴
      formater = mdate.DateFormatter('%Y-%m')
      ax.xaxis.set_major_formatter(formater)
      ax.xaxis.set_minor_locator(mdate.MonthLocator())
      ax.xaxis.set_minor_formatter(mdate.DateFormatter('%m'))
      ax.xaxis.set_major_locator(mdate.YearLocator())
      ax.xaxis.set_major_formatter(mdate.DateFormatter('\n\n%Y'))
    • 显示数值

      1
      2
      3
      # 显示数值
      for a,b in zip(cacu.index, cacu.values):
      ax.text(a, b, b[0])
    • 显示图片

      1
      plt.show()

结论

最后画图如下:

plot

可见,新世相也是从16年开始逐步兴起,基本上保持每天一篇的频率一致稳定发展至今。

完整代码参考:https://github.com/keejo125/web_scraping_and_data_analysis/tree/master/weixin