Python第三方庫matplotlib(2D繪圖庫)入門與進階


一、簡介:

Matplotlib是一個Python 2D繪圖庫,它可以在各種平台上以各種硬拷貝格式和交互式環境生成出具有出版品質的圖形。 Matplotlib可用於Python腳本,Python和IPython shell,Jupyter筆記本,Web應用程序服務器和四個圖形用戶界面工具包

Matplotlib試圖讓簡單的事情變得更簡單,讓無法實現的事情變得可能實現。 只需幾行代碼即可生成繪圖,直方圖,功率譜,條形圖,錯誤圖,散點圖等。 有關示例,請參閱示例圖和縮略圖庫。

為了簡單繪圖,pyplot模塊提供了類似於MATLAB的界面,特別是與IPython結合使用時。 對於高級用戶,您可以通過面向對象的界面或MATLAB用戶熟悉的一組函數完全控制線條樣式,字體屬性,軸屬性等。

二、相關文檔:

官網教程文檔:https://matplotlib.org/users/index.html
各個平台的安裝教程:https://matplotlib.org/users/installing.html

三、入門與進階案例

安裝matplotlib數據圖形化工具:

pip install matplotlib

1、繪制直線

  先通過numpy生成在直線 y = 5 * x + 5 上的一組數據,然后將其繪制在圖表上

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(1, 10, 10)
y = 5 * x + 5
plt.plot(x, y)
plt.show()

  運行上面的代碼,結果如下:

2、繪制折線圖

  繪制折線圖調用的matplotlib的方法一樣,只是使用numpy生成的數據不一樣。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(1,10,10)
y = np.random.normal(1,5,10)
plt.figure()
plt.plot(x,y)
plt.show()

  由於涉及到隨機數,每次運行的結果會不一樣。某次運行結果如下:

3、同時繪制多條樣式不一的曲線

  plot方法可以同時繪制多條圖線,並支持不同的曲線采用不同的樣式和顏色來顯示。在下面的代碼中,plot方法的參數,3個為一組,共3組,每一組的參數分別為 x軸坐標、y軸坐標和樣式。

  樣式用法:

格式:

fmt = '[color][marker][line]'

樣式的第一個字母表示顏色,支持的顏色有:r(red)、g(green)、b(blue)、c(cyan)、m(megenta)、y(yellow)、w(white)、k(black)。

樣式的第二部分表示圖線的填充符號,可以寫:--(虛線)、+(加號)、^(向上的正三角形)、s(正方形)、o(圓形)等。還可以同時采用兩種填充方式,如‘ro--’表示用紅色的虛線及實心圓來同時進行填充。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-10, 10, 100)
plt.plot(x, 100 * x, 'r--', x, 10 * x ** 2, 'g^', x, x ** 3, 'c+')
plt.show()

運行結果如下:

4、繪制散點圖

  調用 scatter 方法可以繪制散點圖。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(1, 10, 10)
y = np.linspace(1, 10, 10)
plt.scatter(x, y)
plt.ylabel('y value')
plt.xlabel('x scale')
plt.title('Scatter Figure')
plt.show()

運行結果如下:

可以通過設置不同參數的形式獲得不同的散點圖:

import numpy as np
import matplotlib.pyplot as plt

# 固定隨機數的seed,使其每次運行產生的結果都一樣
np.random.seed(1)
num = 100
edgeRadius = 0.5
x = np.random.rand(num)
y = np.random.rand(num)
area = (200 * np.random.rand(num))
color = np.sqrt(area)
# 創建區域,用不同的樣式來顯示不同分區的點
triangleArea = np.ma.masked_where(x <= edgeRadius, area)
diamondArea = np.ma.masked_where(x > edgeRadius, area)
plt.scatter(x, y, s=triangleArea, marker='o', c=color)
plt.scatter(x, y, s=diamondArea, marker='d', c=color)
plt.title('Random Scatter')
plt.show()

  運行結果如下:

5、繪制柱狀圖與多個圖形

  在以下示例中, figure函數指定了圖表的編號和大小比例,suptitle設置標題,subplot指定當前繪圖的位置(參數221表示2x2共四個圖形區域,最后的1表示第一個圖形區域)。后面的bar、scatter、plot和pie函數分別繪制了柱狀圖、散點圖、折(直)線圖和餅圖。

import matplotlib.pyplot as plt

labels = ['A', 'B', 'C']
values = [1, 2, 3]

plt.figure(1, figsize=(9, 6))
plt.suptitle('Multiple Plots')

plt.subplot(221)
plt.bar(labels, values)
plt.subplot(222)
plt.scatter(labels, values)
plt.subplot(223)
plt.plot(labels, values)
plt.subplot(224)
plt.pie(values, labels=labels)
plt.show()

  運行結果如下:

1- 簡單圖形繪制

根據坐標點繪制:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([3, 5, 7, 6, 2, 6, 10, 15])
plt.plot(x, y, 'r')  # 折線 1 x 2 y 3 color
plt.plot(x, y, 'g', lw=10)  # 4 line w
# 折線 餅狀 柱狀
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([13, 25, 17, 36, 21, 16, 10, 15])
plt.bar(x, y, 0.2, alpha=1, color='b')  # 5 color 4 透明度 3 0.0
plt.show()

傳入參數是numpy數組時的效果:

import numpy as np
import matplotlib.pyplot as plt

for i in range(0, 15):
    # 1 柱狀圖
    dateOne = np.zeros([2])
    dateOne[0] = i
    dateOne[1] = i
    y = np.zeros([2])
    y[0] = 10
    y[1] = 20
    plt.plot(dateOne, y, 'r', lw=8)
