前一陣子,我看到央視新聞中,有一張比較好看數(shù)據(jù)圖,如下:
后來(lái)才知道這叫“南丁格爾玫瑰圖”,是南丁格爾護(hù)士在克里米亞戰(zhàn)爭(zhēng)期間提交的一份關(guān)于士兵死傷報(bào)告時(shí)發(fā)明的一種圖表。
我心想能不能用Python也畫(huà)一個(gè),就去網(wǎng)上搜了一些資料,然后自己搗鼓了一下代碼,并進(jìn)行了梳理,下面是具體步驟。
第一步:安裝并導(dǎo)入相關(guān)包
主要用到了pandas和pyecharts這兩個(gè)包,需要注意的是pyecharts不同版本之間的的代碼可能稍有不同,我這里安裝的最新版,也就是1.7.1
pip install pandaspip install pyecharts
安裝完成后導(dǎo)入:
import pandas as pdfrom pyecharts.charts import Piefrom pyecharts import options as opts
第二步:讀取數(shù)據(jù)
我數(shù)據(jù)放在Excel中,內(nèi)容與上文央視新聞的數(shù)據(jù)一樣,是3月11日前最后一次確診新冠肺炎病例連續(xù)零新增的天數(shù),共計(jì)25個(gè)省市區(qū),如下:
data.xlsx
用pandas讀取數(shù)據(jù):
data = pd.read_excel('data.xlsx')data.sort_values(by='天數(shù)', ascending=False, inplace=True)province = data['省區(qū)市'].values.tolist()days = data['天數(shù)'].values.tolist()
其中第二行代碼的作用是將數(shù)據(jù)降序排列,如果各位事先在Excel中排好序了,就沒(méi)必要寫(xiě)第二行代碼。
之所以要降序,是因?yàn)樽詈笊傻膱D的數(shù)據(jù)順序,與原數(shù)據(jù)順序是一致的,降序后畫(huà)出來(lái)的南丁格爾玫瑰圖更加直觀。
第三步:設(shè)置顏色序列
南丁格爾玫瑰圖是否好看與其顏色十分相關(guān),我們要事先給定每個(gè)數(shù)據(jù)想呈現(xiàn)的顏色,并且盡量讓它們過(guò)渡的自然些。
color_series = ['#faeb23', '#e8e517', '#c9db33', '#9fcb3d', '#6bbe45', '#37b64b', '#3db979', '#11adcf', '#1f9bca', '#1d8fc6', '#2d6da4', '#26539e', '#2a3780', '#423787', '#69398d', '#7d3a93', '#913986', '#cf208f', '#ea257e', '#eb2462', '#ee3131', '#f1562f', '#f67932', '#f89230', '#e2a924']
第四步:實(shí)例化Pie類(lèi)
因?yàn)橹饕玫搅藀yecharts中Pie這個(gè)類(lèi),所以要先實(shí)例化它:
pie = Pie(init_opts=opts.InitOpts(width='1350px', height='900px'))pie.set_colors(color_series)pie.add('', [z for z in zip(province, days)], radius=['30%', '120%'], center=['50%', '66%'], rosetype='area')
第五步:設(shè)置全局配置
pie.set_global_opts(title_opts=opts.TitleOpts(title='多個(gè)省區(qū)市\(zhòng)n確診病例連續(xù)多日', subtitle='零新增', title_textstyle_opts=opts.TextStyleOpts(font_size=32, color='#0c2a46', font_family='KaiTi', font_weight='bold'), subtitle_textstyle_opts=opts.TextStyleOpts(font_size=66, color='#0c2a46', font_family='KaiTi', font_weight='bold'), pos_right='center', pos_left='center', pos_top='58%', pos_bottom='center'), legend_opts=opts.LegendOpts(is_show=True), toolbox_opts=opts.ToolboxOpts(pos_top='5%'))
這里不知道圖例和工具盒是啥也沒(méi)關(guān)系,等看到本文最后生成的圖就知道啦。
第六步:設(shè)置系列配置項(xiàng)
pie.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position='inside', font_size=16, formatter='\n{c}天', font_style='normal', font_weight='bold', font_family='SimHei'))
這些參數(shù)看上去復(fù)雜,其實(shí)就是對(duì)每個(gè)扇形里面的文字樣式進(jìn)行設(shè)置,就不解釋了。
第七步:生成html文件
pie.render('南丁格爾玫瑰圖.html')
將上面的代碼運(yùn)行后,就會(huì)生成一個(gè)html文件,打開(kāi)后如下:
南丁格爾玫瑰圖.html
聯(lián)系客服