首頁 > 軟體

python使用Matplotlib繪圖及設定範例(用python製圖)

2022-05-14 19:00:14

# matplotlib提供快速繪圖模組pyplot,它模仿了MATLAB的部分功能

import matplotlib.pyplot as plt        #匯入繪圖模組

from matplotlib import pyplot as plt           #兩種匯入方法都可

第一節內容的精簡版總結:

  1. 繪製折線圖(plt.plot)
  2. 設定圖片大小和解析度(plt.figure)
  3. 儲存圖片到本地(plt.savefig)
  4. 設定xy軸刻度和字串(xticks、yticks)
  5. 設定標題、xy軸標籤(title、xlable、ylable)
  6. 設定字型(font_manager.fontProperties,matplotlib.rc)
  7. 同一張圖繪製多線條(plt多次plot)
  8. 新增圖例、繪製網格
  9. 其他影象型別(散點圖plt.scatter,條形圖plt.bar,橫向plt.barh,直方圖plt.hist(bin.width組距、num_bins分多少組、))

一、初識matplotlib.pyplot

準備好製圖資料,傳入引數。即可使用plt.plot(引數)、plt.show()一鍵出圖!

import matplotlib.pyplot as plt
x = [......]
y = [......]
plt.plot(x,y,label='圖例')        #繪圖,並且標註圖例
plt.show()        #顯示
plot.legend(prop=my_font)        #設定顯示圖例,括號中意思為顯示中文(後面講解)

1.繪製影象

plt.plot() 引數設定:

  • color=’ ‘        線條顏色
  • linestyle=’‘        線條風格
  • linewidth=        線條粗細
  • alpha=0.5        透明度        (對照表見常見繪圖屬性設定附表)

一個範例:假設一天中每隔兩個小時(range(2,26,2))的氣溫(℃)分別是[15,13,14.5,17,20,25,26,26,27,22,18,15]

import matplotlib.pyplot as plt
 
x = range(2,26,2)
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
 
# 繪圖
plt.plot(x,y)
# 顯示
plt.show()

繪製出如下圖片:

2.設定圖片大小

在繪製圖片之前,使用plt.figure函數設定圖片大小,其中figsize為元組,分別代表長寬,dpi(Dot Per Inch)為解析度表示的單位之一。

plt.figure(figsize=(20,8),dpi=150)        #圖片大小為20*8,每英寸150個畫素點

3.儲存圖片檔案

plt.savefig("./t1.png")        #將圖片儲存到本地

引號裡為檔案路徑和檔名( ./ 代表當前路徑,png為檔案字尾/格式)

4.設定X,Y軸刻度範圍

設定x,y軸的範圍可以使用多種方法

plt.xticks(x)        # 將x裡的值作為刻度
plt.xticks(range(2,25))        #傳入range數列
plt.yticks(range(min(y),max(y)+1))        #傳入最小到最大值數列
_xticks_lables = [i/2 for i in range(4,49)]                # 生成更復雜的數列
plt.xticks(_xticks_lables[::3])        #取步長作為刻度

自定義刻度內容

_x =list(x) [::3]
_xticks_labels = ["10點{ }分".format(i) for i in _x]
plt.xticks(_x,_xticks_labels)        #分別代表刻度範圍和刻度內容

5.新增描述資訊(標題、軸標籤)

plt.title("折線圖")    #設定標題
plt.xlabel("時間")    #設定x軸標註
plt.ylabel("氣溫")    #設定y軸標註

6.設定顯示中文(匯入字型模組)

from matplotlib import font_manager        #匯入字型管理模組
my_font = font_manager.FontProperties(fname="C:/WINDOWS/Fonts/STSONG.TTF")
#定義中文字型屬性,文字儲存路徑可以在C:/WINDOWS/Fonts/找到,這裡設定為宋體
plt.xlabel("時間",fontproperties = my_font,fontsize = 18)
#在設定x座標中文標註,令fontproperties = my_font,fontsize令字型為18號
#plt.title,plt.ylabel,plt.xticks,plt.yticks設定中文標註類似

7.繪製網格

plt.grid(alpha=0.4)

繪製一個溫度隨時間變化的折線圖範例

