1. 程式人生 > >python 繪相簿 Matplotlib

python 繪相簿 Matplotlib

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()

 

 

 

 只需要配置一下後臺字型就可以了。

 

 

 

 Python 機器學習庫 NumPy 教程