本文以2019年全国各城市的空气质量观测数据为例,利用matplotlib、calmap、pyecharts绘制日历图和热力图。在绘图之前先利用pandas对空气质量数据进行处理。

2019年全国各城市空气质量观测数据来源于:https://beijingair.sinaapp.com。

数据处理

从网站下载的数据为逐小时数据,每天一个文件。如果要绘制全年的日历图或者热图,首先要将所有的数据进行合并处理。

下载好数据之后,将数据解压到当前目录的2019文件夹内,然后处理数据:

import globfrom datetime import datetime, timedeltaimport numpy as npimport pandas as pdfrom matplotlib import cm, colorsimport matplotlib.dates as mdatesimport matplotlib.patches as mpatchesimport matplotlib.pyplot as pltdef format_aqi(filep, columns=None):files = glob.glob(filep)df = pd.concat((pd.read_csv(f) for f in files))df.index = pd.to_datetime(df.date.astype(np.str) + df.hour.apply(lambda x: '%02d'%x), format='%Y%m%d%H')# drop date and hour columnsdf.drop(['date', 'hour'], axis=1, inplace=True)df = df.pivot_table(columns='type', index=df.index)df.columns.names = ['station', 'type']df.index.names = ['date']df = df.stack('station')if columns is not None:df = df.loc[:, columns]return dffilep = '2019/china*.csv'data = format_aqi(filep)data.csv('2019.csv') # 保存以便后续使用

合并完成数据后,读取数据并进一步处理:

data = pd.read_csv('2019.csv', index_col='date', parse_dates=True)data2 = data.pivot_table(index=data.index, columns=['station'])time_range = pd.date_range(datetime(2019, 10, 1, 0), datetime(2019, 12, 31, 23), freq='1h')idx = pd.IndexSliceaqi = data2.loc[:, idx['AQI', :]].xs('AQI', axis=1)aqi = aqi.reindex(time_range)cities = ['北京', '天津', '石家庄', '邯郸','济南', '郑州', '菏泽','亳州', '徐州', '驻马店','南京', '合肥', '马鞍山','武汉', '上海', '杭州','长沙', '南昌', '上饶', '温州','吉安', '赣州', '福州','龙岩', '厦门', '泉州']sub = aqi[cities[::-1]]

绘制热力图

因为空气质量有专门的配色,首先设置对应等级的colormap

colors_aqi = ['#009966', '#FFDE33', '#FF9A32', '#CC0033', '#660099']levels = [0, 50, 100, 150, 200, 300]cmap_aqi = colors.ListedColormap(colors_aqi)norm = colors.BoundaryNorm(levels, cmap_aqi.N)

然后,开始绘图:

fig, ax = plt.subplots(figsize=(16, 9))con = ax.pcolormesh(sub.index.values,np.arange(0, sub.columns.shape[0]+1),sub.T,cmap=cmap_aqi,norm=norm,vmin=0, vmax=300)sdate = datetime(2019, 10, 1)edate = datetime(2019, 12, 31)xticks = pd.date_range(sdate, edate, freq='15d')ax.set_xlim([sdate, edate])ax.set_xticks(xticks)ax.set_xticklabels([i.strftime('%m/%d') for i in xticks])ax.set_yticks(np.arange(0.5, len(cities)))_ = ax.set_yticklabels(sub.T.index.values, fontdict={'family': 'SimHei', 'fontsize': 16})ytext = [i.get_text() for i in list(ax.get_yticklabels())]cb = fig.colorbar(con, extend='max', pad=0.02, extendrect=True, extendfrac=0.2)cb.cmap.set_over('#7D0023')cb.ax.tick_params(axis='both', direction='in', length=0)_ = cb.ax.set_ylabel('Air Quality Index(AQI)', fontdict={'family': 'Times New Roman'})

2019年10月-12月各城市的AQI日变化

绘制日历图

python中关于绘制日历图的工具相对较少,没有特别有些的工具。下面分别使用calmap和pyecharts绘制日历图。

