詳解matplotlib技巧之縮放和投影
引言
我們?cè)谑褂?code>matplotlib繪制圖形時(shí),有兩個(gè)重要的技巧:一種是 Scale(縮放),一種是Projection(投影)。
一般來說,Scale是對(duì)數(shù)據(jù)的一個(gè)維度進(jìn)行變換,適當(dāng)?shù)目s放可以改善圖表的視覺效果,使其更加美觀和易讀。Projection則是對(duì)2個(gè)或者2個(gè)以上的維度進(jìn)行變換,一般是將多維數(shù)據(jù)映射到二維或三維空間中。
縮放和投影在matplotlib繪圖中起著至關(guān)重要的作用,它們幫助我們更好地展示和理解數(shù)據(jù)。
1. Scale - 縮放
縮放是指調(diào)整圖形的大小,使其適應(yīng)不同的尺寸或比例。
在可視化時(shí),縮放通常用于確保數(shù)據(jù)點(diǎn)在圖表上正確表示,尤其是在處理大量數(shù)據(jù)或數(shù)據(jù)點(diǎn)之間存在顯著比例差異時(shí)。
matplotlib支持多種縮放方式,比如常見的線性縮放,對(duì)數(shù)縮放和自定義縮放。
1.1. 線性縮放
線性縮放是默認(rèn)的縮放方式,數(shù)據(jù)的值是通過線性變換之后顯示在圖形的。
我們先構(gòu)造一個(gè)X軸和Y軸比例非線性的圖形(y=2^x),比如:
import matplotlib.pyplot as plt import math x = list(range(1, 11)) y = [math.pow(2, a) for a in x] fig = plt.figure(figsize=(6, 6)) ax = plt.subplot(1, 1, 1, aspect=1, xlim=[1, 10]) ax.plot(x, y, marker="o") plt.show()
顯示圖形如下:

按照1:1的比例,圖形幾乎無法查看,改成線性縮放之后:
import matplotlib.pyplot as plt
import math
x = list(range(1, 11))
y = [math.pow(2, a) for a in x]
fig = plt.figure(figsize=(6, 6))
ax = plt.subplot(1, 1, 1, xlim=[1, 10])
ax.set_yscale("linear") # 這里設(shè)置了線性縮放
ax.plot(x, y, marker="o")
plt.show()

線性縮放之后,X:Y的比例自動(dòng)調(diào)整為1:200。
1.2. 對(duì)數(shù)縮放
上面的例子中,X 和 Y 的關(guān)系是指數(shù)關(guān)系,所以,我們改成對(duì)數(shù)縮放,
看看和線性縮放的顯示有什么不同。
只需修改一行代碼:
ax.set_yscale("log") # 設(shè)置對(duì)數(shù)縮放
顯示效果變成如下這樣:

1.3. 自定義縮放
除了使用matplotlib為我們內(nèi)置的縮放函數(shù),我們也可以自定義縮放函數(shù)。
定義縮放函數(shù),就是定義2個(gè)縮和放的函數(shù):
import numpy as np
def forward(x):
return np.power(2, x)
def inverse(x):
return np.log2(x)
然后用我們自定義的縮放函數(shù)來再次試試 y=2^x的圖形。
x = list(range(1, 11))
y = [math.pow(2, a) for a in x]
fig = plt.figure(figsize=(6, 6))
ax = plt.subplot(1, 1, 1, xlim=[1, 10])
ax.set_xscale('function', functions=(forward, inverse))
ax.plot(x, y, marker="o")
plt.show()
顯示的效果如下:

2. Projection - 投影
投影是多個(gè)維度的變換,在數(shù)據(jù)可視化中,通常用于展示高維數(shù)據(jù)集的低維表示,幫助人們理解數(shù)據(jù)的結(jié)構(gòu)和模式。
2.1. 坐標(biāo)系轉(zhuǎn)換
投影的一個(gè)常用的應(yīng)用場(chǎng)景是不同坐標(biāo)系之間的轉(zhuǎn)換,matplotlib繪圖時(shí),常用的坐標(biāo)系是笛卡爾坐標(biāo)系和極坐標(biāo)系。
笛卡爾坐標(biāo)系在幾何、物理學(xué)和計(jì)算機(jī)圖形學(xué)等領(lǐng)域中廣泛應(yīng)用,因?yàn)樗梢苑奖愕孛枋銎矫嫔系娜我庖稽c(diǎn)。
然而,對(duì)于描述圓形和對(duì)稱圖形,極坐標(biāo)系可能更為簡(jiǎn)潔。
下面的示例中,就是同樣的一份數(shù)據(jù)投影在兩種坐標(biāo)系下情況。
x = list(range(1, 11)) y = x fig = plt.figure(figsize=(12,6)) ax1 = plt.subplot(1,2,1, aspect=1, xlim=[1,10], ylim=[1, 10], projection='polar') ax1.plot(x, y, marker="o") ax2 = plt.subplot(1,2,2, aspect=1, xlim=[1,10], ylim=[1, 10]) ax2.plot(x, y, marker="o") plt.show()

