Python3.0科學計算學習之繪圖(二)


(1) np.mashgrid()函數:-----生成網絡點坐標矩陣,可以是二維網絡矩陣,也可以是三維網絡矩陣。其中,每個交叉點就是網絡點,描述這些網絡點的矩陣就是坐標矩陣(橫坐標矩陣X中的每個元素與縱坐標矩陣Y中對應位置元素,共同構成一個點的完整坐標)。

背景示例:網絡點與坐標矩陣的解釋如下:

import numpy as np

import matplotlib.pyplot as plt

x=np.array([[0,1,2],[0,1,2]])        #最簡單的方法是,可以把橫縱坐標矩陣X,Y寫出來,生成坐標點

y=np.array([[0,0,0],[1,1,1]])

plt.plot(x,y,color='red',marker='.',markersize=10,linestyle='-.')      #點的形狀為原點,點設置大一些,線性為電划線。

plt.grid(True)

plt.show()   

注意:按照矩陣給坐標點信息,matplotlib會把橫坐標矩陣中,每一列的點當做同一條線。正如上例中把plotlinestyle=’ ‘改為linestyle=’-.’就會發現A-D,B-E,C-F是連接的。

                                  

對於很多網絡點的情況,可用如下meshgrid()函數方法:

   因注意到坐標矩陣其中有大量的重復---X的每一行都一樣,Y的每一列都一樣。故基於此規律性,numpy提供的np.meshgrid()函數可以快速生成坐標矩陣X,Y

x=np.linspace(-0.5,2.,10)    

y=np.linspace(-1.5,4.,10)

X,Y=np.meshgrid(x,y)     #輸入的x,y是網絡點的橫縱坐標列向量(非矩陣),輸出的XY就是坐標矩陣。

plt.plot(X,Y,color='limegreen',marker='.',linestyle='')

plt.grid(True)

plt.show()

                   

(2) Python可視化庫matplotlib.pyplotcontour()contourf()函數

區別contour()counterf() 函數功能相同,都是畫三維等高線圖的,不同點在於contourf會根據不同的水平值用不同的顏色來填充繪圖(即會對等高線間的區域進行填充)。

contour()counterf() 都是繪制三維圖,其中前兩個參數xy為兩個等長一維數組,第三個參數z為二維數組(表示平面點xiyi映射的函數值)。

matplotlib等高線的繪制步驟:

等高線是三維圖像在二維空間的投影

首先准備三維函數及待投影平面的網格坐標。

import numpy as np

import matplotlib.pyplot as plt

def height(x,y):

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

x=np.linspace(-3,3,300)

y=np.linspace(-3,3,300)

X,Y=np.meshgrid(x,y)

l 繪制等高線

C=plt.contour(X,Y,height(X,Y),10,colors='black')   # 10代表等高線的密集程度。如果是0,則圖像被一分為二

plt.contourf(X,Y,height(X,Y),10,alpha=0.75,cmap=plt.cm.hot)

#為等高線填充顏色 10表示按照高度分成10alpha表示透明度 cmap表示漸變標准

l 添加高度與數字

plt.clabel(C,inline=True,fontsize=10)     #inline=True表示高度寫在等高線上

plt.xticks(())     

plt.yticks(())

#去掉坐標軸刻度

plt.show()

#顯示圖片

l 最后結果圖為:

                                           

實例:尋找某一函數的最小值

import numpy as np

import matplotlib.pyplot as plt

import scipy.optimize as so

rosenbrockfunction=lambda x,y: (1-x)**2+100*(y-x**2)**2  #使用lambda關鍵字所表示的匿名函數來使代碼變得更加簡潔

x=np.linspace(-.5,2.,100)

y=np.linspace(-1.5,4.,100)

X,Y=np.meshgrid(x,y)

Z=rosenbrockfunction(X,Y)

cs=plt.contour(X,Y,Z,np.logspace(0,3.5,7,base=10),cmap='gray')   #以第四個參數給出的值為標准來繪制等高線並用gray顏色繪圖   

#plt.contourf(X,Y,Z,10,alpha=0.75,cmap='gray')

rosen=lambda x:rosenbrockfunction(x[0],x[1])

solution,iterates=so.fmin_powell(rosen,x0=np.array([0,-0.7]),retall=True)

#迭代方法so.fmin_powell利用鮑威爾方法來尋找最小值(由一個給定的起始值x0開始,並且當給出選項retall=True時報告所有的迭代,經過16次迭代后得出x=0,y=0

x,y=zip(*iterates)

plt.plot(x,y,'ko')

plt.plot(x,y,'k:',linewidth=1)

plt.title('Steps of powells method to compute a minimum')

plt.clabel(cs)

#clabel使用該contour創建的一個等值線集對象來注釋對應函數值的水平值

補充:np.logspace()常用於創建等比數列,它也有常用的3個參數,第一個參數表示起始點的指數,第二個參數終止點的指數,第三個參數表示數列的個數;最后,通過base參數可以修改底數

                          

(4) 圖像

Imshow()函數用於在指定的窗口中顯示一幅圖像。它負責對圖像進行處理,並顯示其格式,但是不顯示圖片,其后跟着plt.show()才能顯示出來。

imshow圖像顯示函數:imshowf,G) 其中,f是函數,G是顯示該圖像的灰度級數。

                    Imshow(f,[low,high]) 小於或者等於low的值都顯示為黑色,大於或等於high的值都顯示為白色

                    Imshow(f,[ ]) [ ] 自動將low設為函數最小值,將high設為函數最大值。

Colorbar:增加顏色類標的代碼是plt.colorbar()

例如:import numpy as np

import matplotlib.pyplot as plt

X=np.array([[1,2],[3,4],[5,6]])

plt.imshow(X)

plt.colorbar()

plt.show()   

實例:將數組可視化為圖像,

import numpy as np

import matplotlib.pyplot as plt

# 下面代碼演示了如何通過meshgrid生成復數參數值的矩陣:

def mandelbrot(h,w,maxit=20):

    X,Y=np.meshgrid(np.linspace(-2,0.8,w),np.linspace(-1.4,1.4,h))

    c=X+Y*1j

    z=c

    exceeds=np.zeros(z.shape,dtype=bool)

    for iteration in range(maxit):

        z=z**2+c

        exceeded=np.abs(z) > 4

        exceeds_now=exceeded & (np.logical_not(exceeds))

        exceeds[exceeds_now] = True

        z[exceeded]=2

    return (exceeds)   

#命令imshow將矩陣展示為圖像,所選的顏色貼圖顯示了序列出現的白色無界的區域,而其他區域顯示為黑色。

plt.imshow(mandelbrot(400,400),cmap='gray')

plt.axis('off')    #使用plt.axis('off') 關閉坐標軸

plt.show()       

# 使用imshow的無插值的圖像

                                       

注意:imshow命令默認使用插值使圖像看起來更好,這在矩陣較小時可以看的很清楚。

plt.imshow(mandelbrot(400,400),interpolation='nearest',cmap='gray')

Interpolation代表插值運算,nearest表示最近鄰近插值法,只是插值方式中的一種。

cmap表示繪圖時的樣式,這里選擇的是ocean主題

#使用最近鄰近插值法所得的圖像

                                        

 


免責聲明!

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



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