1. 程式人生 > 程式設計 >Python如何繪製日曆圖和熱力圖

Python如何繪製日曆圖和熱力圖

本文以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,1)edate = datetime(2019,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,vmax=300,)
ax2 = fig.add_axes([0.94,0.4,0.015,0.2])cb1 = mpl.colorbar.ColorbarBase(ax2,ticks=levels,orientation='vertical',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)end = datetime(2019,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,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繪製日曆圖和熱力圖的資料請關注我們其它相關文章!