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写的ARP攻击代码实例
Jun 04 Python
跟老齐学Python之开始真正编程
Sep 12 Python
python实现中文输出的两种方法
May 09 Python
Python找出list中最常出现元素的方法
Jun 14 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
Django 浅谈根据配置生成SQL语句的问题
May 29 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 Python
Python实现生成密码字典的方法示例
Sep 02 Python
基于python生成英文版词云图代码实例
May 16 Python
Python3 requests模块如何模仿浏览器及代理
Jun 15 Python
总结Python变量的相关知识
Jun 28 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中实现汉字转区位码应用源码实例解析
2010/06/14 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
Laravel框架自定义分页样式操作示例
2020/01/26 PHP
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
详解javascript事件冒泡
2016/01/09 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
2016/06/03 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
jQuery.form.js的使用详解
2017/06/14 jQuery
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
Python中replace方法实例分析
2014/08/20 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
Anaconda下安装mysql-python的包实例
2018/06/11 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
雅诗兰黛美国官网:Estee Lauder美国
2016/07/21 全球购物
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
小学端午节活动方案
2014/03/13 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
走近毛泽东观后感
2015/06/04 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python
聊聊Python String型列表求最值的问题
2022/01/18 Python
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技