plt.show()

根據函數圖像繪制:

"""簡單圖形繪制"""
import numpy as np
import matplotlib.pyplot as plt

# 從-1-----1之間等間隔采66個數,也就是說所畫出來的圖形是66個點連接得來的
# 注意:如果點數過小的話會導致畫出來的二次函數圖像不平滑
x = np.linspace(-1, 1, 66)
# 繪制y=2x+1函數的圖像
y = 2 * x + 1
plt.plot(x, y)
plt.show()
# 繪制x^2函數的圖像
y = x ** 2
plt.plot(x, y)
plt.show()

2- figure的簡單使用

"""figure的使用"""
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 50)
# figure 1
y1 = 2 * x + 1
plt.figure()
plt.plot(x, y1)
# figure 2
y2 = x ** 2
plt.figure()
plt.plot(x, y2)
# figure 3,指定figure的編號並指定figure的大小,指定線的顏色,寬度和類型
# 一個坐標軸上畫了兩個圖形
y2 = x ** 2
plt.figure(num=5, figsize=(4, 4))
plt.plot(x, y1)
plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--')
plt.show()

一共會畫出三張圖,前兩張和上面的簡單案例畫出來的兩張一樣。第三張:

3- 設置坐標軸

"""設置坐標軸"""
import numpy as np
import matplotlib.pyplot as plt

# 繪制普通圖像
x = np.linspace(-1, 1, 50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
plt.plot(x, y1)
plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--')
# 設置坐標軸的取值范圍
plt.xlim((-1, 1))
plt.ylim((0, 3))
# 設置坐標軸的lable
# 標簽里面必須添加字體變量:fontproperties='SimHei',fontsize=14。不然可能會亂碼
plt.xlabel(u'這是x軸', fontproperties='SimHei', fontsize=14)
plt.ylabel(u'這是y軸', fontproperties='SimHei', fontsize=14)
# 設置x坐標軸刻度,之前為0.25,修改后為0.5
# 也就是在坐標軸上取5個點,x軸的范圍為-1到1所以取5個點之后刻度就變為0.5了
plt.xticks(np.linspace(-1, 1, 5))
plt.show()

上面代碼的基礎上加上下面代碼(直接加在最后一句代碼前面即可):

# 獲取當前的坐標軸,gca = get current axis
ax = plt.gca()
# 設置右邊框和上邊框
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 設置x坐標軸為下邊框
ax.xaxis.set_ticks_position('bottom')
# 設置y坐標軸為左邊框
ax.yaxis.set_ticks_position('left')
# 設置x軸,y軸在(0,0)的位置
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))


如果在上面代碼的最后一句之前加上下面的代碼:

# 設置坐標軸label的大小,背景色等信息
for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(12)
    label.set_bbox(dict(facecolor='green', edgecolor='None', alpha=0.7))

4- 設置legend圖例

"""設置坐標軸"""
import numpy as np
import matplotlib.pyplot as plt

# 繪制普通圖像
x = np.linspace(-1, 1, 50)
y1 = 2 * x + 1
y2 = x**2

plt.figure()
plt.plot(x, y1)
plt.plot(x, y2, color = 'red', linewidth = 1.0, linestyle = '--')

# 設置坐標軸的取值范圍
plt.xlim((-1, 1))
plt.ylim((0, 3))

# 設置坐標軸的lable
#標簽里面必須添加字體變量:fontproperties='SimHei',fontsize=14。不然可能會亂碼
plt.xlabel(u'這是x軸',fontproperties='SimHei',fontsize=14)
plt.ylabel(u'這是y軸',fontproperties='SimHei',fontsize=14)

# 設置x坐標軸刻度, 之前為0.25, 修改后為0.5
#也就是在坐標軸上取5個點,x軸的范圍為-1到1所以取5個點之后刻度就變為0.5了
plt.xticks(np.linspace(-1, 1, 5))
# 獲取當前的坐標軸, gca = get current axis
ax = plt.gca()
# 設置右邊框和上邊框
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 設置x坐標軸為下邊框
ax.xaxis.set_ticks_position('bottom')
# 設置y坐標軸為左邊框
ax.yaxis.set_ticks_position('left')
# 設置x軸, y周在(0, 0)的位置
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))

plt.show()

5- 添加注解和繪制點以及在圖形上繪制線或點

import numpy as np
import matplotlib.pyplot as plt

# 繪制普通圖像
x = np.linspace(-3, 3, 50)
y = 2 * x + 1

plt.figure()
plt.plot(x, y)

# 將上、右邊框去掉
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 設置x軸的位置及數據在坐標軸上的位置
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
# 設置y軸的位置及數據在坐標軸上的位置
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))

# 定義(x0,y0)點
x0 = 1
y0 = 2 * x0 + 1

# 繪制(x0,y0)點
plt.scatter(x0, y0, s=50, color='blue')
# 繪制虛線
plt.plot([x0, x0], [y0, 0], 'k--', lw=2.5)
# 繪制注解一
plt.annotate(r'$2 * x + 1 = %s$' % y0, xy=(x0, y0), xycoords='data', xytext=(+30, -30), textcoords='offset points',
             fontsize=16, arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad = .2'))

# 繪制注解二
plt.text(-3, 3, r'$Test\ text. \mu \sigma_i, \alpha_i$', fontdict={'size': 16, 'color': 'red'})
plt.show()

6- 繪制散點圖

 

 

 

 

 

 

 

https://blog.csdn.net/qq_34337272/article/details/79555544

未完待續

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM