Matplotlib隨記2


之前寫了很多關於Matplotlib的基礎知識,這次主要講一下Matplotlib所生成的幾個圖:散點圖,柱狀圖,等高線圖,圖片和3D數據

Scatter散點圖

在制作Scatter散點圖的過程中,我們首先要引入matplotlib.pyplot簡寫為plt,再引入模塊numpy用來產生一些隨機的數據。生成1024個呈正態分布的二維數組(平均數是0,方差是1)作為一個數據集,並圖像化這個數據集。其中,每一個點的顏色用T來表示:

import matplotlib.pyplot as plt
import numpy as np

n=1024   #數據大小
X=np.random.normal(0,1,n)   #每一個點的X值
Y=np.random.normal(0,1,n)   #
T=np.arctan2(Y,X)

數據生成完畢之后,我們需要采用scatter來繪制這些點。在這里,我們輸入X和Y作為輸入點,顏色為T,color map用作默認值,透明度alpha為50%。X軸顯示范圍定位為(-1.5,1.5),並用xtick()函數來隱藏x坐標軸,ytick()函數來隱藏y坐標軸

plt.scatter(X,Y,s=75,c=T,alpha=.5)

plt.xlim(-1.5,1.5)
plt.xticks(())
plt.ylim(-1.5,1.5)
plt.yticks(())

plt.show()

綜上,該代碼最終產生的結果為:

柱狀圖

在我們平時的機器學習領域中,柱狀圖通常有很大的作用,它可以很形象的看到趨勢的變化。下面就介紹一下如何利用matplotlib來生成一個柱狀圖。

首先第一步便是生成數據。我們向上向下分別生成12個數據,X為0到11的整數,Y是相應的均勻分布的隨機數據。使用的函數是plt.bar,參數是X和Y:

import matplotlib.pyplot as plt
import numpy as np

n=12
X=np.arange(n)
Y1=(1 - X / float(n)) * np.random.uniform(0.5,1.0,n)
Y2=(1 - X / float(n)) * np.random.uniform(0.5,1.0,n)

plt.bar(X,+Y1)
plt.bar(X,-Y2)
plt.xlim(-1,n)
plt.xticks(())
plt.ylim(-1.25,1.25)
plt.yticks(())

plt.show()

 

這樣我們便可以生成柱狀圖的基本框架。下一步我們需要對該圖就顏色和數值進行優化。用facecolor設置主題顏色,edgecolor設置邊框顏色。

plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white')
plt.bar(X,-Y2,facecolor='#ff9999',edgecolor='white')

 

接下來我們用函數plt.text分別在柱體上方(下方)加上數值,用%.2f 保留兩位小數,橫向居中對齊ha='center',縱向底部(頂部)對齊va='bottom'

for x,y in zip(X,Y1):
    plt.text(x+0.4,y+0.05,'%.2f' % y,ha='center',va='bottom')

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

 

綜上,本部分的所有代碼為:

import matplotlib.pyplot as plt
import numpy as np

n=12
X=np.arange(n)
Y1=(1 - X / float(n)) * np.random.uniform(0.5,1.0,n)
Y2=(1 - X / float(n)) * np.random.uniform(0.5,1.0,n)

plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white')
plt.bar(X,-Y2,facecolor='#ff9999',edgecolor='white')


for x,y in zip(X,Y1):
    plt.text(x+0.4,y+0.05,'%.2f' % y,ha='center',va='bottom')

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

plt.xlim(-1,n)
plt.xticks(())
plt.ylim(-1.25,1.25)
plt.yticks(())

plt.show()

 

所產生的結果為:

 

等高線圖

在本部分,我們主要介紹如何利用matplotlib生成等高線。在生成等高線中,我們需要三維的數據點:(x,y)和對應的高度。在本程序中,高度我們用一個函數f()來生成。x,y分別是在區間[-3,3]中均勻分布的256個值,並用meshgrid在二維平面中將每一個x和每一個y分別對應起來,編織成柵格:

