Python 繪相簿 Matplotlib 入門程式碼例項
使用Matplotlib,能夠輕易生成各種影象,例如:直方圖、波譜圖、條形圖、散點圖等。
入門程式碼例項
import matplotlib.pyplot as plt
import numpy as np
# 用np.linspace生成50個元素的陣列,均勻的分佈在(0,2*pi)區間上面
x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)
# 把x;y函式畫出來,用黃色的*-線
plt.plot(x, y, "y*-",label="y=sin(x)")
# 把x,y*2函式畫出來,用品紅的--線
plt.plot(x, y * 2, "m--", label="y=2sin(x)")
plt.legend()
# plt.legend(loc="best")
plt.title("sin(x) & 2sin(x)") # 設定標題
plt.xlim(0, 6) # 設定x座標軸的範圍
plt.ylim(-3, 3) # 設定y座標軸的範圍
# 通過xticks或yticks來設定軸的刻度。
plt.xticks((0, np.pi * 0.5, np.pi, np.pi * 1.5, np.pi * 2))
plt.xlabel("x") # 設定x軸的名稱
plt.ylabel("y") # 設定y軸的名稱
# 展現
plt.show()
程式碼解析:
1、通過np.linspace生成50個元素均勻的分佈在[0,2pi]區間的陣列,
2、plt.plot(x,y,"線的樣式",label="標記")# 前兩個引數時x,y的取值,第三個引數是線的樣式,第四個引數是右上角的標記,和plt.legend()配套使用
3、plt.title("****)設定標題
4、plt.xlim()或plt.ylim()設定x座標軸或者y座標軸的範圍
5、# 通過xticks或yticks來設定軸的刻度。
6、plt.xlabel("x")設定x軸的名稱
常見的顏色:
藍色:b青色:c紅色:r黑色:k
綠色:g品紅:r黃色:y白色:w
常見的點:
點:.方形:s圓:o畫素:,三角形:^
常見的線:
直線:-虛線: - -點線::點劃線:-.星號:*
執行結果如下:
添加註釋
先上程式碼;
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)
plt.plot(x, y)
x0 = np.pi
y0 = 0
# 畫出標註點
plt.scatter(x0, y0, s=50)
# 右邊的
plt.annotate('sin(np.pi)=%s' % y0, xy=(np.pi, 0), xycoords='data', xytext=(+30, -30),
textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2"))
# 左邊的
plt.text(0.5, -0.25, "sin(np.pi) = 0", fontdict={'size': 16, 'color': 'r'})
plt.show()
有時候我們需要對特定的點進行標註,我們可以使用 plt.annotate 函式來實現。
這裡我們要標註的點是 (x0, y0) = (π, 0)。
我們也可以使用 plt.text 函式來添加註釋。
對於 annotate 函式的引數,做一個簡單解釋:
- 'sin(np.pi)=%s' % y0 代表標註的內容,可以通過字串 %s 將 y0 的值傳入字串;
- 引數 xycoords='data' 是說基於資料的值來選位置;
- xytext=(+30, -30) 和 textcoords='offset points' 表示對於標註位置的描述 和 xy 偏差值,即標註位置是 xy 位置向右移動 30,向下移動30;
- arrowprops 是對圖中箭頭型別和箭頭弧度的設定,需要用 dict 形式傳入。
一次性繪製多個圖形
當需要兩組資料進行對比,或者一組資料的不同展示方式,我們就可以在一個視窗中繪製多個圖形。
多個圖形視窗——figure
一個figure就是一個圖形視窗,matplotlib.pyplot會有一個預設的figure,
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(100, 201) # 生成一組100到200,步長為1的陣列
# 在第一個預設視窗畫
plt.plot(data) # 繪製data
data2 = np.arange(200,301)
plt.figure(figsize=(6, 3)) # 生成一個圖形視窗,設定視窗的大小為(6,3)
# 在第二個視窗畫
plt.plot(data2) # 繪製data2
plt.show() # 展現
程式碼解析:
1、matplotlib在繪製圖形的時候都在一個預設的figure中。我們可以通過plt.figure()再建立一個視窗
2、plt.figure()有figsize引數,以陣列形式控制視窗的大小
執行結果如下:
多個子圖——subplot
有時候我們需要將多張子圖展示在一起,可以使用 plt.subplot()實現。即在呼叫plot()函式之前需要先呼叫 subplot()函式。該函式的第一個引數代表子圖的總行數,第二個引數代表子圖的總列數,第三個引數代表活躍區域。下面綁定了例項,也可以不繫結。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)
ax1 = plt.subplot(2, 2, 1) # (行,列,活躍區)
plt.plot(x, np.sin(x), 'r')
ax2 = plt.subplot(2, 2, 2, sharey=ax1) # 與 ax1 共享y軸
plt.plot(x, 2 * np.sin(x), 'g')
ax3 = plt.subplot(2, 1, 2) # 將視窗分為兩行1列,這個圖形佔第二列
plt.plot(x, np.cos(x), 'b')
plt.show()
程式碼解析:
1、subplot(2,2,x)表示將影象視窗分為2行2列。x表示當前子圖所在的活躍區域。
2、subplot(2,1,2)將視窗分為兩行一列,這個圖形畫在第二列
3、plt.subplot(2,2,2,sharey=ax1)# 是與ax1函式共享受一個y軸。
執行結果如下:
注意;subplot函式的引數不僅僅支援上面的這種形式,還可以將三個整數(10之內的)合併一個整數。例如:plt.subplot(2,2,1)可以寫成plt.subplot(221),結果是一樣的。
常用的圖形例項
Matplotlib可以生成非常多的圖形,常用的有:線形圖、散點圖、餅狀圖、條形圖、直方圖。我們來依次瞭解一下。
線形圖——plot
先上程式碼
import matplotlib.pyplot as plt
plt.plot([1,2,3],[3,6,9], "-r")
plt.plot([1,2,3],[2,4,9], ":g")
plt.show()
程式碼解析:
1、plot函式的第一個陣列是橫軸的值,第二個陣列是縱軸的值,
2、最後一個引數是由兩個字元構成,分別是線條的樣式和顏色。前者是紅色的直線,後者是綠色的點線,關於樣式和顏色的說明請參見plor函式的APIDoc:matplotlib.pyplot.plot
執行結果如下:
散點圖——scatter
先上程式碼:
import matplotlib.pyplot as plt
import numpy as np
plt.subplot(2,1,1)
k = 500
x = np.random.rand(k)
y = np.random.rand(k)
size = np.random.rand(k) * 50 # 生成每個點的大小
colour = np.arctan2(x, y) # 生成每個點的顏色
plt.scatter(x, y, s=size, c=colour)
plt.colorbar() # 新增顏色欄
N = 20
# 引數c表示點的顏色,s是點的大小,alpha是透明度
plt.subplot(2,3,4)
plt.scatter(np.random.rand(N) * 100,
np.random.rand(N) * 100,
c="r", s=100, alpha=0.5) # 紅色
plt.subplot(2,3,5)
plt.scatter(np.random.rand(N) * 100,
np.random.rand(N) * 100,
c="g", s=200, alpha=0.5) # 綠色
plt.subplot(2,3,6)
plt.scatter(np.random.rand(N) * 100,
np.random.rand(N) * 100,
c="b", s=300, alpha=0.5) # 藍色
plt.show()
程式碼解析:
1、這幅圖包含三組資料,每組資料都包含了20個隨機座標的位置
2、引數c表示點的顏色,s是點的大小,alpha是透明度
3、plt.colorbar()新增右邊的顏色欄
執行結果:
餅狀圖——pie
先上程式碼:
import matplotlib.pyplot as plt
import numpy as np
labels = ["linuxidc", "Ubuntu", "Fedora", "CentOS", "Debian", "SUSE", "linux"]
data = np.random.rand(7) * 100 # 生成7組隨機數
# labels指定標籤,autopct指定數值的精度
plt.pie(data, labels=labels, autopct="%1.1f%%")
plt.axis("equal") # 設定了座標大小一致
plt.legend() # 指明要繪製的圖例
plt.show()
程式碼解析:
1、data是一個包含7個數據的隨機數值
2、圖中的標籤通過labels來指定
3、autopct指定了數值的精度格式
4、plt.axis('equal')設定了座標軸大小一致
5、plt.legend()指明要繪製圖例(見下圖的右上角)
執行結果:
柱形圖——bar
先上程式碼:
import matplotlib.pyplot as plt
import numpy as np
N = 7
x = np.arange(N)
# randint是不是就是去隨機的整數呢
# 柱形的高度隨機生成
data = np.random.randint(low=0, high=100, size=N)
# 隨機生成顏色
colors = np.random.rand(N * 3).reshape(N,-1)
# labels指定了標籤
labels = ["Linux", "Ubuntu", "CentOS", "Fedora", "openSUSE", "Linuxidc.com", "Debian"]
# title指定了圖形的標題,
plt.title("Weekday Data")
# alpha是透明度
plt.bar(x, data, alpha=0.8, color=colors, tick_label=labels)
# 增加數值
for x, y in zip(x, data):
plt.text(x, y , '%.2f' % y, ha='center', va='bottom')
plt.show()
程式碼解析:
1、繪製了7個隨機值的高度在[0:100]之間的柱形。
2、colors = np.random.rand(N * 3).reshape(N,-1)表示先生成21(Nx3)個隨機數,然後將他們組裝成7行,那麼每行就是三個數,這對應了顏色的三個組成部分。(這裡7行-1列是什麼意思呀)
3、title是指圖形的標題,labels指定了標籤,alpha是透明度
4、plt.text()標記柱形的數值
執行結果:
直方圖——hist
直方圖是描述資料中某範圍內資料出現的頻率,
先上程式碼:
import matplotlib.pyplot as plt
import numpy as np
# 生成3組資料
data = [np.random.randint(0, n, n) for n in [3000, 4000, 5000]]
labels = ['3K', '4K', '5K'] # 設定標籤
# 設定資料點
bins = [0, 100, 500, 1000, 2000, 3000, 4000, 5000]
plt.hist(data, bins=bins, label=labels)
plt.legend()
plt.show()
程式碼解析:
[np.random.randint(0, n, n) for n in [3000, 4000, 5000]]生成了包含三個陣列的列表。
第一個陣列包含了3000個隨機數,這些隨機數的範圍是 [0, 3000)
第二個陣列包含了4000個隨機數,這些隨機數的範圍是 [0, 4000)
第三個陣列包含了5000個隨機數,這些隨機數的範圍是 [0, 5000)
2、bins陣列用來指定我們顯示的直方圖的邊界,即:[0, 100) 會有一個數據點,[100, 500)會有一個數據點,以此類推。所以最終結果一共會顯示7個數據點。
執行結果:
我們看到,三組資料在3000以下都有資料,並且頻度是差不多的。但藍色條只有3000以下的資料,橙色條只有4000以下的資料。這與我們的隨機陣列資料剛好吻合。
Linux公社的RSS地址 : https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2019-03/157706.htm