matplotlib 畫圖神器

Matplotlib 可能是 Python 2D-繪圖領(lǐng)域使用最廣泛的套件。它能讓使用者很輕松地將數(shù)據(jù)圖形化,并且提供多樣化的輸出格式。

加上mpl_toolkits.mplot3d的3D繪圖功能,感覺跟Matlab的繪圖功能有的比了,更重要的是可以直接用python繪圖,非常適合給機(jī)器學(xué)習(xí)的代碼用作可視化工具。

強(qiáng)烈推薦莫煩大神的視頻教程《matplotlib

安裝方法:pip install matplotlib

幾個(gè)常用的繪圖方法

  • 直線/曲線圖:plot
  • 柱狀圖:bar
  • 點(diǎn)狀圖:scatter
  • 等高線圖:contourf contour
  • 3D曲面:plot_surface (需要配合mpl_toolkits庫(kù))
  • 多個(gè)子圖:subplot

下面我列舉了不同圖形的代碼和圖片效果,主要摘抄莫煩大神的教程,不過我加上了額外的一些詳細(xì)注釋。上手就能運(yùn)行。

直線/曲線圖

import matplotlib.pyplot as plt
import numpy as np 

# 畫二維圖
x = np.linspace(-3, 3, 50)  # 范圍和個(gè)數(shù)
y1 = 2 * x + 1  # 直線
y2 = x ** 2 # 曲線

# -------------- 最簡(jiǎn)單的圖像展示 --------------
# plt.figure()
# plt.plot(x, y2)
# plt.show()

# -------------- 帶參數(shù)的圖像展示 --------------
plt.figure(num=3, figsize=(8,5),) # num:編號(hào)(圖像文件標(biāo)題為Figure_num), figsize:大小

# 直接繪圖
# plt.plot(x, y2)
# plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')

# 帶圖例的圖像展示,顯示哪根線是哪根線
l1, = plt.plot(x, y1, label='linear line') # l1以逗號(hào)結(jié)尾,因?yàn)閜lt返回的是一個(gè)列表
l2, = plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='square line')
# plt.legend(loc='lower right') # 把圖例放在不同的位置組合  upper lower center right left
plt.legend(handles=[l1, l2], labels=['l1', 'l2'],  loc='best') # 可以重命名label, 并自動(dòng)選擇最佳位置放圖例
 # 'best' : 0,          
 # 'upper right'  : 1,
 # 'upper left'   : 2,
 # 'lower left'   : 3,
 # 'lower right'  : 4,
 # 'right'        : 5,
 # 'center left'  : 6,
 # 'center right' : 7,
 # 'lower center' : 8,
 # 'upper center' : 9,
 # 'center'       : 10,

# 坐標(biāo)軸設(shè)置
plt.xlabel('X axis') # x坐標(biāo)軸
plt.ylabel('Y axis') # y坐標(biāo)軸

plt.xlim((-1, 2)) # x刻度范圍
plt.ylim((-2, 3)) # y刻度范圍

