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

2020/08/26 00:09 · python教程 ·  原创文章 · 36阅读 · 0评论

本文以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'})

您可能感兴趣的文章

本文地址:http://www.pythongcs.cn/710.html
文章标签:
版权声明:本文为原创文章,版权归 sanhe 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

 发表评论


表情