import matplotlib.pyplot as plt
import random    #匯入隨機生成模組
from matplotlib import font_manager#匯入字型管理模組
my_font = font_manager.FontProperties(fname="C:/WINDOWS/Fonts/STSONG.TTF")
#定義中文字型屬性,文字儲存路徑可以在C:/WINDOWS/Fonts/找到,本次設定為宋體
 
x = range(0,120)    #x值為0-120
y = [random.randint(20,35) for i in range(120)]     #y值為120個在20-35之間的亂數
 
plt.figure(figsize=(15,10),dpi = 80)    #圖片大小為15*10,每英寸80個畫素點
 
'''調整x軸刻度'''
_xticks_labels = ["10點{}分".format(i) for i in range(60)]
_xticks_labels += ["11點{}分".format(i) for i in range(60,120)]
plt.xticks(list(x)[::5],_xticks_labels[::5],rotation=45)    #rotation旋轉度數
#取步長5,數位和字串一一對應,保證資料的長度一樣
 
'''設定標註'''
plt.title("10點到12點每分鐘溫度變化圖",fontproperties = my_font,fontsize = 24)    #設定標題
plt.xlabel("時間",fontproperties = my_font,fontsize = 18)    #設定x座標標註,字型為18號
plt.ylabel("每分鐘對應的溫度",fontproperties = my_font,fontsize = 18)    #設定y座標標註
 
plt.plot(x,y)   #繪圖
plt.show()  #顯示

二、常見繪圖屬性設定

1.繪圖符號(Makers)

符號

中文說明

英文說明

'.'

圓點

point marker

','

畫素點

pixel marker

'o'

圓圈

circle marker

'v'

向下三角形

triangle_down marker

'^'

向上三角形

triangle_up marker

'<'

向左三角形

triangle_left marker

'>'

向右三角形

triangle_right marker

'1'

向下Y形

tri_down marker

'2'

向上Y形

tri_up marker

'3'

向左Y形

tri_left marker

'4'

向右Y形

tri_right marker

's'

方形

square marker

'p'

五邊形

pentagon marker

'*'

星形

star marker

'h'

六角形1

hexagon1 marker

'H'

六角形2

hexagon2 marker

'+'

加號

plus marker

'x'

叉號

x marker

'D'

鑽石形

diamond marker

'd'

鑽石形(小)

thin_diamond marker

'|'

豎線

vline marker

'_'

橫線

hline marker

2.線型(Line Styles)

符號

中文說明

英文說明

'-'

實線

solid line style

'--'

虛線

dashed line style

'-.'

點劃線

dash-dot line style

':'

點線

dotted line style

3.顏色縮寫(Colors)

多種豐富的顏色對照程式碼參見:RGB顏色值與十六進位制顏色碼轉換工具 (sioe.cn)

符號

中文說明

英文說明

'b'

blue

'g'

green

'r'

red

'c'

cyan

'm'

magenta

'y'

yellow

'k'

black

'w'

white

4.Windows字型中英文名稱對照

中文名稱

英文名稱

黑體

SimHei

微軟雅黑

Microsoft YaHei

微軟正黑體

Microsoft JhengHei

新宋體

NSimSun

新細明體

PMingLiU

細明體

MingLiU

標楷體

DFKai-SB

仿宋

FangSong

楷體

KaiTi

仿宋_GB2312

FangSong_GB2312

楷體_GB2312

KaiTi_GB2312

物件導向方式繪圖

  • matplotlib是一套物件導向的繪相簿,圖中的所有部件都是python物件。
  • pyplot是matplotlib仿照MATLAB提供的一套快速繪圖API,它並不是matplotlib本體。
  • pyplot雖然用起來簡單快捷,但它隱藏了大量的細節,不能使用一些高階功能。
  • pyplot模組內部儲存了當前圖表和當前子圖等資訊,可以分別用gcf()和gca()獲得這兩個物件:
    • plt.gcf(): "Get current figure"獲取當前圖表(Figure物件)
    • plt.gca(): "Get current figure"獲取當前子圖(Axes物件)
  • pyplot中的各種繪圖函數,實際上是在內部呼叫gca獲取當前Axes物件,然後呼叫Axes的方法完成繪圖的。