注意:calmap已经放弃维护了,在使用过程中可能会存在问题。本文fork了原来的源码,解决了可能遇到的问题。可以从https://github.com/bugsuse/calmap下载源码,然后执行python setup.py install进行安装即可。

注意:本文为了简单起见,利用AQI绘图时,直接对AQI求日均值,但是实际情况下是不能直接这样计算的。

import calmapdd = data[data.station == '北京'].AQI.resample('1d').mean()fig, ax = plt.subplots(figsize=(18, 9))cmp = calmap.yearplot(dd, how=None, year=2019,cmap=cmap_aqi, norm=norm,vmin=0, vmax=300,)ax2 = fig.add_axes([0.94, 0.4, 0.015, 0.2])cb1 = mpl.colorbar.ColorbarBase(ax2, cmap=cmap_aqi, ticks=levels,norm=norm, orientation='vertical',extend='max', extendrect=True,extendfrac=0.15)cb1.cmap.set_over('#7D0023')cb1.set_ticks([25, 75, 125, 175, 250])cb1.ax.set_yticklabels([u'优', u'良', u'轻度污染', u'中度污染', u'重度污染'], fontdict={'fontsize': 16, 'family': 'SimHei'})cb1.ax.yaxis.set_tick_params(length=0.01)ax2.text(1.13, 1.07, '严重污染', fontdict={'fontsize':16, 'family':'SimHei'})ax.set_ylabel('2019', fontdict=dict(fontsize=26, color='grey'))

2019年北京市AQI日历图

下面利用pyecharts绘制2019年北京市AQI日历图。

from pyecharts import options as optsfrom pyecharts.charts import Calendarbegin = datetime(2019, 1, 1)end = datetime(2019, 12, 31)data = [[str(begin + timedelta(days=i)), dd[i]]for i in range((end - begin).days + 1)]c = (Calendar().add("",data,calendar_opts=opts.CalendarOpts(range_='2019',daylabel_opts=opts.CalendarDayLabelOpts(name_map='cn'),monthlabel_opts=opts.CalendarMonthLabelOpts(name_map='cn'),),).set_global_opts(title_opts=opts.TitleOpts(title='2019年北京市每日AQI(Air Quality Index)', pos_left='center'),visualmap_opts=opts.VisualMapOpts(max_=300,min_=0,range_size=[0, 50, 100, 150, 200, 300],pieces= [{'min': 0, 'max': 50},{'min': 51, 'max': 100},{'min': 101, 'max': 150},{'min': 151, 'max': 200},{'min': 201, 'max': 300}],range_color=colors_aqi,orient='horizontal',is_piecewise=True,pos_top='230px',pos_left='100px',),))

2019年北京市AQI日历图

绘制热力图也可以使用seaborn,不需要单独码很多代码,而且功能要更多一些。python在绘制日历图方面不是非常友好,相比之下,pyecharts更有优势。但是pyecharts更适合线上可视化展示,不太适合制作用于发表论文的图。

这次就说到这了,感兴趣的可以去尝试一下。

往期回顾