plt.xticks(np.linspace(-1, 2, 5)) # 重定義x軸刻度
plt.yticks([-2, -1.8, -1, 1.22, 3], [r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$']) # 重定義y軸刻度

axy = plt.gca() # 獲取當(dāng)前坐標(biāo)軸信息
axy.spines['right'].set_color('none') # 設(shè)置右邊框?yàn)榭?axy.spines['top'].set_color('none') # 設(shè)置頂邊框?yàn)榭?axy.xaxis.set_ticks_position('bottom') # 設(shè)置x軸坐標(biāo)刻度數(shù)字的位置為bottom(還有top\both\default\none)
axy.spines['bottom'].set_position(('data', 0)) # 把bottom邊框移到y(tǒng)=0的位置 (位置屬性:outward\axes\data)
axy.yaxis.set_ticks_position('left') # 設(shè)置y軸坐標(biāo)刻度數(shù)字為left
axy.spines['left'].set_position(('data', 0)) # 把left邊框移動(dòng)到x=0的位置

# 畫點(diǎn)和垂直線,并對(duì)點(diǎn)進(jìn)行標(biāo)注
x0 = 0.5
y0 = 2*x0 + 1
plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5) # 畫出一條垂直于x軸的虛線.
plt.scatter([x0, ], [y0, ], s=50, color='b') # 畫點(diǎn)
plt.annotate(r'$2x+1=%s$' % y0,     # 標(biāo)注的文字
             xy=(x0, y0),           # 標(biāo)注的數(shù)據(jù)點(diǎn)
             xycoords='data',       # 基于數(shù)據(jù)的值來(lái)選位置
             xytext=(+20, -30),     # 標(biāo)注的位置(相對(duì)坐標(biāo)位置)
             textcoords='offset points',   # xy偏差值
             fontsize=12,           # 字體大小
             arrowprops=dict(arrowstyle='->', connectionstyle="arc3, rad=.3")) # 連線類型設(shè)置為箭頭,有弧度, rad為弧度值

# 添加注釋
plt.text(0.5, -1.8, r'$Text:\ \mu\ \sigma_i\ \alpha_t.\ written\ by\ likejiao.$')

# 最后展示圖片
plt.show()
plot

柱狀圖

import matplotlib.pyplot as plt
import numpy as np 

n = 12 # 生成n個(gè)數(shù)據(jù)
X = np.arange(n) # X為0到n-1的整數(shù)
Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n) # Y1和Y2都是隨機(jī)分布的數(shù)據(jù)
Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)

plt.bar(X, +Y1) # 畫在坐標(biāo)軸上方
plt.bar(X, -Y2) # 畫在坐標(biāo)軸下方

# 設(shè)置橫縱坐標(biāo)的邊界,去掉橫坐標(biāo)的線
plt.xlim(-.5, n)
plt.xticks(())
plt.ylim(-1.25, 1.25)
plt.yticks(())

# 加顏色優(yōu)化圖像,facecolor設(shè)置主體顏色,edgecolor設(shè)置邊框顏色
plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')

# 加數(shù)值優(yōu)化圖像
for x, y in zip(X, Y1):
    # ha: horizontal alignment 橫向?qū)R
    # va: vertical alignment 縱向?qū)R
    plt.text(x + 0.4, y + 0.05, '%.2f' % y, ha='center', va='bottom')

for x, y in zip(X, Y2):
    # ha: horizontal alignment
    # va: vertical alignment
    plt.text(x + 0.4, -y - 0.05, '%.2f' % y, ha='center', va='top')

# 最后展示圖片
plt.show()
bar

點(diǎn)狀圖

import matplotlib.pyplot as plt
import numpy as np 

n = 1024 # 數(shù)據(jù)集的大小,下面兩行生產(chǎn)1024個(gè)呈正態(tài)分布的二維數(shù)據(jù)組(平均數(shù)是0,方差是1)
X = np.random.normal(0, 1, n) # 每一個(gè)點(diǎn)的X值
Y = np.random.normal(0, 1, n) # 每一個(gè)點(diǎn)的Y值
T = np.arctan2(Y, X) # 計(jì)算每一個(gè)點(diǎn)的顏色

plt.scatter(X, Y, s=75, c=T, alpha=.5) # s:size, c:color, alpha透明度為50%

plt.xlim(-1.5, 1.5)
plt.xticks(()) # 隱藏x坐標(biāo)軸
plt.ylim(-1.5, 1.5)
plt.yticks(()) # 隱藏y坐標(biāo)軸

# 最后展示圖片
plt.show()
scatter

等高線圖

import matplotlib.pyplot as plt
import numpy as np

def f(x,y):
    # the height function 生成高度值
    return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2) 

# 生成n個(gè)數(shù)值
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X,Y = np.meshgrid(x, y) # 在二維平面上把每一個(gè)x和y一一對(duì)應(yīng)編織成柵格

