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

2020-10-09 0 489

本文以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如何绘制日历图和热力图 http://www.ox520.com/26729.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务