1. 程式人生 > >Matplotlib學習---用matplotlib畫面積圖(area chart)

Matplotlib學習---用matplotlib畫面積圖(area chart)

指南 tac 準備工作 代碼 lib 工作 columns bsp com

這裏利用Nathan Yau所著的《鮮活的數據:數據可視化指南》一書中的數據,學習畫圖。

數據地址:http://book.flowingdata.com/ch05/data/us-population-by-age.xls

準備工作:先導入matplotlib和pandas,用pandas讀取excel文件,然後創建一個圖像和一個坐標軸

import pandas as pd
from matplotlib import pyplot as plt
population=pd.read_excel(r"http://book.flowingdata.com/ch05/data/us-population-by-age.xls
") fig,ax=plt.subplots()

先來看一看這個數據文件:

                                                    Under 5  5 to 19  1860                                                   15.4     35.8   
1870                                                   14.3     35.4   
1880                                                   13.8     34.3   
1890                                                   12.2     33.9   
1900                                                   12.1     32.3   
1910                                                   11.6     30.4   
1920                                                   10.9     29.8   
1930                                                    9.3     29.5   
1940                                                    8.0     26.4   
1950                                                   10.7     23.2   
1960                                                   11.3     27.1   
1970                                                    8.4     29.5   
1980                                                    7.2     24.8   
1990                                                    7.6     21.3   
2000                                                    6.8     21.8   
2005                                                    6.8     20.7   
NaN                                                    
-8.6 -15.1 NaN NaN NaN Read more: Population Distribution by Age, Race... NaN NaN 20 to 44 45 to 64 65+ 1860 35.7 10.4 2.7 1870 35.4 11.9 3.0 1880 35.9 12.6 3.4 1890 36.9 13.1 3.9 1900 37.7 13.7 4.1 1910 39.0 14.6 4.3 1920 38.4 16.1 4.7 1930 38.3 17.4 5.4 1940 38.9 19.8 6.8 1950 37.6 20.3 8.1 1960 32.2 20.1 9.2 1970 31.7 20.6 9.8 1980 37.1 19.6 11.3 1990 40.1 18.6 12.5 2000 37.0 22.0 12.4 2005 35.4 24.6 12.4 NaN
-0.3 14.2 9.7 NaN NaN NaN NaN Read more: Population Distribution by Age, Race... NaN NaN NaN

這個文件記錄的是1860年-2005年美國各年齡段人口占總人口的百分比。由於文件裏有NaN字樣,因此先把有效數據提取出來。然後把各年齡段的人口數據堆疊起來,畫一個面積圖。

面積圖: ax.stackplot(x,y1,y2,y3...)

代碼如下:

import pandas as pd
from matplotlib import pyplot as plt
population=pd.read_excel(r"http://book.flowingdata.com/ch05/data/us-population-by-age.xls")
fig,ax=plt.subplots(figsize=(7,5))

p1=population.iloc[0:16] #提取有效數據
year=p1.index.astype(int) #提取年份,並轉換為整數類型

v1=p1["Under 5"].values #提取5歲以下的數據
v2=p1["5 to 19"].values #提取5-19歲的數據
v3=p1["20 to 44"].values #提取20-44歲的數據
v4=p1["45 to 64"].values #提取45-64歲的數據
v5=p1["65+"].values #提取65歲以上的數據

#設置y軸刻度值的一個helper function
def make_yticks(where):
    ytick=[]
    sum=0
    for i in where:
        sum+=i
        ytick.append(sum)
    return ytick

ax.stackplot(year,v1,v2,v3,v4,v5)
ax.set(xlim=(1860,2005),ylim=(0,100),xlabel="Year",ylabel="Population %")
ax1=ax.twinx() #設置雙y軸,共享x軸
ax.set_yticks(make_yticks(p1.loc[1860])) #設置第一個y軸刻度值
ax1.set_yticks(make_yticks(p1.loc[2005])) #設置第二個y軸刻度值
diff=[i-j for i,j in zip(p1.loc[2005],p1.loc[1860])] #計算2005年減去1860年的差值
for i,j,z in zip(make_yticks(p1.loc[2005]), p1.columns,diff): #設置文字註釋
    ax.text(x=1980,y=i-6,s=j)
    ax.text(x=2020,y=i-6,s=z,fontsize=14,color="b")

plt.show()

圖像如下:

技術分享圖片

可以看出,大的趨勢是:年輕人口比重在逐年減少,老年人口比重則逐年增高。

Matplotlib學習---用matplotlib畫面積圖(area chart)