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()
在上面的代碼中,我們使用了xlabel
和ylabel
來設置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數據可視化