Python如何绘制日历图和热力图


Posted in Python onAugust 07, 2020

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

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

数据处理

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

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

import globfrom datetime import datetime, timedeltaimport numpy as npimport pandas as pd
from matplotlib import cm, colorsimport matplotlib.dates as mdatesimport matplotlib.patches as mpatchesimport matplotlib.pyplot as plt
def 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 columns  df.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 df
filep = '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'})

Python如何绘制日历图和热力图

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

绘制日历图

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

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

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

import calmap
dd = 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'))

Python如何绘制日历图和热力图

2019年北京市AQI日历图

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

from pyecharts import options as optsfrom pyecharts.charts import Calendar
begin = 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},

Python如何绘制日历图和热力图

2019年北京市AQI日历图

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

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

以上就是Python如何绘制日历图和热力图的详细内容,更多关于Python绘制日历图和热力图的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python函数学习笔记
Oct 07 Python
python计算方程式根的方法
May 07 Python
Python的净值数据接口调用示例分享
Mar 15 Python
linux安装python修改默认python版本方法
Mar 31 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
Jun 21 Python
Python时间序列缺失值的处理方法(日期缺失填充)
Aug 11 Python
pymysql 开启调试模式的实现
Sep 24 Python
Pycharm 字体大小调整设置的方法实现
Sep 27 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
Python flask框架如何显示图像到web页面
Jun 03 Python
Python闭包及装饰器运行原理解析
Jun 17 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
Aug 07 #Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
Aug 07 #Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 #Python
Pycharm 2020.1 版配置优化的详细教程
Aug 07 #Python
解决阿里云邮件发送不能使用25端口问题
Aug 07 #Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
Aug 07 #Python
详解pycharm2020.1.1专业版安装指南(推荐)
Aug 07 #Python
You might like
真正的ZIP文件操作类(php)
2007/07/21 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
超级退弹代码
2008/07/07 Javascript
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
Jquery 表单验证类介绍与实例
2013/06/09 Javascript
jQuery中after()方法用法实例
2014/12/25 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
JavaScript中使用自然对数ln的方法
2015/06/14 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
2016/10/29 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
Vue computed计算属性的使用方法
2017/07/14 Javascript
vue配置nprogress实现页面顶部进度条
2019/09/21 Javascript
[42:00]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第一场 12.13
2020/12/17 DOTA
Python程序语言快速上手教程
2012/07/18 Python
python通过pil将图片转换成黑白效果的方法
2015/03/16 Python
python获得两个数组交集、并集、差集的方法
2015/03/27 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
快速了解python leveldb
2018/01/18 Python
Python异常的检测和处理方法
2018/10/26 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
Django model反向关联名称的方法
2018/12/15 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
给幼儿园老师的表扬信
2014/01/19 职场文书
党员政治学习材料
2014/05/14 职场文书
国防教育标语
2014/10/08 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
四十九个javascript小知识实用技巧
2021/11/20 Javascript