有時候,我們將數據變換之後再繪圖,一方面,可以突出某些區域的數據;另一方面,變換之後可以更好的看出數據之間的關係。 matplotlib 提供了兩種變換數據的方式,一種是 Scale(縮放),一種是Projection(投影)。 Scale是對數據的一個維度進行變換,Projection則是對2個或 ...
有時候,我們將數據變換之後再繪圖,一方面,可以突出某些區域的數據;另一方面,變換之後可以更好的看出數據之間的關係。
matplotlib 提供了兩種變換數據的方式,一種是 Scale(縮放),一種是Projection(投影)。
Scale是對數據的一個維度進行變換,Projection則是對2個或者2個以上的維度進行變換。
Scale - 縮放
線性縮放
線性縮放是預設的縮放方式,數據的值是通過線性變換之後顯示在圖形的。
每個數值變換成圖形上的像素位置之後繪製在圖形上。
比如:
x = list(range(1, 11))
y = x
fig = plt.figure(figsize=(6,6))
ax = plt.subplot(1,1,1, aspect=1, xlim=[1,10], ylim=[1,10])
ax.plot(x, y, marker="o")
plt.show()
顯示圖形如下:
上面的例子中,x 和 y 的關係是 y = x,如果 x 和 y 的關係是 y = 10^x,仍然用線性縮放顯示的話,圖形會被壓縮成一個非常窄的長條形。
比如下麵的代碼:
import math
x = list(range(1, 11))
y = [ math.pow(10, 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()
可以試試看,因為 x 的值很小的時候,y 的值就會很大,顯示出來的圖幾乎無法查看。
對數縮放
matplotlib 中預設還提供了
- log:以10為底數的對數縮放,不支持負數和0
- logit:以2為底數的對數縮放,不支持負數和0
- symlog:包含線性縮放和對數縮放,0附近的值用線性縮放,其他值用對數縮放
上面的例子中,x 和 y 的關係是 y = 10^x,所以,我們可以在Y軸上用對數縮放。
同時調節 ylim 的範圍,使得圖形顯示的更加均勻。
import math
x = list(range(1, 11))
y = [ math.pow(10, a) for a in x]
fig = plt.figure(figsize=(6,6))
ax = plt.subplot(1,1,1, aspect=1, xlim=[1,10], ylim=[10, math.pow(10, 10)])
ax.set_yscale('log')
ax.plot(x, y, marker="o")
plt.show()
顯示效果如下:
自定義縮放
自定義縮放函數時,定義2個可互相轉換的函數。
比如,對於 y = x^2 關係,也就是,y 是 x 的平方。預設顯示的效果如下:
x = list(range(1, 11))
y = [ a * a for a in x]
fig = plt.figure(figsize=(6,6))
ax = plt.subplot(1,1,1, aspect=1, xlim=[1,10], ylim=[1, 10*10])
ax.plot(x, y, marker="o")
plt.show()
添加自定義縮放後:
def forward(x):
return x**2
def inverse(x):
return x**(1/2)
x = list(range(1, 11))
y = [ a * a for a in x]
fig = plt.figure(figsize=(6,6))
ax = plt.subplot(1,1,1, aspect=1, xlim=[1,10], ylim=[1, 10*10])
ax.set_xscale('function', functions=(forward, inverse))
ax.plot(x, y, marker="o")
plt.show()
圖形的顯示美觀很多。
Projection - 投影
投影是多個維度的變換,一般用在坐標系的轉換上。
笛卡爾坐標系和極坐標系
比如,下麵例子中分別將數據顯示在笛卡爾坐標系和極坐標中,體會下其中的區別。
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()
極坐標系一般用在非線性的關係中,上面的數據用 笛卡爾坐標更合適。
投影的場景
投影使用的場景其實不只是坐標系的變換。
因為我們平時繪製2D圖形比較多,2D圖形只有2個維度,所以一般用縮放(Scale)變換就足夠了。
但是在 3D 圖形的場景中,投影就會用的多一些,matplotlib 繪製3D圖形需要額外的庫,這裡不演示了。
此外,和地理信息結合展示數據的時候,投影也會用的比較多。
因為數據對應到經緯度上至少是2個維度的同時變換(如果地理信息中包含海拔高度信息,則是3個維度的變換)