2.2. 3D 投影
投影另一個(gè)重要的作用就是轉(zhuǎn)換數(shù)據(jù)的維度,良好的投影應(yīng)該能夠保留數(shù)據(jù)的重要特征,同時(shí)減少信息的損失。
下面的示例來自matplotlib的官方文檔,
它把三維的圖形的任意兩個(gè)維度投影到不同的平面上,可以更好的觀察三維的圖形的特性。
from mpl_toolkits.mplot3d import axes3d
ax = plt.figure().add_subplot(projection="3d")
X, Y, Z = axes3d.get_test_data(0.05)
ax.plot_surface(X, Y, Z, edgecolor="royalblue", lw=0.5, rstride=8, cstride=8, alpha=0.3)
ax.contour(X, Y, Z, zdir="z", offset=-100, cmap="coolwarm")
ax.contour(X, Y, Z, zdir="x", offset=-40, cmap="coolwarm")
ax.contour(X, Y, Z, zdir="y", offset=40, cmap="coolwarm")
ax.set(
xlim=(-40, 40), ylim=(-40, 40), zlim=(-100, 100), xlabel="X", ylabel="Y", zlabel="Z"
)
plt.show()

3. 總結(jié)
我們平時(shí)繪制2D圖形比較多,2D圖形只有2個(gè)維度,所以一般用縮放(Scale)變換就足夠了。
但是在 3D 圖形的場(chǎng)景中,投影就會(huì)用的多一些。
此外,和地理信息結(jié)合展示數(shù)據(jù)的時(shí)候,投影也會(huì)用的比較多。
因?yàn)閿?shù)據(jù)對(duì)應(yīng)到經(jīng)緯度上至少是2個(gè)維度的同時(shí)變換(如果地理信息中包含海拔高度信息,則是3個(gè)維度的變換)
以上就是詳解matplotlib技巧縮放和投影的詳細(xì)內(nèi)容,更多關(guān)于matplotlib縮放和投影的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python為tornado添加recaptcha驗(yàn)證碼功能
tornado作為微框架,并沒有自帶驗(yàn)證碼組件,recaptcha是著名的驗(yàn)證碼解決方案,簡(jiǎn)單易用,被很多公司運(yùn)用來防止惡意注冊(cè)和評(píng)論。tornado添加recaptchaHA非常容易2014-02-02
2023巨詳細(xì)的Python安裝庫教程(以pycharm和Anaconda安裝pygame為例)
這篇文章主要給大家介紹了巨詳細(xì)的Python安裝庫教程,文中以pycharm和Anaconda安裝pygame為例,通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
Python跳出循環(huán)語句continue與break的區(qū)別
這篇文章主要介紹了Python跳出循環(huán)語句continue與break的區(qū)別,本文用實(shí)例來說明它們之間的區(qū)別,簡(jiǎn)單易記易懂,需要的朋友可以參考下2014-08-08
使用Python開發(fā)一個(gè)待辦事項(xiàng)管理器
這篇文章主要為大家詳細(xì)介紹了如何使用Python開發(fā)一個(gè)待辦事項(xiàng)管理器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2026-03-03
python實(shí)現(xiàn)每天自動(dòng)簽到領(lǐng)積分的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)每天自動(dòng)簽到領(lǐng)積分的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Python數(shù)據(jù)庫編程之SQLite和MySQL的實(shí)踐指南
這篇文章主要為大家詳細(xì)介紹了Python數(shù)據(jù)庫編程中SQLite和MySQL的相關(guān)操作指南,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
Pytorch修改ResNet模型全連接層進(jìn)行直接訓(xùn)練實(shí)例
在本篇文章里小編給大家整理的是關(guān)于Pytorch修改ResNet模型全連接層進(jìn)行直接訓(xùn)練相關(guān)知識(shí)點(diǎn),有需要的朋友們參考下。2019-09-09
PyQt6之QCalendar控件的實(shí)現(xiàn)
QCalendar類提供基于月份的日期選擇功能,支持鼠標(biāo)和鍵盤操作,默認(rèn)選中當(dāng)前日期,適用于需要日期輸入的場(chǎng)景,本文就來詳細(xì)的介紹一下PyQt6之QCalendar控件的實(shí)現(xiàn),感興趣的可以了解一下2025-09-09

