央視都在用的“南丁格爾玫瑰圖”,原來Python也可以畫

前一陣子,我看到央視新聞中,有一張比較好看數據圖,如下:

央視都在用的“南丁格爾玫瑰圖”,原來Python也可以畫

後來才知道這叫“南丁格爾玫瑰圖”,是南丁格爾護士在克里米亞戰爭期間提交的一份關於士兵死傷報告時發明的一種圖表。

我心想能不能用Python也畫一個,就去網上搜了一些資料,然後自己搗鼓了一下代碼,並進行了梳理,下面是具體步驟。


第一步:安裝並導入相關包

主要用到了pandas和pyecharts這兩個包,需要注意的是pyecharts不同版本之間的的代碼可能稍有不同,我這裡安裝的最新版,也就是1.7.1

<code>pip install pandas
pip install pyecharts/<code>

安裝完成後導入:

<code>import pandas as pd
from pyecharts.charts import Pie
from pyecharts import options as opts/<code>


第二步:讀取數據

我數據放在Excel中,內容與上文央視新聞的數據一樣,是3月11日前最後一次確診新冠肺炎病例連續零新增的天數,共計25個省市區,如下:

央視都在用的“南丁格爾玫瑰圖”,原來Python也可以畫

data.xlsx

用pandas讀取數據:

<code>data = pd.read_excel('data.xlsx')
data.sort_values(by='天數', ascending=False, inplace=True)
province = data['省區市'].values.tolist()
days = data['天數'].values.tolist()/<code>

其中第二行代碼的作用是將數據降序排列,如果各位事先在Excel中排好序了,就沒必要寫第二行代碼。

之所以要降序,是因為最後生成的圖的數據順序,與原數據順序是一致的,降序後畫出來的南丁格爾玫瑰圖更加直觀。


第三步:設置顏色序列

南丁格爾玫瑰圖是否好看與其顏色十分相關,我們要事先給定每個數據想呈現的顏色,並且儘量讓它們過渡的自然些。

<code>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']/<code>


第四步:實例化Pie類

因為主要用到了pyecharts中Pie這個類,所以要先實例化它:

<code>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")/<code> 
  • radius:半徑大小,數組的第一項是內半徑,第二項是外半徑,默認為 [0, 75],如果寫百分比就是寬高的尺寸乘以百分比
  • center:中心座標,數組的第一項是橫座標,第二項是縱座標,默認為 [50, 50]
  • rosetype:使用南丁格爾玫瑰圖,並選用模式,有radius和area兩種模式。默認為radius。radius:扇區圓心角展現數據的百分比,半徑展現數據的大小;area:所有扇區圓心角相同,僅通過半徑展現數據大小。


第五步:設置全局配置

<code>pie.set_global_opts(title_opts=opts.TitleOpts(title='多個省區市\n確診病例連續多日', 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%'))/<code>
  • title_opts:主副標題的樣式設置,這裡面的內容看上去比較多,其實大家自己試一下就知道了,類似於CSS,對標題的大小、顏色、字體、是否加粗、位置信息進行設置。
  • legend_opts:是否顯示圖例。
  • toolbox_opts:顯示工具盒,並對其顯示的位置進行設置。

這裡不知道圖例和工具盒是啥也沒關係,等看到本文最後生成的圖就知道啦。


第六步:設置系列配置項

<code>pie.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="inside", font_size=16,
                                               formatter="{b}\n{c}天", font_style="normal",
                                               font_weight="bold", font_family="SimHei"))/<code>

這些參數看上去複雜,其實就是對每個扇形裡面的文字樣式進行設置,就不解釋了。


第七步:生成html文件

<code>pie.render('南丁格爾玫瑰圖.html')/<code>

將上面的代碼運行後,就會生成一個html文件,打開後如下:

央視都在用的“南丁格爾玫瑰圖”,原來Python也可以畫

南丁格爾玫瑰圖.html

其中最上面的就是圖例,點擊一下可以隱藏/顯示相應的區域,右上方的就是工具盒,至於工具盒裡面的功能嘛,就請大家自行摸索啦。


最後我猜很多人,肯定會奇怪為什麼要選用南丁格爾玫瑰圖,明明傳統的餅狀圖或者柱狀圖等都能對數據進行展示,我想這正是當年南丁格爾護士思考的問題,因為在她眼裡,每一個數字都代表了一個生命,要儘量體現出每一點的細微差別,所以從視覺的角度來看,南丁格爾玫瑰圖通過增加半徑這個維度信息,放大了不同數據之間的差別,這樣即便只相差一個值,也能被察覺到。

或許在醫護人員心中,不存在死亡100個人這樣的說法,只存在一個生命逝去這件事,發生了100遍...


關注微信公眾號“Python小鎮”,發現更多幹貨知識!


分享到:


相關文章: