47.Python編程:matplotlib詳解

前言

有時(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

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中

多個(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é)果如下:

對(duì)應(yīng)代碼fig1 = plt.figure(num=11)
對(duì)應(yīng)代碼fig12 = plt.figure(num=12)

坐標(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é)果:


坐標(biāo)軸未設(shè)置時(shí)自適應(yīng)

如果我們覺得上面不符合我們的業(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é)果:


坐標(biāo)軸描述
設(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é)果:


設(shè)置坐標(biāo)軸范圍
坐標(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)軸刻度

特別地,如果想要隱藏坐標(biāo)軸刻度浊猾,則可以這樣設(shè)置荒澡,入?yún)魅肟盏脑M(), 形如:plt.xticks(())plt.yticks(())与殃,分別表示隱藏x軸刻度顯示和隱藏y軸刻度单山。

# 隱藏x軸刻度顯示
plt.xticks(())

# 隱藏y軸刻度
plt.yticks(())

運(yùn)行結(jié)果:


隱藏坐標(biāo)軸刻度
挪動(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中的ccolor的首字母。

繪制散點(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é)果:


散點(diǎn)圖

直方圖

要繪制直方圖钠惩,只需要將之前繪制圖像的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é)果:


將figure變?yōu)?D

有了3Dfigure项秉,我們就可以在此基礎(chǔ)上繪制3D圖像了:ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')其中:
X表示3維中的x;
Y表示3維中的y慷彤;
Z表示3維中的z娄蔼;
rstride=1cstride=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é)果:


3D圖像

說明:
1.為了方便查看3D圖像,我們可以拖拽旋轉(zhuǎn)前标。


拖拽旋轉(zhuǎn)查看3D圖像

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é)果:


plt.subplot方式繪制多子圖
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()
pltsubplot2gird()方式繪制多子圖

上面多子圖宽涌,一一對(duì)應(yīng)的索引如下:

多子圖對(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é)果:


plt.subplots()方式繪制多子圖
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é)果:


gridspec方式繪制多子圖

動(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)入matplotlibanimation動(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é)果:


動(dòng)態(tài)作圖

【提示】
如果你在用PyCharm開發(fā)工具開發(fā)尚镰,遇到動(dòng)畫動(dòng)不了,而代碼也沒有問題哪廓,則可以參考另一篇《解決pycharm 無法顯示動(dòng)態(tài)圖片matplotlib animation》

小結(jié)

本文學(xué)習(xí)matplotlib如何可視化數(shù)據(jù)狗唉,這對(duì)于后面學(xué)習(xí)TensorFlow非常有幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涡真,一起剝皮案震驚了整個(gè)濱河市分俯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哆料,老刑警劉巖澳迫,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剧劝,居然都是意外死亡橄登,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門讥此,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拢锹,“玉大人,你說我怎么就攤上這事萄喳∽湮龋” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵他巨,是天一觀的道長充坑。 經(jīng)常有香客問我,道長染突,這世上最難降的妖魔是什么捻爷? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮份企,結(jié)果婚禮上也榄,老公的妹妹穿的比我還像新娘。我一直安慰自己司志,他們只是感情好甜紫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骂远,像睡著了一般囚霸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上激才,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天拓型,我揣著相機(jī)與錄音额嘿,去河邊找鬼。 笑死吨述,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钞脂。 我是一名探鬼主播揣云,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冰啃!你這毒婦竟也來了邓夕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤阎毅,失蹤者是張志新(化名)和其女友劉穎焚刚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扇调,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矿咕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狼钮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碳柱。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熬芜,靈堂內(nèi)的尸體忽然破棺而出莲镣,到底是詐尸還是另有隱情,我是刑警寧澤涎拉,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布瑞侮,位于F島的核電站,受9級(jí)特大地震影響鼓拧,放射性物質(zhì)發(fā)生泄漏半火。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一季俩、第九天 我趴在偏房一處隱蔽的房頂上張望慈缔。 院中可真熱鬧,春花似錦种玛、人聲如沸藐鹤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娱节。三九已至,卻和暖如春祭示,著一層夾襖步出監(jiān)牢的瞬間肄满,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稠歉,地道東北人掰担。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像怒炸,于是被迫代替她去往敵國和親带饱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狸剃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容