import matplotlib.pyplot as plt
# 獲取當前的Figure和Axes物件
plt.figure(figsize=(4,3))
fig = plt.gcf()
axes = plt.gca()
print(fig)
print(axes)

設定物件的屬性

matplotlib所繪製的圖表的每一部分都對應一個物件,有兩種方式設定這些物件的屬性:

                通過物件的set_*()方法設定。

                通過pyplot的setp()方法設定。

同樣也有兩種方法檢視物件的屬性:

                通過物件的get_*()方法檢視。

                通過pyplot的getp()方法檢視。

import matplotlib.pyplot as plt
import numpy as np
# 獲取當前的Figure和Axes物件
plt.figure(figsize=(4,3))
fig = plt.gcf() ; axes = plt.gca()
print(fig); print(axes)
x = np.arange(0, 5, 0.1)
# 呼叫plt.plot函數,返回一個Line2D物件列表
lines = plt.plot(x, 0.05*x*x); print(lines)
# 呼叫Line2D物件的set系列方法設定屬性值
# 用set_alpha設定alpha通道,也就是透明度
lines[0].set_alpha(0.5) ; plt.show()
# plt.plot函數可以接受不定個數的位置引數,這些位置引數兩兩配對,生成多條曲線。
lines = plt.plot(x, np.sin(x), x, np.cos(x), x, np.tanh(x))
plt.show()
# 使用plt.setp函數同時設定多個物件的屬性,這裡設定lines列表中所有曲線的顏色和線寬。
plt.setp(lines, color='r', linewidth=4.0);plt.show()
# 使用getp方法檢視所有的屬性
f = plt.gcf(); plt.getp(f)

import numpy as np
import matplotlib.pyplot as plt
# 獲取當前的Figure和Axes物件
plt.figure(figsize=(4,3))
fig = plt.gcf() ; axes = plt.gca()
print(fig); print(axes)
x = np.arange(0, 5, 0.1)
# 呼叫plt.plot函數,返回一個Line2D物件列表
lines = plt.plot(x, 0.05*x*x); print(lines)
# 呼叫Line2D物件的set系列方法設定屬性值
# 用set_alpha設定alpha通道,也就是透明度
lines[0].set_alpha(0.5) ; plt.show()
# plt.plot函數可以接受不定個數的位置引數,這些位置引數兩兩配對,生成多條曲線。
lines = plt.plot(x, np.sin(x), x, np.cos(x), x, np.tanh(x))
plt.show()
# 使用plt.setp函數同時設定多個物件的屬性,這裡設定lines列表中所有曲線的顏色和線寬。
plt.setp(lines, color='r', linewidth=4.0);plt.show()
# 使用getp方法檢視所有的屬性
f = plt.gcf(); plt.getp(f)
# 檢視某個屬性
print(plt.getp(lines[0],"color"))
# 使用物件的get_*()方法
print(lines[0].get_linewidth())
# Figure物件的axes屬性是一個列表,儲存該Figure中的所有Axes物件。
# 下面程式碼檢視當前Figure的axes屬性,也就是gca獲得的當前Axes物件。
print(plt.getp(f, 'axes'))
print(len(plt.getp(f, 'axes')))
print(plt.getp(f, 'axes')[0] is plt.gca())
# 用plt.getp()可以繼續獲取AxesSubplot物件的屬性,例如它的lines屬性為子圖中的Line2D物件列表。
# 通過這種方法可以檢視物件的屬性值,以及各個物件之間的關係。
all_lines = plt.getp(plt.gca(), "lines");print(all_lines)
plt.close() # 關閉當前圖表

 繪製多個子圖

在matplotlib中,一個Figure物件可以包括多個Axes物件(也就是子圖),一個Axes代表一個繪圖區域。最簡單的多子圖繪製方式是使用pyplot的subplot函數。

subplot(numRows, numCols, plotNum)接受三個引數:

                numRows:子圖行數

                numCols:子圖列數

                plotNum:第幾個子圖(按從左到右,從上到下的順序編號)

import matplotlib.pyplot as plt
# 建立3行2列,共計6個子圖。
# subplot(323)等價於subplot(3,2,3)。
# 子圖的編號是從1開始,不是從0開始。
fig = plt.figure(figsize=(4,3))
for idx,color in enumerate('rgbcyk'):
    plt.subplot(321+idx, facecolor=color)
