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编程实现希尔排序
Apr 13 Python
TensorFlow在MAC环境下的安装及环境搭建
Nov 14 Python
Python中static相关知识小结
Jan 02 Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 Python
PyCharm代码回滚,恢复历史版本的解决方法
Oct 22 Python
python制作抖音代码舞
Apr 07 Python
Python内置random模块生成随机数的方法
May 31 Python
Python 中Django验证码功能的实现代码
Jun 20 Python
详解Python Opencv和PIL读取图像文件的差别
Dec 27 Python
OpenCV中VideoCapture类的使用详解
Feb 14 Python
python用pip install时安装失败的一系列问题及解决方法
Feb 24 Python
python线程里哪种模块比较适合
Aug 02 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
浅析PHP水印技术
2007/02/14 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
jquery 循环显示div的示例代码
2013/10/18 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
2014/06/09 Javascript
JavaScript中操作Mysql数据库实例
2015/04/02 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
Underscore源码分析
2015/12/30 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
总结Python编程中三条常用的技巧
2015/05/11 Python
Python装饰器入门学习教程(九步学习)
2016/01/28 Python
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
python僵尸进程产生的原因
2017/07/21 Python
Python 装饰器使用详解
2017/07/29 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
FOREO官方网站:LUNA露娜洁面仪
2016/11/28 全球购物
Stubhub英国:购买体育、演唱会和剧院门票
2018/06/10 全球购物
赡养老人协议书
2014/04/21 职场文书
个人委托书范本
2014/09/13 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
银行员工考核评语
2014/12/31 职场文书
幼师小班个人总结
2015/02/12 职场文书
幼儿园教师培训心得体会
2016/01/21 职场文书
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js