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用于url解码和中文解析的小脚本(python url decoder)
Aug 11 Python
python多重继承新算法C3介绍
Sep 28 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 Python
Python rstrip()方法实例详解
Nov 11 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
Apr 27 Python
简单的Python调度器Schedule详解
Aug 30 Python
Python包,__init__.py功能与用法分析
Jan 07 Python
Python模块_PyLibTiff读取tif文件的实例
Jan 13 Python
vue.js刷新当前页面的实例讲解
Dec 29 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 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+JS实现搜索自动提示(实例)
2013/06/09 PHP
php实现cookie加密的方法
2015/03/10 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
JavaScript效率调优经验
2009/06/04 Javascript
jQuery ajax cache缓存问题
2010/07/01 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
js图片轮播效果实现代码
2020/04/18 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
原生Javascript和jQuery做轮播图简单例子
2016/10/11 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
2019/11/01 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
[07:31]DOTA2卡尔工作室 英雄介绍主宰篇
2013/06/25 DOTA
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
Python实现简单的文件传输与MySQL备份的脚本分享
2016/01/03 Python
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
Python Pillow Image Invert
2019/01/22 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
Web Service面试题:如何搭建Axis2的开发环境
2012/06/20 面试题
就职演讲稿范文
2014/05/19 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
还款承诺书范本
2015/01/20 职场文书
工作推荐信模板
2015/03/25 职场文书
校车安全管理责任书
2015/05/11 职场文书
立春观后感
2015/06/18 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
Python时间操作之pytz模块使用详解
2022/06/14 Python