plt.show()
# 如果新建立的子圖和之前建立的有重疊區域,則之前的子圖會被刪除
plt.subplot(221)
plt.show()
plt.close()
# 還可以用多個高度或寬度不同的子圖相互拼接
fig = plt.figure(figsize=(4,3))
plt.subplot(221) # 第一行左圖
plt.subplot(222) # 第一行右圖
plt.subplot(212) # 第二行整行
plt.show()
plt.close()

三、Artist物件

簡單型別Artist物件是標準的繪圖元件,例如Line2D,Rectangle,Text,AxesImage等

容器型別Artist物件包含多個Artist物件使他們組織成一個整體例如Axis,Axes,Figure物件

Artist物件進行繪圖的流程

  • 建立Figure物件
  • 為Figure物件建立一個或多個Axes物件
  • 呼叫Axes物件的方法來建立各種簡單的Artist物件
import matplotlib.pyplot as plt
fig = plt.figure()
# 列表用於描述圖片所在的位置以及圖片的大小
ax = fig.add_axes([0.15, 0.1, 0.7, 0.3])
ax.set_xlabel('time')
line = ax.plot([1, 2, 3], [1, 2, 1])[0]
# ax的lines屬性是一個包含所有曲線的列表
print(line is ax.lines[0])
# 通過get_*獲得相應的屬性
print(ax.get_xaxis().get_label().get_text())
plt.show()

設定Artist屬性

 get_* 和 set_* 函數進行讀寫fig.set_alpha(0.5*fig.get_alpha())

Artist 屬性

作用

alpha

透明度,值在0到1之間,0為完全透明,1為完全不透明

animated

布林值,在繪製動畫效果時使用

axes

此Artist物件所在的Axes物件,可能為None

clip_box

物件的裁剪框

clip_on

是否裁剪

clip_path

裁剪的路徑

contains

判斷指定點是否在物件上的函數

figure

所在的Figure物件,可能為None

label

文字標籤

picker

控制Artist物件選取

transform

控制偏移旋轉

visible

是否可見

zorder

控制繪圖順序

一些例子

import matplotlib.pyplot as plt
fig = plt.figure()
# 設定背景色
fig.patch.set_color('g')
# 必須更新介面才會有效果
fig.canvas.draw()
plt.show()
# artist物件的所有屬性都可以通過相應的get_*()和set_*()進行讀寫
# 例如設定下面影象的透明度
line = plt.plot([1, 2, 3, 2, 1], lw=4)[0]
line.set_alpha(0.5)
line.set(alpha=0.5, zorder=1)
# fig.canvas.draw()
# 輸出Artist物件的所有屬性名以及與之對應的值
print(fig.patch)
plt.show()

 

import matplotlib.pyplot as plt
fig = plt.figure()
fig.subplots_adjust(top=0.8)
ax1 = fig.add_subplot(211)
ax1.set_ylabel('volts')
ax1.set_title('a sine wave')
t = np.arange(0.0, 1.0, 0.01)
s = np.sin(2*np.pi*t)
line, = ax1.plot(t, s, color='blue', lw=2)
# Fixing random state for reproducibility
np.random.seed(19680801)
ax2 = fig.add_axes([0.15, 0.1, 0.7, 0.3])
n, bins, patches = ax2.hist(np.random.randn(1000), 50,
    facecolor='yellow', edgecolor='orange')
ax2.set_xlabel('time (s)')
plt.show()

 

 Figure容器

最上層的Artist物件是Figure,包含組成圖表的所有元素

Figure可以包涵多個Axes(多個圖表),建立主要有三種方法:

  • axes = fig.add_axes([left, bottom, width, height])
  • fig, axes = plt.subplots(行數, 列數)
  • axes = fig.add_subplot(行數, 列數, 序號)

Figure 屬性

說明

axes

Axes物件列表

patch

作為背景的Rectangle物件

images

FigureImage物件列表,用來顯示圖片

legends

Legend物件列表

lines

Line2D物件列表

patches

patch物件列表

texts

Text物件列表,用來顯示文字