python 日历热力图_Python绘制日历图和热力图相关推荐

  1. python彩虹代码_python绘制彩虹图

    本文实例为大家分享了python绘制彩虹图的具体代码,供大家参考,具体内容如下 from turtle import * #控制彩虹路径 def path(pen, r, g, b): pen.pen ...

  2. python绘制简单城市剪影图_利用Python的folium包绘制城市道路图的实现示例

    写在前面 很长一段时间内,我都在研究在线地图的开发者文档,百度地图和高德地图的开发者中心提供了丰富的在线地图服务,虽然有一定的权限限制,但不得不说,还是给我的科研工作提供了特别方便的工具,在博客前面我 ...

  3. python绘制三维曲面图-python中Matplotlib实现绘制3D图的示例代码

    Matplotlib 也可以绘制 3D 图像,与二维图像不同的是,绘制三维图像主要通过 mplot3d 模块实现.但是,使用 Matplotlib 绘制三维图像实际上是在二维画布上展示,所以一般绘制三 ...

  4. python仪表盘绘图_Python制作仪表盘图,比Excel快速N倍

    之前写过一篇用Excel制作仪表盘图的教程高端大气上档次的Excel图形-仪表盘主要是利用环形图和饼图分别制成半圆环和指针,制作过程较为繁琐,且指针准确度不易掌控,这里我们用Python中的pyech ...

  5. python 仪表盘数据显示_Python制作仪表盘图,比Excel快速百倍

    之前写过一篇用Excel制作仪表盘图的教程Excel可视化之精美仪表盘,主要是利用环形图和饼图分别制成半圆环和指针,制作过程较为繁琐,且指针准确度不易掌控,这里我们用Python中的pyecharts ...

  6. 霍兰德人格分析:利用Python第三方库matplotlib绘制雷达图

    美国约翰霍普金斯大学霍兰德教授认为,个人职业兴趣特性与职业之间应有一种内在的对应关系.根据兴趣的不同,人格可分为研究型(I).艺术型(A).社会型(S).企业型(E).传统型(C).现实型(R)六个维 ...

  7. 用 python 实现FFT,绘制频谱图

    用 python 实现FFT,绘制频谱图 关键词 :fft , scipy 库, fftshift ,单边谱,双边谱,频谱泄露 目录 用 python 实现FFT,绘制频谱图 前言 代码 结果 总结和 ...

  8. python教程-数据分析-matplotlib绘制折线图2 +总结(搭建网格,加上图例,修改图片的颜色和线条,脑图总结)

    上一篇博客我们展示到了如何将matplotlib里面的中文正确输出 链接上一篇:python教程-数据分析-matplotlib绘制折线图1 matplotlib 今天这一篇我们继续学习matplot ...

  9. 【适合Python语言小白的股价图】利用Python中的matplotlib绘制股价图(非k线图)

    [适合Python语言小白的股价图]利用Python中的matplotlib绘制股价图(非k线图) 代码小白,最近做一家公司的股价复盘用到了matplotlib,在此做个小小的记录.代码的逻辑比较笨, ...

最新文章

  1. 凝思系统改时间_国产操作系统往事:四十年激变,终再起风云
  2. Spring Cloud Config Server简介
  3. python3 centos7 Python.h无法找到
  4. 11.深度学习练习:Keras tutorial - the Happy House(推荐)
  5. 关于Java基础你不得不会的34个问题
  6. 关羽在韩国有块私家地?
  7. wordpress主题 阿里百秀XIU v7.7版本 兼容 PHP 8.0
  8. mysql教程排序_MySQL中的排序函数field()实例详解
  9. redhat自带mysql_rhel4卸载系统自带的mysql4.1
  10. C#listview控件
  11. 基于最小二乘法的人口增长模型拟合
  12. php opendir 相对路径,我是wamp环境,怎么样让php的opendir函数可以接受相对路径?...
  13. 我们写APP和小程序或者H5用的前端UI--ColorUI
  14. Mysql 日历数据表
  15. speedoffice表格如何根据身份证号计算年龄
  16. php管理后台模板,企业版PHP后台管理模板【清爽型】修改版~
  17. PHP array_column() 函数
  18. Editor编辑器操作
  19. H5页面调用微信支付
  20. 这几个视频提取音频的方法很实用,快来学习

热门文章

  1. Mac—开启键盘F1 - F12功能键以及F1 - F12功能键的作用
  2. mysql联合索引和索引优化的理解
  3. OpenGL-GLSL语言入门教程(1)
  4. Handler源码分析 - Java层
  5. 两个向量的夹角解法--VC
  6. Java项目毕业设计:交流互动论坛信息网站(java+springboot+vue+mysql)
  7. QTextEdit和QTextDocument(一)
  8. 小程序点餐系统——点餐列表页(未讲解完)
  9. 远程桌面全屏无法退出
  10. 前端自学第四天-总结