Python- Matplotlib & pyplot 簡介

Yunya Hsu
7 min readJul 11, 2021

視覺化神器,Matplotlib

Python package中用來視覺化的工具是Matplotlib,其項下有許多sub package,今天首先使用pyplot。

其實還有其他的視覺化工具,之後學到了再來介紹!

import matplotlib.pyplot as plt

用pyplot畫折線圖與散佈圖

接下來,就要使用pyplot來畫圖囉~今天要畫的是全世界歷年人口圖,先想像一下最後的結果:橫軸(X軸)為年份、縱軸(y軸)為人口數
我們先來建立兩個 list 分別包含以上資訊:

year = [1950, 1970, 1990, 2010]
pop = [2.52, 3.70, 5.27, 6.97]

使用pyplot畫圖囉~ plt.plot()第一個變數放X軸資料、第二個變數放Y軸資料,並且使用 .show() 讓python顯示圖表:

plt.plot(year, pop)
plt.show()

剛剛的plt.plot() 把所有資料自動連線了,這個功能有時候很方便,但有時候也會變成災難(想像你有上千筆資料……)
所以,我們也可以改使用plt.scatter() ,python會把結果使用「點」來呈現:

修改座標軸的單位:

plt.xscale('log')#調整x軸的比例,取log

用 pyplot畫直方圖

我們定義一筆新的資料為life_exp,裡面有著各個國家於2020年的預期壽命。我們用它來畫出直方圖,其實相當簡單,與前面的語法大同小異,就直接來吧:

直方圖的一個重要概念是,我們要把這些資料的分界設為多少。以上圖為例,各國家的預期壽命介於40到85歲之間,若沒有設定分界數量 bins ,python會預設為10個bins。但我們若想看更細的分類,可以把bins的數量調高為25:

優化你的圖表

上圖的範例只是很陽春的圖表,以下命令可以讓plot生成的圖表變得更精緻:

在x軸及y軸加上標籤:

plt.xlabel('Year')
plt.ylabel('Population')

為圖表加上標題:

plt.title('World Population Projections')

設置x軸及y軸的刻度:

plt.ytickets([0, 2, 4, 6, 8])#設置完刻度,還可以調整刻度的顯示
plt.ytickets ([0, 2, 4, 6, 8], ['0', '2 billions', '4 billions', 6 billions', '8 billions'])
#第一個list是刻度的value
#第二個list是刻度的label

實際演練!

import matplotlib.pyplot as plt
import numpy as np
#先建立人均GDP/ 平均預期壽命/ 人口數等三項資料,type=list#gdp_cap是GDP per Capita,單位是USD
gdp_cap=[974.5803384, 5937.029525999998, 6223.367465, ...]
#預期壽命,單位是年
life_exp=[43.828, 76.423, 72.301, ...]
#人口數,單位是million
pop=[31.889923, 3.600523, 33.333216, ...]
#將pop做成array,因為後續要計算它
pop_np=np.array(pop)
#double pop_np
pop_np=pop_np * 2
#用pop_np為”gdp與預期壽命“的散佈圖做調整。第一個變數是x軸、第二個變數是y軸、第三個變數是標記大小(可以是標量,也可以是大小等於x或y的數組)
plt.scatter(gdp_cap, life_exp, s=pop_np)
#回傳如下圖
plt.show()
#調整x軸的scale
plt.xscale('log')
#放上各label
plt.xlabel('GDP per Capital [is USD]')
plt.ylabel('Life Expectancy [in year]')
plt.title('World Development in 2007')
#調整x軸和y軸的顯示方式,可以先查詢GDP和壽命的最大最小值
print(max(gdp_cap), min(gdp_cap), max(life_exp), max(life_exp))
>>>>> 49357.19017 277.5518587 82.603 82.603#調整如下:
plt.xticks([1000, 10000, 100000], ['1K','10K','100K'])
plt.yticks([40,45,50,55,60,65,70,75,80,85], ['40y','45y','50y','55y','60y','65y','70y','75y','80y','85y'])
# 定義一組list為每個國家的顏色
col=['red', 'green', 'blue', ...]
#重新畫圖幫圖表加上色彩:c是color,alpha是透明度(0~1之間)
plt.scatter(gdp_cap, life_exp, s=pop_np, c=col, alpha=0.7)
#幫中國和印度加上文字
#使用plt.text(x, y, string),x=x欄的數值、y=y欄的數值、string=我們要加上的文字
plt.text(1550, 71, 'India')
plt.text(5700, 80, 'China')
#加上隔線
plt.grid()

補充說明

之前使用的 plt.scatter其實還有其他細節可以定義:

plt.scatter(x=x_axis_data, y=y_axis_data, s=None, c=None, marker=None, cmap=None, vmin=None, vmax=None, alpha=None, linewidths=None, edgecolors=None)
  • x_axis_data:放在x軸的數據
  • y_axis_data:放在y軸的數據
  • s-標記大小(可以是標量,也可以是大小等於x或y的數組)
  • c-標記的顏色序列的顏色
  • marker-標記樣式
  • cmap-cmap名稱
  • linewidths-標記邊框的寬度
  • edgecolor-標記邊框顏色
  • alpha-混合值,介於0(透明)和1(不透明)之間

除了前兩個變數必填之外,其他所有參數都是可選的,其默認值為None。

--

--