# plt.contourf 填充顏色
# X, Y and value for (X,Y) point 
plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot) # alpha:透明度, cmap:可以生成對(duì)應(yīng)的暖色組, 其中8代表等高線的密集程度

# contour等高線繪制
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidths=.5) # colors:顏色, linewidth:線寬, 其中8代表等高線的密集程度

# 等高線中加入文字標(biāo)注
plt.clabel(C, inline=True, fontsize=10) # inline:是否把文字畫在線里
plt.xticks(()) # 隱藏x坐標(biāo)軸
plt.yticks(()) # 隱藏y坐標(biāo)軸

# 最后展示圖片
plt.show()
contour

3D曲面

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

# 先定義一個(gè)圖像窗口,在窗口上添加3D坐標(biāo)軸
fig = plt.figure()
ax = Axes3D(fig)

# 給X, Y賦值
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)    # x-y 平面的網(wǎng)格
R = np.sqrt(X ** 2 + Y ** 2)
# 計(jì)算高度值
Z = np.sin(R)
# Z = (1 - X / 2 + X**5 + Y**3) * np.exp(-X**2 -Y**2) # drawcontours.py里的等高線函數(shù)

# 三維曲面,并將一個(gè) colormap rainbow 填充顏色,之后將三維圖像投影到 XY 平面上做一個(gè)等高線圖。
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow')) # rstride:row的跨度, cstride:column的跨度

# 添加XY平面的等高線
ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.get_cmap('rainbow')) # zdir:沿著z軸方向投影, offset相對(duì)于z=0的偏移距離

# 設(shè)置z軸的坐標(biāo)范圍,顯得好看一點(diǎn)
ax.set_zlim(-2,2)

# 最后展示圖片
plt.show()
3D

多個(gè)子圖

import matplotlib.pyplot as plt

plt.figure()

# 創(chuàng)建小圖
plt.subplot(2,2,1)
plt.plot([0,1],[0,1]) # 在第1個(gè)位置創(chuàng)建一個(gè)小圖.

plt.subplot(2,2,2)
plt.plot([0,1],[0,2]) # 在第2個(gè)位置創(chuàng)建一個(gè)小圖.

plt.subplot(223) #plt.subplot(2,2,3)可以簡(jiǎn)寫
plt.plot([0,1],[0,3])

plt.subplot(224)
plt.plot([0,1],[0,4])


# 最后展示圖片
plt.show()  # 展示
subplot

最后推薦一下50個(gè)高級(jí)畫圖案例:>>>傳送門<<<

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Matplotlib 也可以繪制 3D 圖像,與二維圖像不同的是,繪制三維圖像主要通過 mplot3d 模塊實(shí)現(xiàn)。...
    聽城閱讀 5,776評(píng)論 0 3
  • 參考:給深度學(xué)習(xí)入門者的Python快速教程 - Numpy和Matplotlib篇 簡(jiǎn)單的y折線圖(x為y對(duì)應(yīng)元...
    五秋木閱讀 1,415評(píng)論 0 0
  • 前言 有時(shí)候?yàn)榱酥庇^,我們需要將數(shù)據(jù)可視化,Python編程中最為常用的一個(gè)庫(kù)是matplotlib。那么什么是m...
    開發(fā)者也閱讀 5,523評(píng)論 2 46
  • 一、新媒體核心知識(shí):不斷地保持輸 二、無(wú)論轉(zhuǎn)向什么崗位,其實(shí)都是遵循五大步驟: 你要明確你為什么要轉(zhuǎn)行,新媒體運(yùn)營(yíng)...
    我是我自己的蓋世英雄gogo閱讀 271評(píng)論 0 1
  • 銳化后:(忽略旁邊寶寶涂的紅色) 完成圖,無(wú)濾鏡
    lummo閱讀 243評(píng)論 0 1

友情鏈接更多精彩內(nèi)容