本文以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'})
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'))
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},
2019年北京市AQI日历图
绘制热力图也可以使用seaborn,不需要单独码很多代码,而且功能要更多一些。python在绘制日历图方面不是非常友好,相比之下,pyecharts更有优势。但是pyecharts更适合线上可视化展示,不太适合制作用于发表论文的图。
这次就说到这了,感兴趣的可以去尝试一下。
以上就是Python如何绘制日历图和热力图的详细内容,更多关于Python绘制日历图和热力图的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]