matplotlib學習(一) —— 繪製折線圖、直方圖、散點圖、堆疊圖和餅圖

matplotlib包含了很多數據可視化的模塊,每個模塊包含了很多繪圖使用的API,可參考[matplotlib官網],(https://matplotlib.org/index.html)首先使用pyplot模塊來進行簡單的繪製。


一、繪製折線圖

首先了解一下pyplot.plot()函數的API定義:

matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)[source]

從這裏開始:

import matplotlib.pyplot as plt

x = [1,2,3]
y = [5,7,4]

x2 = [1,2,3]
y2 = [10,14,12]

接着畫出線條:

plt.plot(x, y, label="First Line")
plt.plot(x2, y2, label="Second Line")

設置座標軸名稱、圖形名稱、設置標籤並顯示繪圖結果:

plt.xlabel("Plot Number")
plt.ylabel("Important var")
plt.title("Interesting Graph")
plt.legend()
plt.show()

在上面的代碼中,我們使用了xlabelylabel來設置x、y座標軸的名稱,使用plt.title創建標題,使用plt.legend()生成默認圖例,結果如下:



二、繪製直方圖

繪製直方圖,我們使用hist()函數,首先了解一下matplotlib.pyplot.hist()函數的API定義:

matplotlib.pyplot.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, 
	bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, 
	color=None, label=None, stacked=False, normed=None, *, data=None, **kwargs)

比較常用的幾個參數及其使用方法如下:

argument description
x 一個數組,表示了每一個對象的數值大小
label 字符串類型,表示繪圖的標籤
bins 一個表示容器的列表,如[1,2,3,4]包含[1,2), [2,3), [3,4]
density bool類型,爲True時表示將統計結果歸一化,及所有bin的縱座標和爲1
bottom x軸的參考位置,默認值爲0,如x軸可以放在y=1的位置
align 默認值爲"mid"表示“棒”在bin中的位置,還可取"left",“right”
orientation 默認爲"vertical",表示豎直放置,還可以取"horizontal"
log 默認值爲False,若爲True,則將過濾掉空的bin
color 表示繪圖的顏色,可使用""#ffffff 格式,也可以使用"lightblue"的格式
rwidth 表示條形圖的寬度,默認爲None,若設置爲0.8,則條形圖寬度爲bin的0.8倍
histtype 默認爲bar,表示直方圖,還可以取"step"和stepfilled"

我們畫一個人口年齡分佈的直方圖:

# 繪製直方圖
import matplotlib.pyplot as plt

population_age = [22,55,62,45,21,22,34,42,42,4,99,102,110,
	120,121,122,130,111,115,112,80,75,65,54,44,43,42,48]

bins = [10*i for i in range(14)]

plt.hist(population_age, bins,bottom=0, density=True, histtype="bar", align="mid",
	 log=True, orientation="vertical", color="lightblue", label="bar")

plt.xlabel("age")
plt.ylabel("amount")
plt.title("Age and Population")
plt.legend()
plt.show()

產生的圖標爲:


此外,我們還可以直接使用 pyplot.bar() 函數來繪製直方圖:
先看看pyplot.bar()的API定義:

matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, 
	align='center', data=None, **kwargs)

x 爲橫座標,height 表示橫座標對應的取值
align 有"center"和"edge"兩種取值,
color 爲填充顏色,edgecolor 爲邊框顏色

舉個栗子:

import matplotlib.pyplot as plt

x1 = [1,3,5,7,9]
height1 = [5,2,7,6,8]

x2 = [2,4,6,8,10]
height2 = [8,6,7,2,4]

plt.bar(x1, height1, label="Example One", color="lightgreen",edgecolor="black", width=0.8, align="center")
plt.bar(x2, height2, label="Example Two", color="lightblue", edgecolor="black", width=0.8, align="center")

plt.xlabel("x coordinate")
plt.ylabel("y coordinate")
plt.title("Epic Graph")
plt.legend()
plt.show()

得到下圖:



三、繪製散點圖

接下來,我們使用 pyplot.scatter() 繪製散點圖,下面是API定義:

matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, 
	vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, 
	*, plotnonfinite=False, data=None, **kwargs)

常用參數描述:

arguments description
x, y 列表類型,表示點的x, y座標
s 繪製圖標的大小size
color 填充圖標marker的顏色
marker 圖標樣式,默認爲”o“表示圓點,也可以使用其他的marker
linewidth marker邊緣的寬度,默認值爲0
edgecolor marker邊緣edge的顏色

示例代碼:

import matplotlib.pyplot as plt

x = [1,2,3,4,5,6,7,8,9]
y = [5,2,4,2,1,4,5,2,3]

plt.scatter(x, y, label="skitscat", color="#ffaaaa", 
	s=100, marker="*", alpha=1.0, linewidth=0.1, edgecolor="r")

plt.xlabel("x")
plt.ylabel("y")
plt.title("Points")
plt.legend()
plt.show()

得到下圖:



四、繪製堆疊圖

堆疊圖可以反應不同情況下,各個部分佔整體的比例的變化情況。比如我們一天24小時的安排情況,下面我們使用 stackplot 繪製堆疊圖。
還是先看函數 stackplot() 定義:

matplotlib.pyplot.stackplot(x, *args, labels=(), colors=None, baseline='zero', data=None, **kwargs)[source]

參數不多,含義如下:

arguments description
x 橫座標,一維的列表類型
y y可以由多個一維的列表構成,如y1, y2, y3…
labels 長度爲N的字符串列表
colors 長度爲N的字符串列表

下面繪製一個每天24小時安排的餅狀圖:

import matplotlib.pyplot as plt

days = [1, 2, 3, 4, 5]

sleeping = [7,8,6,11,7]
eatting  = [2,3,4,3,2]
working  = [7,8,7,2,2]
playing  = [8,5,7,8,13]

plt.stackplot(days, sleeping, eatting, working, 
	playing, colors=["m", "c", "r", "k"],
	labels=["sleeping", "eatting", "working", "playing"])

plt.xlabel("day")
plt.ylabel("hours")
plt.title("Time")
plt.legend()
plt.show()

在上面的代碼中,x 就是days,y 就是sleeping, eatting, working和playing,繪製結果如下:



五、繪製餅圖

爲了表示每個部分所佔比例,我們可以使用餅圖,在matplotlib中,可以使用 pyplot.pie() 繪製餅圖,先看pie()定義:

matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, 
	pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, 
	counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, 
	rotatelabels=False, *, data=None)

常用參數及其描述:

arguments description
x 每個部分的數值(比例)
explode N元組類型,表示每一個部分扇形的偏移位置
labels 由字符串組成的N元字符串
colors 有字符串組成的N元字符串
autopic 字符串類型,autopct="%1.1f%%"時顯示比例
shadow bool型,爲True時繪製陰影
startangle 繪製餅圖的起始角度,逆時針

舉個栗子:

import matplotlib.pyplot as plt

factors = [15, 30, 45, 10]
labels = ["Frogs", "Hogs", "Dogs", "Logs"]

kwargs = dict(labels=labels,startangle=90,radius=0.8,
	shadow=True,explode=(0,0.1,0,0),autopct="%1.1f%%")

plt.pie(factors, **kwargs)

plt.title("Pie")
plt.show()

得到下圖:



參考內容:matplotlib數據可視化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章