前言
有時(shí)候?yàn)榱酥庇^吮炕,我們需要將數(shù)據(jù)可視化莲绰,Python
編程中最為常用的一個(gè)庫是matplotlib
。那么什么是matplotlib
积担?
Matplotlib
官方是這樣定位自己的:
Matplotlib is a Python 2D plotting library which produces publication quality figures in a variety of hardcopy formats and interactive environments across platforms.
Matplotlib tries to make easy things easy and hard things possible. You can generate plots, histograms, power spectra, bar charts, errorcharts, scatterplots, etc., with just a few lines of code.
Matplotlib
是一個(gè)Python 2D
繪圖庫,它可以在各種平臺(tái)上以各種硬拷貝格式和交互式環(huán)境生成出具有出版品質(zhì)的圖形芝硬。
Matplotlib
試圖讓簡單的事情變得更簡單蚜点,讓無法實(shí)現(xiàn)的事情變得可能實(shí)現(xiàn)。 只需幾行代碼即可生成繪圖拌阴,直方圖绍绘,功率譜,條形圖迟赃,錯(cuò)誤圖陪拘,散點(diǎn)圖等。
總之一句話:Matplotlib
讓繪圖變成了一件非常簡單的事情纤壁。
安裝及導(dǎo)入matplotlib
安裝matplotlib
的指令:
pip install matplotlib
需要注意的是左刽,matplotlib
需要numpy
的支持,如果你還沒安裝numpy
酌媒,請先安裝numpy
:
pip install numpy
推薦的導(dǎo)入matplotlib
寫法:
import matplotlib.pyplot as plt
如果你還沒用過numpy
欠痴,可以先去了解一下numpy基礎(chǔ)知識(shí)后,再回過頭學(xué)習(xí)此節(jié)知識(shí)點(diǎn)秒咨。
核心概念
- figure
matplotlib
官方文檔中找到關(guān)于figure
的定義和解釋:
1.the Figure, which contains all the plot elements.
2.The top level container for all the plot elements.
figure
是一頂級(jí)的容器喇辽,包含了繪圖所有的元素。
如果覺得不好理解拭荤,我們可以簡單粗暴地理解為,每一個(gè)繪圖彈框就是一個(gè)figure
疫诽,繪圖彈框樣式舅世,如下圖:
figure
中的一切元素都可以根據(jù)業(yè)務(wù)需求或個(gè)人喜好自定義:彈框的標(biāo)題、坐標(biāo)軸位置奇徒、坐標(biāo)軸精度雏亚、坐標(biāo)軸刻度、坐標(biāo)軸顯示或隱藏摩钙、繪圖的線條樣式罢低、線條寬度、線條顏色胖笛、圖例网持、注解等所有元素。
【說明】
1.如果需要圖像在多個(gè)不同的figure
彈框中展示长踊,則需要獲取多個(gè)figure
才可以功舀,獲取figure
的方式是:fig = plt.figure()
。
2.一個(gè)figure
到下一個(gè)figure
語句前之間的區(qū)域身弊,屬于該figure
的作圖管轄范圍辟汰;而如果沒有下一個(gè)figure
時(shí)列敲,則到plt.show()
之間的區(qū)域,屬于該figure
的作圖管轄范圍帖汞。在一個(gè)figure
的作圖管轄范圍的圖像都會(huì)展示在同一個(gè)figure
繪畫彈框中戴而。
3.獲取figure
:
fig = plt.figure()
或者獲取figure
的同時(shí)指定figure
繪畫框序號(hào)、尺寸大恤嬲骸:
fig = plt.figure(num=22, figsize=(200, 200))
- 圖像顯示必須show()
matplotlib
作圖所意,要顯示圖像,必須調(diào)用plt.show()
, 否則不顯示鹿鳖。
多個(gè)圖像繪制在單一figure
扁眯,示例如下:
import numpy as np
import matplotlib.pyplot as plt
fig1 = plt.figure(num=11)
# x
x = np.linspace(-5, 5, 20)
# y1
y = x * 2 + 1
# 繪圖y
plt.plot(x, y)
# y2
y2 = x ** 2
plt.plot(x, y2)
# 顯示圖像
plt.show()
運(yùn)行結(jié)果:
多個(gè)圖像分別繪制在各自figure
中,完整示例如下:
import numpy as np
import matplotlib.pyplot as plt
# figure
fig1 = plt.figure(num=11)
# x
x = np.linspace(-5, 5, 20)
# y1
y = x * 2 + 1
# 繪圖y
plt.plot(x, y)
# figure
fig12 = plt.figure(num=12)
# y2
y2 = x ** 2
plt.plot(x, y2)
# 顯示圖像
plt.show()
上面代碼在y1繪制后翅帜,新起了一個(gè)figure
姻檀,對(duì)應(yīng)上面倒數(shù)第4行有效代碼:fig12 = plt.figure(num=12)
。此時(shí)再運(yùn)行涝滴,會(huì)有兩個(gè)圖像彈框绣版,運(yùn)行結(jié)果如下:
坐標(biāo)軸設(shè)置
坐標(biāo)軸未進(jìn)行任何設(shè)置時(shí),會(huì)采用默認(rèn)設(shè)置和自適應(yīng)歼疮,如下:
import numpy as np
import matplotlib.pyplot as plt
# x
x = np.random.randn(10)
# y
y = x * 2 + 1
# 繪圖
plt.plot(x, y)
# 顯示圖像
plt.show()
運(yùn)行結(jié)果:
如果我們覺得上面不符合我們的業(yè)務(wù)需求或個(gè)人喜好杂抽,則可以自定義。比如我們可以:
- 坐標(biāo)軸描述
- 坐標(biāo)軸范圍設(shè)置
- 坐標(biāo)軸刻度
- 挪動(dòng)坐標(biāo)軸
坐標(biāo)軸描述
添加坐標(biāo)軸描述韩脏,設(shè)置x軸plt.xlabel("x軸自定義描述")
缩麸,設(shè)置y軸plt.ylabel("用軸自定義描述")
。完整示例如下:
import numpy as np
import matplotlib.pyplot as plt
# x
x = np.random.randn(10)
# y
y = x * 2 + 1
# 繪圖
plt.plot(x, y)
# 設(shè)置x軸
plt.xlabel("This is X axis")
# 設(shè)置y軸
plt.ylabel("This is Y axis")
# 顯示圖像
plt.show()
運(yùn)行結(jié)果:
設(shè)置坐標(biāo)軸范圍
設(shè)置坐標(biāo)軸范圍赡矢,設(shè)置x軸范圍plt.xlim(tuple)
杭朱,形如plt.xlim((-5, 5))
;設(shè)置y軸plt.ylim(tuple)
吹散,形如plt.ylim((-5, 5))
弧械。完整示例如下:
import numpy as np
import matplotlib.pyplot as plt
# x
x = np.random.randn(10)
# y
y = x * 2 + 1
# 繪圖
plt.plot(x, y)
# 設(shè)置x軸
plt.xlabel("X")
# 設(shè)置y軸
plt.ylabel("Y")
# 設(shè)置x軸范圍
plt.xlim((-5, 5))
# 設(shè)置y軸范圍
plt.ylim((-5, 10))
# 顯示圖像
plt.show()
運(yùn)行結(jié)果:
坐標(biāo)軸刻度
設(shè)置坐標(biāo)軸范圍,設(shè)置x軸范圍plt.xticks(arr)
空民;設(shè)置y軸plt.yticks(arr)
刃唐。
【提示】ticks
有記號(hào)的含義。
將上面例子界轩,加以坐標(biāo)軸刻度顯示設(shè)置画饥,示例如下:
# 設(shè)置x軸刻度顯示
plt.xticks([-2.0, -1.0, 0, 1, 2, 4, 8])
# 設(shè)置y軸刻度顯示
plt.yticks(np.linspace(-3, 3, 10))
運(yùn)行結(jié)果:
特別地,如果想要隱藏坐標(biāo)軸刻度浊猾,則可以這樣設(shè)置荒澡,入?yún)魅肟盏脑M()
, 形如:plt.xticks(())
和plt.yticks(())
与殃,分別表示隱藏x軸刻度顯示和隱藏y軸刻度单山。
# 隱藏x軸刻度顯示
plt.xticks(())
# 隱藏y軸刻度
plt.yticks(())
運(yùn)行結(jié)果:
挪動(dòng)坐標(biāo)軸
在上面介紹圖像彈框元素時(shí)碍现,給出了一個(gè)圖片。其中米奸,圖像四周各有一條黑色實(shí)線昼接,叫做spines
,坐標(biāo)軸就是其中的右側(cè)和底部的兩條悴晰。要挪動(dòng)坐標(biāo)軸慢睡,說白了就是挪動(dòng)右側(cè)和底部的這兩條spine
。
知道了以上信息铡溪,如果想要把坐標(biāo)軸從兩邊挪到坐標(biāo)軸0刻度位置漂辐,我們可以這么干:
import numpy as np
import matplotlib.pyplot as plt
# 移動(dòng)坐標(biāo)軸
figure = plt.figure(num=100)
# x,y
x = np.linspace(-4, 4, 50)
y = x ** 2 - 4
# 獲取到坐標(biāo)軸
ax = plt.gca()
# 隱藏右邊、上邊的spine
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")
# 移動(dòng)兩個(gè)spine到0,0棕硫,達(dá)到把坐標(biāo)軸移動(dòng)的目的
ax.spines["bottom"].set_position(("data", 0))
ax.spines["left"].set_position(("data", 0))
xx_label = r"y = x ^ 2 - 4"
x_label = r"y = x"
plt.title("here is title")
# 繪圖
plt.plot(x, y, color="#ff0000")
# 顯示圖例
plt.legend()
plt.plot(x, x)
# 顯示網(wǎng)格
plt.grid(True)
# 顯示圖例
plt.legend(labels=[xx_label, x_label])
plt.show()
運(yùn)行結(jié)果:
顯示網(wǎng)格
一個(gè)figure中髓涯,默認(rèn)是隱藏網(wǎng)格的。要顯示網(wǎng)格哈扮,只需要設(shè)置:plt.grid(True)
即可纬纪。上面挪動(dòng)坐標(biāo)軸的例子中,已有該項(xiàng)設(shè)置滑肉,可參考倒數(shù)第3行設(shè)置包各。
散點(diǎn)圖scatter
matplotlib
中繪制散點(diǎn)圖,只需要將之前繪制圖像的plt.plot()
靶庙,改用plt.scatter(x_arr, y_arr)
即可问畅。當(dāng)然可以在繪制的時(shí)候,進(jìn)行一些個(gè)性化設(shè)置六荒,形如:
plt.scatter(x_arr, y_arr, s=25, alpha=0.75, cmap="bone")
x_arr
表示橫坐標(biāo)數(shù)據(jù)組成的數(shù)組护姆;
y_arr
表示縱坐標(biāo)數(shù)據(jù)組成的數(shù)組;
s=25
表示點(diǎn)的大刑衤馈签则;
alpha=0.75
表示點(diǎn)的不透明度须床;
cmap="bone"
表示顏色映射铐料,其中cmap
中的c
是color
的首字母。
繪制散點(diǎn)圖豺旬,示例如下:
import numpy as np
import matplotlib.pyplot as plt
# 散點(diǎn)圖
# x, y
x = np.random.normal(0, 1, 20)
y = np.random.normal(0, 1, 20)
# 繪制散點(diǎn)圖
plt.scatter(x, y, s=25, alpha=0.75)
# 隱藏坐標(biāo)軸刻度
plt.xticks(())
plt.yticks(())
# 顯示圖像
plt.show()
運(yùn)行結(jié)果:
直方圖
要繪制直方圖钠惩,只需要將之前繪制圖像的plt.plot()
,改用plt.bar(x_arr, y_arr)
即可族阅。當(dāng)然可以在繪制的時(shí)候篓跛,進(jìn)行一些個(gè)性化設(shè)置,形如:plt.bar(x_arr, y_arr, facecolor="#999999", edgecolor="white")
x_arr
表示直方圖x數(shù)據(jù)
組成的數(shù)組坦刀;
y_arr
表示直方圖y數(shù)據(jù)
組成的數(shù)組愧沟;
facecolor="#999999"
表示直方圖的顏色蔬咬;
edgecolor="white"
表示直方圖的邊框顏色;
繪制直方圖沐寺,示例如下:
import numpy as np
import matplotlib.pyplot as plt
# 直方圖
# x, y
size = 12
x = np.arange(size)
y = np.random.uniform(0, 1, size) * 10
# 直方圖
plt.bar(x, y, edgecolor="white")
plt.bar(x, -y, facecolor="#999999", edgecolor="white")
# 設(shè)置坐標(biāo)
plt.xticks(x)
plt.yticks(np.linspace(-12, 12, 13))
# 顯示數(shù)值
for (X, Y) in zip(x, y):
plt.text(x=X, y=Y+0.2, s="%.1f" % Y, ha="center")
print(X, Y)
# 顯示圖像
plt.show()
運(yùn)行結(jié)果:
等高線
要繪制等高線林艘,只需要將之前繪制圖像的plt.plot()
,改用plt.contour(X, Y, f(X, Y), 10)
即可混坞。當(dāng)然可以在繪制的時(shí)候狐援,進(jìn)行一些個(gè)性化設(shè)置,例如究孕,設(shè)置等高線之間顏色填充:plt.contourf(X, Y, f(X, Y), 10, alpha=0.75, cmap=plt.cm.hot)
啥酱,核心代碼如下:
# 關(guān)聯(lián)表格
X, Y = np.meshgrid(x, y)
# 繪制等高線
c = plt.contour(X, Y, f(X, Y), 10, color="black", linewidth=0.5)
# 設(shè)置等高線之間顏色填充
plt.contourf(X, Y, f(X, Y), 10, alpha=0.75, cmap=plt.cm.hot)
# 顯示高度
plt.clabel(c, inline=True)
說明:繪制等高線c = plt.contour(X, Y, f(X, Y), 10, color="black", linewidth=0.5)
參數(shù)說明:
X
表示直方圖x數(shù)據(jù)
組成的數(shù)組;
Y
表示直方圖y數(shù)據(jù)
組成的數(shù)組厨诸;
f(X, Y)
表示根據(jù)X镶殷、Y
計(jì)算高度的一個(gè)函數(shù);
color="black"
表示等高線的顏色泳猬;
linewidth=0.5
表示等高線的線條寬度批钠;
示例如下:
import numpy as np
import matplotlib.pyplot as plt
# 等高線
n = 64
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
# 定義等高線高度函數(shù)
def f(x, y):
return (1 - y / 2 + x ** 5 + y ** 5) * np.exp(- x ** 2 - y ** 2) * 100
# 生成網(wǎng)格采樣點(diǎn)
X, Y = np.meshgrid(x, y)
# 繪制等高線
c = plt.contour(X, Y, f(X, Y), 10, color="black", linewidth=0.5)
# 設(shè)置等高線之間顏色填充
plt.contourf(X, Y, f(X, Y), 10, alpha=0.75, cmap=plt.cm.hot)
# 顯示高度
plt.clabel(c, inline=True)
plt.xticks(())
plt.yticks(())
plt.show()
運(yùn)行結(jié)果:
圖片
為了能有圖片的數(shù)據(jù),我們先讀取一個(gè)圖片data = plt.imread("yellow.png")
得封。為了能根據(jù)圖片數(shù)據(jù)繪制圖片埋心,只需要plt.imshow(data)
,參數(shù)是上面拿到的圖片的數(shù)據(jù)忙上。這樣就可以繪制圖片了拷呆,示例如下:
import matplotlib.pyplot as plt
# 圖片
# 拿到圖片資源
data = plt.imread("yellow.png")
print(data)
# 繪制圖片
plt.imshow(data)
plt.show()
運(yùn)行結(jié)果:
[[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]
...
[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]
...
[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]
...
[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
...
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]
...
[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]
...
[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]
...
[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]
3D圖像
我們已經(jīng)知道,默認(rèn)情況下畫出的是2D
圖像疫粥,如果想要畫3D
圖像茬斧,我們需要導(dǎo)入matplotlib
中的3D
模塊:from mpl_toolkits.mplot3d import Axes3D
。
我們需要先將figure
變成3D
梗逮,這是繪制3D
圖像的基礎(chǔ):
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 3D 圖像
figure = plt.figure()
# 將figure變?yōu)?d
ax = Axes3D(figure)
運(yùn)行結(jié)果:
有了3D
的figure
项秉,我們就可以在此基礎(chǔ)上繪制3D
圖像了:ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
其中:
X
表示3維中的x;
Y
表示3維中的y慷彤;
Z
表示3維中的z娄蔼;
rstride=1
、cstride=1
分別表示x底哗、y
方向3D
圖像跨度岁诉,值越小越細(xì)致,越大越粗略跋选;
cmap='rainbow'
表示顏色映射涕癣;
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 3D 圖像
figure = plt.figure()
# 將figure變?yōu)?d
ax = Axes3D(figure)
# 定義x, y
x = np.linspace(-2 * np.pi, 2 * np.pi, 50)
y = np.linspace(-2 * np.pi, 2 * np.pi, 50)
# 生成網(wǎng)格采樣點(diǎn)
X, Y = np.meshgrid(x, y)
r = np.sqrt(X ** 2 + Y ** 2)
Z = - np.cos(r)
# 繪制3D圖像
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
# 繪制從3D曲面到底部的投影
ax.contour(X, Y, Z, zdim='z', offset=-4, cmap='rainbow')
ax.contourf(X, Y, Z, zdim='z', offset=-4, cmap='rainbow')
# 設(shè)置z軸范圍
ax.set_zlim((-2, 2))
plt.show()
運(yùn)行結(jié)果:
說明:
1.為了方便查看3D圖像,我們可以拖拽旋轉(zhuǎn)前标。
2.讓3D圖像更加直觀坠韩,我們又在底部添加了登高線圖距潘。當(dāng)然這一部分可以不添加。
# 繪制從3D曲面到底部的投影
ax.contour(X, Y, Z, zdim='z', offset=-4, cmap='rainbow')
ax.contourf(X, Y, Z, zdim='z', offset=-4, cmap='rainbow')
多子圖繪制
要想實(shí)現(xiàn)多子圖繪制只搁,matplotlib
中提供了4種方式:plt.subplot()绽昼、pltsubplot2gird()、plt.subplots()须蜗、gridspec
plt.subplot()方式
plt.subplot()
方式繪制多子圖硅确,只需要傳入簡單幾個(gè)參數(shù)即可:plt.subplot(rows, columns, current_subplot_index)
,形如plt.subplot(2, 2, 1)
明肮,其中:
rows
表示最終子圖的行數(shù);
columns
表示最終子圖的列數(shù);
current_subplot_index
表示當(dāng)前子圖的索引;
當(dāng)然菱农,這幾個(gè)參數(shù)是可以連寫在一起的,同樣可以被識(shí)別柿估。例如:上面的plt.subplot(2, 2, 1)
循未,我們同樣可以這樣寫plt.subplot(221)
,兩者是等價(jià)的秫舌。
plt.subplot()
方式繪制多子圖的妖,示例如下:
import numpy as np
import matplotlib.pyplot as plt
# 子圖1
plt.subplot(2, 2, 1)
plt.scatter(np.linspace(-2, 2, 5), np.random.randn(5))
# 子圖2
plt.subplot(2, 2, 2)
plt.plot(np.linspace(-2, 2, 5), np.random.randn(5))
plt.grid(True)
# 子圖3
plt.subplot(2, 2, 3)
x = np.linspace(0, 5, 5)
plt.bar(x, np.random.random(5))
plt.xticks(np.arange(0, 6))
# 子圖4
plt.subplot(2, 2, 4)
plt.pie(np.random.random(5), labels=list("ABCDE"))
plt.show()
運(yùn)行結(jié)果:
pltsubplot2gird()方式
plt.pltsubplot2gird()
方式繪制多子圖,只需要傳入簡單幾個(gè)參數(shù)即可:plt.pltsubplot2gird(shape, loc, rowspan=, colspan=)
足陨,形如plt.subplot((2, 2), (0, 1), rowspan=2, colspan=2)
嫂粟,其中:
shape
表示由最終子圖的行數(shù)、列數(shù)組成的元組墨缘,如(2, 2)
;
loc
表示當(dāng)前子圖所在的行數(shù)和列數(shù)組成的元組星虹,如(0, 1)
;
rowspan=
表示當(dāng)前子圖的所跨的行數(shù),默認(rèn)值為1;
colspan=
表示當(dāng)前子圖的所跨的列數(shù)镊讼,默認(rèn)值為1;
import numpy as np
import matplotlib.pyplot as plt
# 方式2:plt.subplot2grid()
# 子圖1
shape = (3, 3)
plt.subplot2grid(shape=shape, loc=(0, 0))
plt.scatter(np.linspace(-2, 2, 5), np.random.randn(5))
# 子圖2
plt.subplot2grid(shape=shape, loc=(0, 1), colspan=2)
plt.plot(np.linspace(-2, 2, 5), np.random.randn(5))
# 子圖3
plt.subplot2grid(shape=shape, loc=(1, 0))
x = np.linspace(0, 5, 5)
plt.bar(x, np.random.random(5))
plt.xticks(np.arange(0, 6))
plt.ylim((0, 1.5))
# 子圖4
plt.subplot2grid(shape=shape, loc=(1, 1), rowspan=2)
plt.scatter(np.linspace(-2, 2, 10), np.random.randn(10))
# 子圖5
plt.subplot2grid(shape=shape, loc=(1, 2))
plt.pie(np.random.random(5), labels=list("ABCDE"))
# 子圖6
plt.subplot2grid(shape=shape, loc=(2, 0))
plt.pie(np.random.random(5), labels=["Chinese", "English", "math", "chem", "biology"])
# 子圖7
plt.subplot2grid(shape=shape, loc=(2, 2))
x = np.linspace(0, 5, 5)
plt.bar(x, np.random.random(5))
plt.xticks(np.arange(0, 6))
plt.ylim((0, 1.5))
plt.show()
上面多子圖宽涌,一一對(duì)應(yīng)的索引如下:
plt.subplots()方式
plt.subplots()
方式繪制多子圖,只需要傳入簡單幾個(gè)參數(shù)即可:fig, ((ax00, ax01), (ax10, ax11)) = plt.subplots(rows, cols, sharex=True, sharey=True)
蝶棋,其中:
rows
表示最終子圖的行數(shù);
cols
表示最終子圖的行數(shù);
sharex=True
表示是否共享x軸卸亮,默認(rèn)值為False;
sharey=True
表示是否共享y軸,默認(rèn)值為False;
形如fig, ((ax00, ax01), (ax10, ax11)) = plt.subplots(2, 2, sharex=False, sharey=False)
提示:返回值中玩裙,fig
表示figure
兼贸,如果上面入?yún)?行2列,則返回還有:((ax00, ax01), (ax10, ax11))
献酗,其中寝受,ax00
表示第(0, 0)
坷牛、ax01
表示第(0, 1)
罕偎、ax10
表示第(1, 0)
、ax11
表示第(1, 1)
位置處的子圖京闰;我們就可以拿著這些去畫子圖:
# 方式3 plt.subplots()
fig, ((ax00, ax01), (ax10, ax11)) = plt.subplots(2, 2, sharex=False, sharey=False)
# 子圖1
ax00.scatter(np.linspace(-2, 2, 5), np.random.randn(5))
使用plt.subplots()
的方式繪制多子圖颜及,示例如下:
import numpy as np
import matplotlib.pyplot as plt
# 方式3 plt.subplots()
fig, ((ax00, ax01), (ax10, ax11)) = plt.subplots(2, 2, sharex=False, sharey=False)
# 子圖1
ax00.scatter(np.linspace(-2, 2, 5), np.random.randn(5))
# 子圖2
ax01.plot(np.linspace(-2, 2, 5), np.random.randn(5))
# 子圖3
x = np.linspace(0, 5, 5)
ax10.bar(x, np.random.random(5))
# 子圖4
ax11.pie(np.random.random(5), labels=list("ABCDE"))
plt.show()
運(yùn)行結(jié)果:
gridspec方式
gridspec
方式繪制多子圖甩苛,需要額外導(dǎo)入一個(gè)模塊:
import matplotlib.gridspec as gridspec
此時(shí),只需要傳入簡單幾個(gè)參數(shù)即可:my_gridspec = gridspec.GridSpec(rows, cols)
俏站,其中:
rows
表示最終子圖的行數(shù);
cols
表示最終子圖的行數(shù);
要想繪制子圖讯蒲,我們先通過ax00 = plt.subplot(my_gridspec[0, 0])
拿到子圖,my_gridspec[0, 0]
表示第0行第0列處的子圖肄扎,即:第(0, 0)
位置的子圖墨林,依次類推。
# 子圖1
ax00 = plt.subplot(my_gridspec[0, 0])
gridspec
方式繪制多子圖犯祠,示例如下:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# 方式4
my_gridspec = gridspec.GridSpec(2, 2)
# 子圖1
ax00 = plt.subplot(my_gridspec[0, 0])
ax00.scatter(np.linspace(-2, 2, 5), np.random.randn(5))
# 子圖2
ax01 = plt.subplot(my_gridspec[0, 1])
ax01.plot(np.linspace(-2, 2, 5), np.random.randn(5))
# 子圖3
ax10 = plt.subplot(my_gridspec[1, 0])
ax10.pie(np.random.random(5), labels=list("ABCDE"))
# 子圖4
ax11 = plt.subplot(my_gridspec[1, 1])
x = np.linspace(0, 5, 5)
ax11.bar(x, np.random.random(5))
plt.show()
運(yùn)行結(jié)果:
動(dòng)態(tài)圖像
制作動(dòng)態(tài)圖像旭等,matplotlib
官方是這么介紹的:
The easiest way to make a live animation in matplotlib is to use one of the Animation classes.
方式 | 特點(diǎn) |
---|---|
FuncAnimation | Makes an animation by repeatedly calling a function func . |
ArtistAnimation | Animation using a fixed set of Artist objects. |
這里我們只介紹第一種方式FuncAnimation
,第二種方式可以自己嘗試查閱官網(wǎng)示例衡载。
無論哪種方式搔耕,都需要我們導(dǎo)入matplotlib
的animation
動(dòng)畫模塊:
from matplotlib import animation
FuncAnimation方式
FuncAnimation
這種方式實(shí)現(xiàn)的思路中,包含了2個(gè)關(guān)鍵信息點(diǎn)痰娱,可以理解為一靜一動(dòng)
:
第1點(diǎn):靜態(tài)弃榨,就是要告訴FuncAnimation
對(duì)象,你要繪制的動(dòng)態(tài)圖像的初始狀態(tài)梨睁,這個(gè)一般是自定義一個(gè)初始化函數(shù)鲸睛。形如:
# 初始圖像
def init():
line.set_ydata(np.sin(x))
return line,
第2點(diǎn):動(dòng)態(tài),也就是要告訴FuncAnimation
對(duì)象坡贺,你要繪制的動(dòng)態(tài)圖像的要怎么動(dòng)腊凶,也即如何更新。這個(gè)也是自定義一個(gè)更新函數(shù)來告訴該告訴FuncAnimation
對(duì)象拴念。形如:
# 更新圖片
def update(i):
line.set_ydata(np.sin(x + i/10.0))
return line,
理解了以上2點(diǎn)思路后钧萍,我們就可以把上面自定義的2個(gè)函數(shù),告訴FuncAnimation
對(duì)象了政鼠,通過參數(shù)傳遞的形式告訴风瘦,形如:
ani = animation.FuncAnimation(fig=fig,
init_func=init,
func=update,
frames=1000,
interval=1,
blit=False)
fig=fig
表示圖像figure
對(duì)象;
init_func=init
:傳入的init
是一個(gè)函數(shù)公般,表示初始化圖像万搔;
func=update
傳入的update
是一個(gè)函數(shù),表示要繪制的圖像如何動(dòng)官帘,這個(gè)update
函數(shù)接收一個(gè)形參瞬雹,FuncAnimation
對(duì)象會(huì)每經(jīng)過interval
的時(shí)間后會(huì)調(diào)用該函數(shù),以實(shí)現(xiàn)動(dòng)態(tài)繪制刽虹;
frames=1000
表示動(dòng)畫一個(gè)周期由多少幀組成酗捌;
interval=1
表示幀間隔,單位毫秒;
blit=False
表示是否更新所有點(diǎn)胖缤;
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
# 動(dòng)態(tài)作圖
fig, ax = plt.subplots()
x = np.arange(-2 * np.pi, 2 * np.pi, .01)
line, = ax.plot(x, np.sqrt(x))
# 更新圖片
def update(i):
line.set_ydata(np.sin(x + i/10.0))
return line,
# 初始圖像
def init():
line.set_ydata(np.sin(x))
return line,
# 動(dòng)畫
ani = animation.FuncAnimation(fig=fig,
func=update,
init_func=init,
frames=1000,
interval=1,
blit=False)
# 顯示網(wǎng)格
plt.grid(True)
# 顯示圖像
plt.show()
運(yùn)行結(jié)果:
【提示】
如果你在用PyCharm
開發(fā)工具開發(fā)尚镰,遇到動(dòng)畫動(dòng)不了,而代碼也沒有問題哪廓,則可以參考另一篇《解決pycharm 無法顯示動(dòng)態(tài)圖片matplotlib animation》
小結(jié)
本文學(xué)習(xí)matplotlib
如何可視化數(shù)據(jù)狗唉,這對(duì)于后面學(xué)習(xí)TensorFlow
非常有幫助。