import matplotlib.pyplot as plt
# 下面請看一個多Figure,多Axes,互相靈活切換的例子。
plt.figure(1) # 建立圖表1
plt.figure(2) # 建立圖表2
ax1 = plt.subplot(121) # 在圖表2中建立子圖1
ax2 = plt.subplot(122) # 在圖表2中建立子圖2
x = np.linspace(0, 3, 100)
for i in range(5):
    plt.figure(1) # 切換到圖表1
    plt.plot(x, np.exp(i*x/3))
    plt.sca(ax1) # 選擇圖表2的子圖1
    plt.plot(x, np.sin(i*x))
    plt.sca(ax2) # 選擇圖表2的子圖2
    plt.plot(x, np.cos(i*x))
    ax2.plot(x, np.tanh(i*x)) # 也可以通過ax2的plot方法直接繪圖
plt.show()
plt.close() # 開啟了兩個Figure物件,因此要執行plt.close()兩次
plt.close()
# 還可以使用subplots函數,一次生成多個子圖,並返回Figure物件和Axes物件陣列。
# 注意subplot和subplots兩個函數差一個s,前者是逐個生成子圖,後者是批次生成。
fig, axes = plt.subplots(2, 3, figsize=(4,3))
[a,b,c],[d,e,f] = axes
print(axes.shape)
print(b)
plt.show()
plt.close()

 

 Axes容器

  • 影象的區域,有資料空間(標記為內部藍色框)
  • 圖形可以包含多個 Axes,軸物件只能包含一個圖形
  • Axes 包含兩個(或三個)Axis物件,負責資料限制
  • 每個軸都有一個標題(通過set_title()設定)、一個x標籤(通過set_xLabel()設定)和一個通過set_yLabel()設定的y標籤集。

Axes 屬性

說明

artists

A list of Artist instances

patch

Rectangle instance for Axes background

collections

A list of Collection instances

images

A list of AxesImage

legends

A list of Legend instances

lines

A list of Line2D instances

patches

A list of Patch instances

texts

A list of Text instances

xaxis

matplotlib.axis.XAxis instance

yaxis

matplotlib.axis.YAxis instance

Axes的方法(Helper method)

所建立的物件(Artist )

新增進的列表(Container)

ax.annotate - text annotations

Annotate

ax.texts

ax.bar - bar charts

Rectangle

ax.patches

ax.errorbar - error bar plots

Line2D and Rectangle

ax.lines and ax.patches

ax.fill - shared area

Polygon

ax.patches

ax.hist - histograms

Rectangle

ax.patches

ax.imshow - image data

AxesImage

ax.images

ax.legend - axes legends

Legend

ax.legends

ax.plot - xy plots

Line2D

ax.lines

ax.scatter - scatter charts

PolygonCollection

ax.collections

ax.text - text

Text

ax.texts

 subplot2grid函數進行更復雜的佈局。subplot2grid(shape, loc, rowspan=1, colspan=1, **kwargs)

  • shape為表示表格形狀的元組(行數,列數)
  • loc為子圖左上角所在的座標元組(行,列)
  • rowspan和colspan分別為子圖所佔據的行數和列數 
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(6,6))
ax1 = plt.subplot2grid((3,3),(0,0),colspan=2)
ax2 = plt.subplot2grid((3,3),(0,2),rowspan=2)
ax3 = plt.subplot2grid((3,3),(1,0),rowspan=2)
ax4 = plt.subplot2grid((3,3),(2,1),colspan=2)
ax5 = plt.subplot2grid((3,3),(1,1))
plt.show()
plt.close()

座標軸上的刻度線、刻度文字、座標網格及座標軸標題等

set_major_*   set_minor_*

get_major_*   get_minor_*

import numpy as np
import matplotlib.pyplot as plt
# plt.figure creates a matplotlib.figure.Figure instance
fig = plt.figure()
rect = fig.patch # a rectangle instance
rect.set_facecolor('yellow')
ax1 = fig.add_axes([0.1, 0.3, 1,1])
rect = ax1.patch
rect.set_facecolor('orange')
for label in ax1.xaxis.get_ticklabels():
    # label is a Text instance
    label.set_color('red')
    label.set_rotation(45)
    label.set_fontsize(16)
for line in ax1.yaxis.get_ticklines():
    # line is a Line2D instance
    line.set_color('green')
    line.set_markersize(5)
    line.set_markeredgewidth(3)
plt.show()

 

座標軸刻度設定

matplotlib會按照使用者所繪製的圖的資料範圍自動計算,但有的時候也需要我們自定義。

我們有時候希望將座標軸的文字改為我們希望的樣子,比如特殊符號,年月日等。

# 修改座標軸刻度的例子
# 設定X軸的刻度線的位置和文字,並開啟副刻度線
# 匯入fractions包,處理分數
import numpy as np
import matplotlib.pyplot as plt
from fractions import Fraction
# 匯入ticker,刻度定義和文字格式化都在ticker中定義
from matplotlib.ticker import MultipleLocator, FuncFormatter 
x = np.arange(0, 4*np.pi, 0.01)
fig, ax = plt.subplots(figsize=(8,4))
plt.plot(x, np.sin(x), x, np.cos(x))
# 定義pi_formatter, 用於計算刻度文字
# 將數值x轉換為字串,字串中使用Latex表示數學公式。
def pi_formatter(x, pos): 
    frac = Fraction(int(np.round(x / (np.pi/4))), 4)
    d, n = frac.denominator, frac.numerator
    if frac == 0:
        return "0"
    elif frac == 1:
        return "$pi$"
    elif d == 1:
        return r"${%d} pi$" % n
    elif n == 1:
        return r"$frac{pi}{%d}$" % d
    return r"$frac{%d pi}{%d}$" % (n, d)
# 設定兩個座標軸的範圍
plt.ylim(-1.5,1.5)
plt.xlim(0, np.max(x))
# 設定圖的底邊距
plt.subplots_adjust(bottom = 0.15)
plt.grid() #開啟網格
# 主刻度為pi/4
# 用MultipleLocator以指定數值的整數倍放置刻度線
ax.xaxis.set_major_locator( MultipleLocator(np.pi/4) )
# 主刻度文字用pi_formatter函數計算
# 使用指定的函數計算刻度文字,這裡使用我們剛剛編寫的pi_formatter函數
ax.xaxis.set_major_formatter( FuncFormatter( pi_formatter ) ) 
# 副刻度為pi/20
ax.xaxis.set_minor_locator( MultipleLocator(np.pi/20) )
# 設定刻度文字的大小
for tick in ax.xaxis.get_major_ticks():
    tick.label1.set_fontsize(16)
plt.show()
plt.close()

import datetime 
import numpy as np
import matplotlib.pyplot as plt
# 準備資料
x = np.arange(0,10,0.01)
y = np.sin(x)
# 將資料轉換為datetime物件列表
date_list = []
date_start = datetime.datetime(2000,1,1,0,0,0)
delta = datetime.timedelta(days=1)
for i in range(len(x)):
    date_list.append(date_start + i*delta)
# 繪圖,將date_list作為x軸資料,當作引數傳遞
fig, ax = plt.subplots(figsize=(10,4))
plt.plot(date_list, y)
# 設定標題
plt.title('datetime example')
plt.ylabel('data')
plt.xlabel('Date')
plt.show()
plt.close()

 

如果資料中本來就有時間日期資訊,可以使用strptime和strftime直接轉換。

使用strptime函數將字串轉換為time,使用strftime將time轉換為字串。

python中的時間日期格式化符號:

符號

意義

%y

兩位數的年份表示(00-99)

%Y

四位數的年份表示(000-9999)

%m

月份(01-12)

%d

月內中的一天(0-31)

%H

24小時制小時數(0-23)

%I

12小時制小時數(01-12)

%M

分鐘數(00=59)

%S

秒(00-59)

%a

本地簡化星期名稱

%A

本地完整星期名稱

%b

本地簡化的月份名稱

%B

本地完整的月份名稱

%c

本地相應的日期表示和時間表示

%j

年內的一天(001-366)

%p

本地A.M.或P.M.的等價符

%U

一年中的星期數(00-53)星期天為星期的開始

%w

星期(0-6),星期天為星期的開始

%W

一年中的星期數(00-53)星期一為星期的開始

%x

本地相應的日期表示

%X

本地相應的時間表示

%Z

當前時區的名稱

%%

%號本身

總結

到此這篇關於python使用Matplotlib繪圖及設定的文章就介紹到這了,更多相關python Matplotlib繪圖設定內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com