Python如何繪制日歷圖和熱力圖
本文以2019年全國(guó)各城市的空氣質(zhì)量觀測(cè)數(shù)據(jù)為例,利用matplotlib、calmap、pyecharts繪制日歷圖和熱力圖。在繪圖之前先利用pandas對(duì)空氣質(zhì)量數(shù)據(jù)進(jìn)行處理。
2019年全國(guó)各城市空氣質(zhì)量觀測(cè)數(shù)據(jù)來(lái)源于:https://beijingair.sinaapp.com。
數(shù)據(jù)處理
從網(wǎng)站下載的數(shù)據(jù)為逐小時(shí)數(shù)據(jù),每天一個(gè)文件。如果要繪制全年的日歷圖或者熱圖,首先要將所有的數(shù)據(jù)進(jìn)行合并處理。
下載好數(shù)據(jù)之后,將數(shù)據(jù)解壓到當(dāng)前目錄的2019文件夾內(nèi),然后處理數(shù)據(jù):
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') # 保存以便后續(xù)使用
合并完成數(shù)據(jù)后,讀取數(shù)據(jù)并進(jìn)一步處理:
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 = ['北京', '天津', '石家莊', '邯鄲', '濟(jì)南', '鄭州', '菏澤', '亳州', '徐州', '駐馬店', '南京', '合肥', '馬鞍山', '武漢', '上海', '杭州', '長(zhǎng)沙', '南昌', '上饒', '溫州', '吉安', '贛州', '福州', '龍巖', '廈門', '泉州' ] sub = aqi[cities[::-1]]
繪制熱力圖
因?yàn)榭諝赓|(zhì)量有專門的配色,首先設(shè)置對(duì)應(yīng)等級(jí)的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中關(guān)于繪制日歷圖的工具相對(duì)較少,沒(méi)有特別有些的工具。下面分別使用calmap和pyecharts繪制日歷圖。
注意:calmap已經(jīng)放棄維護(hù)了,在使用過(guò)程中可能會(huì)存在問(wèn)題。本文fork了原來(lái)的源碼,解決了可能遇到的問(wèn)題??梢詮?a target="_blank" rel="external nofollow" >https://github.com/bugsuse/calmap下載源碼,然后執(zhí)行python setup.py install進(jìn)行安裝即可。
注意:本文為了簡(jiǎn)單起見,利用AQI繪圖時(shí),直接對(duì)AQI求日均值,但是實(shí)際情況下是不能直接這樣計(jì)算的。
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'優(yō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, '嚴(yán)重污染', 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,不需要單獨(dú)碼很多代碼,而且功能要更多一些。python在繪制日歷圖方面不是非常友好,相比之下,pyecharts更有優(yōu)勢(shì)。但是pyecharts更適合線上可視化展示,不太適合制作用于發(fā)表論文的圖。
這次就說(shuō)到這了,感興趣的可以去嘗試一下。
以上就是Python如何繪制日歷圖和熱力圖的詳細(xì)內(nèi)容,更多關(guān)于Python繪制日歷圖和熱力圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python壓縮模塊zipfile實(shí)現(xiàn)原理及用法解析
這篇文章主要介紹了Python壓縮模塊zipfile實(shí)現(xiàn)原理及用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-0811行Python代碼實(shí)現(xiàn)解密摩斯密碼
摩爾斯電碼是一種時(shí)通時(shí)斷的信號(hào)代碼,通過(guò)不同的排列順序來(lái)表達(dá)不同的英文字母、數(shù)字和標(biāo)點(diǎn)符號(hào)。本文將通過(guò)Python代碼來(lái)實(shí)現(xiàn)解密摩斯密碼,感興趣的可以學(xué)習(xí)一下2022-04-04Python import用法以及與from...import的區(qū)別
這篇文章主要介紹了Python import用法以及與from...import的區(qū)別,本文簡(jiǎn)潔明了,很容易看懂,需要的朋友可以參考下2015-05-05python中實(shí)現(xiàn)json數(shù)據(jù)和類對(duì)象相互轉(zhuǎn)化的四種方式
在日常的軟件測(cè)試過(guò)程中,測(cè)試數(shù)據(jù)的構(gòu)造是一個(gè)占比非常大的活動(dòng),對(duì)于測(cè)試數(shù)據(jù)的構(gòu)造,分為結(jié)構(gòu)化的數(shù)據(jù)構(gòu)造方式和非結(jié)構(gòu)化的數(shù)據(jù)構(gòu)造方式,此篇文章,會(huì)通過(guò)4種方式來(lái)展示json數(shù)據(jù)與python的類對(duì)象相互轉(zhuǎn)化,需要的朋友可以參考下2024-07-07Python時(shí)間管理黑科技之datetime函數(shù)詳解
在Python中,datetime模塊是處理日期和時(shí)間的標(biāo)準(zhǔn)庫(kù),它提供了一系列功能強(qiáng)大的函數(shù)和類,用于處理日期、時(shí)間、時(shí)間間隔等,本文將深入探討datetime模塊的使用方法,感興趣的可以了解下2023-08-08初探利用Python進(jìn)行圖文識(shí)別(OCR)
這篇文章主要介紹了初探利用Python進(jìn)行圖文識(shí)別(OCR),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02Django中在xadmin中集成DjangoUeditor過(guò)程詳解
這篇文章主要介紹了Django中在xadmin中集成DjangoUeditor過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07