import matplotlib.pyplot as plt
import numpy as np

def f(x,y):
    return (1 - x/2 + x**5 + y**3) * np.exp(-x**2,-y**2)

n=256
x=np.linspace(-3,3,n)
y=np.linspace(-3,3,n)
X,Y=np.meshgrid(x,y)

 

接下來我們進行顏色填充。使用函數plt.contourf把顏色加進去,位置參數分別為:X,Y,f(X,Y)。透明度0.75,並將f(X,Y)的值對應到color map的暖色組中尋找對應顏色。

plt.contourf(X,Y,f(X,Y),8,alpha=0.75,cmap=plt.cm.hot)

 

接下來進行等高線繪制。使用plt.contour函數划線。位置參數為 X,Y,f(X,Y)。在我們這里,我們將顏色選為黑色,線條寬度為0.5.現在的結果如下圖所示:只有顏色和線條,沒有數值Label

C=plt.contour(X,Y,f(X,Y),8,colors='black',linewidth=0.5)

 

在上面的代碼中,我們可以看到,其中的8代表等高線的密集程度,這里被分為10個部分。如果是0,則圖像被一分為二。

再下一步,我們需要添加高度數字。我們加入Label,inline控制是否在Label畫在線里面,字體大小為10.並將坐標軸隱藏:

plt.clabel(C,inline=True,fontsize=10)
plt.xticks(())
plt.yticks(())

 

所以,在畫等高線的所有代碼為:

import matplotlib.pyplot as plt
import numpy as np

def f(x,y):
    return (1 - x/2 + x**5 + y**3) * np.exp(-x**2,-y**2)

n=256
x=np.linspace(-3,3,n)
y=np.linspace(-3,3,n)
X,Y=np.meshgrid(x,y)

plt.contourf(X,Y,f(X,Y),8,alpha=0.75,cmap=plt.cm.hot)
C=plt.contour(X,Y,f(X,Y),8,colors='black',linewidth=0.5)

plt.clabel(C,inline=True,fontsize=10)
plt.xticks(())
plt.yticks(())
plt.show()

 

所產生的結果為:

3D數據

在做機器學習的時候,有時候需要繪3D圖片來看數據整體的下降趨勢。首先在進行3D時除了導入matplotlib,還需要添加一個模塊,即3D坐標軸顯示,這個包不需要單獨安裝,python本身就自帶的

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

 

之后要定義一個圖像窗口,在窗口上添加3D坐標軸。

fig=plt.figure()
ax=Axes3D(fig)

 

接下來再給出X值和Y值,並將X值和Y值編織成柵格。每一個(X,Y)點對應的高度值,我們用下面這個函數進行計算:

X=np.arange(-4,4,0.25)
Y=np.arange(-4,4,0.25)
X,Y=np.meshgrid(X,Y)
R=np.sqrt(X ** 2 + Y ** 2)
Z=np.sin(R)

 

下一步我們需要做出一個三維曲面,並將一個colormap rainbow填充顏色,之后將三維圖像投影到XY平面做一個等高線圖。plot 3D 圖像:

ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))

 

其中,rstride 和 cstride分別代表row 和 column的跨度

之后,我們添加XY平面的等高線:

ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap=plt.get_cmap('rainbow'))

 

如果zdir選擇了x,那么效果將會是對於XZ平面的投影。

因此,整個項目的代碼為:

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

fig=plt.figure()
ax=Axes3D(fig)

X=np.arange(-4,4,0.25)
Y=np.arange(-4,4,0.25)
X,Y=np.meshgrid(X,Y)
R=np.sqrt(X ** 2 + Y ** 2)
Z=np.sin(R)

ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))

ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap=plt.get_cmap('rainbow'))

plt.show()

 

最終的效果圖為:

 

本知識學自於:莫煩python

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM