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 畫素:, 三角形:^
常見的線:
直線:- 虛線: - - 點線:: 點劃線:-. 星號:*
執行結果如下:
添加註釋
先上程式碼;
1 import matplotlib.pyplot as plt 2 import numpy as np 3 4 x = np.linspace(0, 2 * np.pi, 50) 5 y = np.sin(x) 6 plt.plot(x, y) 7 8 x0 = np.pi 9 y0 = 0 10 11 # 畫出標註點 12 plt.scatter(x0, y0, s=50) 13 # 右邊的 14 plt.annotate('sin(np.pi)=%s' % y0, xy=(np.pi, 0), xycoords='data', xytext=(+30, -30), 15 textcoords='offset points', fontsize=16, 16 arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2")) 17 # 左邊的 18 plt.text(0.5, -0.25, "sin(np.pi) = 0", fontdict={'size': 16, 'color': 'r'}) 19 20 plt.show()View Code
有時候我們需要對特定的點進行標註,我們可以使用 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 = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] 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 = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] # 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以下的資料。這與我們的隨機陣列資料剛好吻合。
解決中文亂碼問題
預設情況下,Matplotlib中文會出現亂碼,只顯示方框。
import matplotlib.pyplot as plt x = ['北京', '上海', '深圳', '廣州'] y = [60000, 58000, 50000, 52000] plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤 plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號 plt.plot(x, y) plt.show()
只需要配置一下後臺字型就可以了。