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 读写XML文件的实例
Aug 02 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
Sep 05 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
Sep 08 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
Nov 16 Python
python实现TF-IDF算法解析
Jan 02 Python
python实现将excel文件转化成CSV格式
Mar 22 Python
Python动态赋值的陷阱知识点总结
Mar 17 Python
Python中一些深不见底的“坑”
Jun 12 Python
python爬虫中多线程的使用详解
Sep 23 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
Django实现列表页商品数据返回教程
Apr 03 Python
pd.DataFrame中的几种索引变换的实现
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初学者们头痛的十四个问题
2007/01/15 PHP
深入解析phpCB批量转换的代码示例
2013/06/27 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
PHP+Ajax实现验证码的实时验证
2016/07/20 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
一个JavaScript的求爱小特效
2014/05/09 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
2017/01/17 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
详解vue中axios的封装
2018/07/18 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
浅谈js中的bind
2019/03/18 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
VTK与Python实现机械臂三维模型可视化详解
2017/12/13 Python
Python 函数基础知识汇总
2018/03/09 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
pandas表连接 索引上的合并方法
2018/06/08 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
大二自我鉴定
2014/01/31 职场文书
派出所所长先进事迹
2014/05/19 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
业务员管理制度范本
2015/08/06 职场文书
python自动化调用百度api解决验证码
2021/04/13 Python