用Python繪製棒棒糖圖表,真的好看!

語言: CN / TW / HK

大家好,我是小F~

條形圖在資料視覺化裡,是一個經常被使用到的圖表。

雖然很好用,也還是存在著缺陷呢。比如條形圖條目太多時,會顯得臃腫,不夠直觀。

棒棒糖圖表則是對條形圖的改進,以一種小清新的設計,清晰明瞭表達了我們的資料。

下面小F就給大家介紹一下,如何使用Python繪製棒棒糖圖表。

使用到的是我國1949到2019年,歷年的出生人口資料,資料來源國家統計局。

首先讀取一下資料。

import pandas as pd 
import matplotlib.pyplot as plt 
 
# 讀取資料 
df = pd.read_csv('data.csv') 
print(df) 

結果如下。

資料集很簡單,每行都只有一個年份和一個值。

先繪製一個帶有每年數值的條形圖。

# 繪製柱狀圖 
plt.bar(df.Year, df.value) 
plt.show() 

兩行程式碼,即可得到一張條形圖圖表,看起來確實是有點擁擠。

下面將最後一年,即2019年的資料區分出來。

給2019年的條形著色為黑色,其他年份為淺灰色。

並且在圖表中新增散點圖,可在條形圖的頂部繪製圓形。

# 新建畫布 
fig, ax = plt.subplots(1, figsize=(12, 8)) 
 
# 年份數 
n = len(df) 
# 顏色設定 
colors = ['black'] + ((n-1)*['lightgrey']) 
plt.bar(df.Year, df.value, color=colors) 
plt.scatter(df.Year, df.value, color=colors) 
plt.show() 

得到結果如下。

顏色已經修改成功,還需要調整一下條形圖的寬度以及頂部圓圈的大小。

# width: 條形圖寬度  s: 散點圖圓圈大小 
plt.bar(df.Year, df.value, color=colors, width=0.2) 
plt.scatter(df.Year, df.value, color=colors, s=10) 
plt.show() 

結果如下。

比起先前的藍色條形圖圖表,棒棒糖圖表確實是好看了不少。

除了用條形圖來繪製棒棒糖圖表,還可以使用線條,這樣整體的寬度會更加一致。

X將Year(年份)資料作為起點和終點,Y以-20和各年份資料作為起點和終點。

import pandas as pd 
import matplotlib.pyplot as plt 
 
# 讀取資料 
df = pd.read_csv('data.csv') 
print(df) 
 
# 新建畫布 
fig, ax = plt.subplots(1, figsize=(12, 8)) 
 
# 年份數 
n = len(df) 
# 顏色設定 
colors = ['black'] + ((n-1)*['lightgrey']) 
# 使用線條 
for idx, val in df.iterrows(): 
    plt.plot([val.Year, val.Year], 
             [-20, val.value], 
             color=colors[idx]) 
plt.show() 

得到結果如下。

可以使用引數標記在兩端繪製圓,而不是隻在頂部生成散點圖。

然後可以通過更改y-limit引數來隱藏最底端的圓。

# 新建畫布 
fig, ax = plt.subplots(1, figsize=(12, 8)) 
 
# 年份數 
n = len(df) 
# 顏色設定 
colors = ['black'] + ((n-1)*['lightgrey']) 
# 使用線條, markersize設定標記點大小 
for idx, val in df.iterrows(): 
    plt.plot([val.Year, val.Year], 
             [-20, val.value], 
             color=colors[idx], 
             marker='o', 
             markersize=3) 
 
# 設定y軸最低值 
plt.ylim(0,) 
plt.show() 

結果如下。

此外還可以調整lw、markersize引數,定義線條的粗細及標記的大小,甚至可以繪製兩次線條以建立輪廓效果。

# 新建畫布 
fig, ax = plt.subplots(1, figsize=(12, 8)) 
color = 'b' 
 
# 年份數 
n = len(df) 
# 顏色設定 
colors = ['black'] + ((n-1)*['lightgrey']) 
# 使用線條 
for idx, val in df.iterrows(): 
    plt.plot([val.Year, val.Year], 
             [-20, val.value], 
             color='black', 
             marker='o', 
             lw=4, 
             markersize=6) 
    plt.plot([val.Year, val.Year], 
             [-20, val.value], 
             color=colors[idx], 
             marker='o', 
             markersize=4) 
 
# 移除上邊框、右邊框 
ax.spines['right'].set_visible(False) 
ax.spines['top'].set_visible(False) 
 
# 設定x、y軸範圍 
plt.xlim(1948, 2020) 
plt.ylim(0,) 
 
# 中文顯示 
plt.rcParams['font.sans-serif'] = ['Songti SC'] 
 
plt.title('中國曆年出生人口資料(萬)', loc='left', fontsize=16) 
plt.text(2019, -220, '來源:國家統計局', ha='right') 
 
# 2019年出生人口數(顯示) 
value_2019 = df[df['Year'] == 2019].value.values[0] 
plt.text(2019, value_2019+80, value_2019, ha='center') 
 
# 儲存圖片 
plt.savefig('chart.png') 

得到結果如下。

黑色不是特別好看,改個顏色看看。

# 新建畫布 
fig, ax = plt.subplots(1, figsize=(12, 8)) 
 
# 年份數 
n = len(df) 
# 顏色設定 
color = 'b' 
colors = ['#E74C3C'] + ((len(df)-1)*['#F5B7B1']) 
# 使用線條 
for idx, val in df.iterrows(): 
    plt.plot([val.Year, val.Year], 
             [-20, val.value], 
             color=colors[idx], 
             marker='o', 
             lw=4, 
             markersize=6, 
             markerfacecolor='#E74C3C') 
 
# 移除上邊框、右邊框 
ax.spines['right'].set_visible(False) 
ax.spines['top'].set_visible(False) 
 
# 設定x、y軸範圍 
plt.xlim(1948, 2020) 
plt.ylim(0,) 
 
# 中文顯示 
plt.rcParams['font.sans-serif'] = ['Songti SC'] 
 
plt.title('中國曆年出生人口資料(萬)', loc='left', fontsize=16) 
plt.text(2019, -220, '來源:國家統計局', ha='right') 
 
# 2019年出生人口數(顯示) 
value_2019 = df[df['Year'] == 2019].value.values[0] 
plt.text(2019, value_2019+80, value_2019, ha='center') 
 
# 儲存圖片 
plt.savefig('chart.png') 

得到結果如下。

現在對於條形圖,你就有了另外一個選擇,即棒棒糖圖表。

此外我們也能瞭解到目前中國的新出生人口數量是越來越少,據說2020年出生人口降幅或超一成,未來幾年恐跌破1000萬...

分享到: