新聞中心
三劍客之Matplotlib

創(chuàng)新互聯(lián)公司成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供成都網(wǎng)站制作、成都做網(wǎng)站網(wǎng)站開發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站開發(fā),網(wǎng)頁(yè)設(shè)計(jì)師打造企業(yè)風(fēng)格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務(wù)。歡迎咨詢做網(wǎng)站需要多少錢:028-86922220
matplotlib 是python最著名的繪圖庫(kù),它提供了一整套和Matlab相似的命令A(yù)PI,十分適合交互式地進(jìn)行制圖。而且也可以方便地將它作為繪圖控件,嵌入GUI應(yīng)用程序中。matplotlib 可以繪制多種形式的圖形包括普通的線圖,直方圖,餅圖,散點(diǎn)圖以及誤差線圖等;可以比較方便的定制圖形的各種屬性比如圖線的類型,顏色,粗細(xì),字體的大小等;它能夠很好地支持一部分 TeX 排版命令,可以比較美觀地顯示圖形中的數(shù)學(xué)公式。
更多Matplotlib的相關(guān)知識(shí),可以參考這篇文章:《利用Python的Matplotlib庫(kù)進(jìn)行數(shù)據(jù)可視化》
3.1 pylot介紹
Matplotlib 包含了幾十個(gè)不同的模塊, 如 matlab、mathtext、finance、dates 等,而 pylot 則是我們最常用的繪圖模塊,這也是本文介紹的重點(diǎn)。
3.1.1 中文顯示問題的解決方案
有很多方法可以解決此問題,但下面的方法恐怕是最簡(jiǎn)單的解決方案了(我只在windows平臺(tái)上測(cè)試過,其他平臺(tái)請(qǐng)看官自測(cè))。如果想了解更多,也可以參考我N年前的一片博文:matplotlib顯示中文的解決方案
>>> import matplotlib.pyplot as plt >>> plt.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認(rèn)字體 >>> plt.rcParams['axes.unicode_minus'] = False # 解決保存圖像時(shí)'-'顯示為方塊的問題
3.1.2 繪制最簡(jiǎn)單的圖形
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> x = np.arange(0, 2*np.pi, 0.01) >>> y = np.sin(x) >>> plt.plot(x, y) >>> plt.show()
3.1.3 設(shè)置標(biāo)題、坐標(biāo)軸名稱、坐標(biāo)軸范圍
如果你在python的shell中運(yùn)行下面的代碼,而shell的默認(rèn)編碼又不是utf-8的話,中文可能仍然會(huì)顯示為亂碼。你可以嘗試著把 u’正弦曲線’ 寫成 ‘正弦曲線’.decode(‘gbk’)或者’正弦曲線’.decode(‘utf-8’)
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from pylab import mpl
>>> mpl.rcParams['font.sans-serif'] = ['FangSong']
>>> mpl.rcParams['axes.unicode_minus'] = False
>>> x = np.arange(0, 2*np.pi, 0.01)
>>> y = np.sin(x)
>>> plt.plot(x, y)
>>> plt.title(u'正弦曲線', fontdict={'size':20}) # 設(shè)置標(biāo)題
>>> plt.xlabel(u'弧度', fontdict={'size':16}) # 顯示橫軸名稱
>>> plt.ylabel(u'正弦值', fontdict={'size':16}) # 顯示縱軸名稱
>>> plt.axis([-0.1*np.pi, 2.1*np.pi, -1.1, 1.1]) # 設(shè)置坐標(biāo)軸范圍
>>> plt.axis('equal') # xy軸等比例保持
>>> plt.show()3.1.4 設(shè)置點(diǎn)和線的樣式、寬度、顏色
plt.plot函數(shù)的調(diào)用形式如下:
plot(x, y, color='green', linestyle='dashed', linewidth=1, marker='o', markerfacecolor='blue', markersize=6) plot(x, y, c='g', ls='--', lw=1, marker='o', mfc='blue', ms=6)
1、color指定線的顏色,可簡(jiǎn)寫為“c”。顏色的選項(xiàng)為:
·藍(lán)色: ‘b’ (blue)
·綠色: ‘g’ (green)
·紅色: ‘r’ (red)
·墨綠: ‘c’ (cyan)
·洋紅: ‘m’ (magenta)
·黃色: ‘y’ (yellow)
·黑色: ‘k’ (black)
·白色: ‘w’ (white)
·灰度表示: e.g. 0.75 ([0,1]內(nèi)任意浮點(diǎn)數(shù))
·RGB表示法: e.g. ‘#2F4F4F’ 或 (0.18, 0.31, 0.31)
1、linestyle指定線型,可簡(jiǎn)寫為“l(fā)s”。線型的選項(xiàng)為:
·實(shí)線: ‘-’ (solid line)
·虛線: ‘–’ (dashed line)
·虛點(diǎn)線: ‘-.’ (dash-dot line)
·點(diǎn)線: ‘:’ (dotted line)
·無(wú): '‘或’ ‘或’None’
1、linewidth指定線寬,可簡(jiǎn)寫為“l(fā)w”。
2、marker描述數(shù)據(jù)點(diǎn)的形狀
·點(diǎn)線: ‘.’
·點(diǎn)線: ‘o’
·加號(hào): '+
·叉號(hào): ‘x’
·上三角: ‘^’
·上三角: ‘v’
1、markerfacecolor指定數(shù)據(jù)點(diǎn)標(biāo)記的表面顏色,可 簡(jiǎn)寫為“ mfc”。
2、markersize指定數(shù)據(jù)點(diǎn)標(biāo)記的大小,可 簡(jiǎn)寫為“ ms”。
3.1.5 文本標(biāo)注和圖例
我們分別使用不同的線型、顏色來(lái)繪制以10、e、2為基的一組冪函數(shù)曲線,演示文本標(biāo)注和圖例的使用。
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from pylab import mpl
>>> mpl.rcParams['font.sans-serif'] = ['FangSong']
>>> mpl.rcParams['axes.unicode_minus'] = False
>>> x = np.linspace(-4, 4, 200)
>>> f1 = np.power(10, x)
>>> f2 = np.power(np.e, x)
>>> f3 = np.power(2, x)
>>> plt.plot(x, f1, 'r', ls='-', linewidth=2, label='$10^x$')
>>> plt.plot(x, f2, 'b', ls='--', linewidth=2, label='$e^x$')
>>> plt.plot(x, f3, 'g', ls=':', linewidth=2, label='$2^x$')
>>> plt.axis([-4, 4, -0.5, 8])
>>> plt.text(1, 7.5, r'$10^x$', fontsize=16)
>>> plt.text(2.2, 7.5, r'$e^x$', fontsize=16)
>>> plt.text(3.2, 7.5, r'$2^x$', fontsize=16)
>>> plt.title('冪函數(shù)曲線', fontsize=16)
>>> plt.legend(loc='upper left')
>>> plt.show()在繪制圖例時(shí),loc用于指定圖例的位置,可用的選項(xiàng)有:
·best
·upper right
·upper left
·lower left
·lower right
3.2 繪制多軸圖
在介紹如何將多幅子圖繪制在同一畫板的同時(shí),順便演示如何繪制直線和矩形。我們可以使用subplot函數(shù)快速繪制有多個(gè)軸的圖表。subplot函數(shù)的調(diào)用形式如下:
subplot(numRows, numCols, plotNum)
subplot將整個(gè)繪圖區(qū)域等分為numRows行 * numCols列個(gè)子區(qū)域,然后按照從左到右,從上到下的順序?qū)γ總€(gè)子區(qū)域進(jìn)行編號(hào),左上的子區(qū)域的編號(hào)為1。如果numRows,numCols和plotNum這三個(gè)數(shù)都小于10的話,可以把它們縮寫為一個(gè)整數(shù),例如subplot(323)和subplot(3,2,3)是相同的。subplot在plotNum指定的區(qū)域中創(chuàng)建一個(gè)軸對(duì)象。如果新創(chuàng)建的軸和之前創(chuàng)建的軸重疊的話,之前的軸將被刪除。
>>> import matplotlib.pyplot as plt >>> plt.subplot(221) # 兩行兩列的第1個(gè)位置 >>> plt.axis([-1, 2, -1, 2]) >>> plt.axhline(y=0.5, color='b') >>> plt.axhline(y=0.5, xmin=0.25, xmax=0.75, color='r') >>> plt.subplot(222) # 兩行兩列的第2個(gè)位置 >>> plt.axis([-1, 2, -1, 2]) >>> plt.axvline(x=0, ymin=0, linewidth=4, color='r') >>> plt.axvline(x=1.0, ymin=-0.5, ymax=0.5, linewidth=4, color='g') >>> plt.subplot(212) # 兩行一列的第2個(gè)位置 >>> plt.axis([-1, 2, -1, 2]) >>> plt.axvspan(1.25, 1.55, facecolor='g', alpha=0.5) >>> plt.axhspan(0.25, 0.75, facecolor='0.5', alpha=0.5) >>> plt.show()
3.3 常用繪圖類型
3.3.1 直方圖
用numpy隨機(jī)生成一個(gè)符合正態(tài)分布的數(shù)據(jù)集,統(tǒng)計(jì)分段區(qū)域內(nèi)數(shù)據(jù)的個(gè)數(shù)。
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> data = np.random.normal(5.0, 3.0, 1000) >>> plt.hist(data) >>> bins = np.arange(-5, 16, 1) >>> plt.hist(data, bins) # 使用自定義的分段區(qū)域 >>> plt.show()
3.3.2 散點(diǎn)圖
使用plot()繪圖時(shí),如果指定樣式參數(shù)為僅繪制數(shù)據(jù)點(diǎn)(linestyle=‘None’),那么所繪制的就是一幅散列圖。這種方法所繪制的點(diǎn)無(wú)法單獨(dú)指定數(shù)據(jù)點(diǎn)的顏色和大小,而使用scatter()繪制散列圖就可以指定每個(gè)點(diǎn)的顏色和大小。
plt.scatter函數(shù)的調(diào)用形式如下:
scatter(x,y,s=None,c=None,marker=None,cmap=None,norm=None,vmin=None,vmax=None,alpha=None,linewidths=None,verts=None, edgecolors=None,hold=None,data=None,**kwargs)
scatter()的前兩個(gè)參數(shù)是數(shù)組,分別指定每個(gè)點(diǎn)的X軸和Y軸的坐標(biāo)。s參數(shù)指定點(diǎn)的大 小,值和點(diǎn)的面積成正比,它可以是一個(gè)數(shù),指定所有點(diǎn)的大小,也可以是數(shù)組,分別對(duì)每個(gè)點(diǎn)指定大小。c參數(shù)指定每個(gè)點(diǎn)的顏色,可以是數(shù)值或數(shù)組。這里使用一維數(shù)組為每個(gè)點(diǎn)指定了一個(gè)數(shù)值。通過顏色映射表,每個(gè)數(shù)值都會(huì)與一個(gè)顏色相對(duì)應(yīng)。默認(rèn)的顏色映射表中藍(lán)色與最小值對(duì)應(yīng),紅色與值對(duì)應(yīng)。當(dāng)c參數(shù)是形狀為(N,3)或(N,4)的二維數(shù)組時(shí),則直接表示每個(gè)點(diǎn)的RGB顏色。marker參數(shù)設(shè)置點(diǎn)的形狀,可以是個(gè)表示形狀的字符串,也可以是表示多邊形的兩個(gè)元素的元組,第一個(gè)元素表示多邊形的邊數(shù),第二個(gè)元素表示多邊形的樣式,取值范圍為0、1、2、3。0表示多邊形,1表示星形,2表示放射形,3表示忽略邊數(shù)而顯示為圓形。alpha參數(shù)設(shè)置點(diǎn)的透明度。facecolors參數(shù)為“none”時(shí),表示散列點(diǎn)沒有填充色。
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> x = np.random.rand(50) >>> y = np.random.rand(50) >>> area = np.pi * (15 * np.random.rand(50))**2 >>> color = 2 * np.pi * np.random.rand(50) >>> plt.scatter(x, y, s=area, c=color, alpha=0.5, cmap=plt.cm.hsv) >>> plt.show()
3.3.3 梯形圖、柱狀圖、填充圖
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> n = np.array([0,1,2,3,4,5]) >>> x = np.linspace(-0.75, 1., 100) >>> plt.subplot(131) >>> plt.step(n, n**2, lw=2) >>> plt.subplot(132) >>> plt.bar(n, n**2, align="center", width=0.5, alpha=0.5) >>> plt.subplot(133) >>> plt.fill_between(x, x**2, x**3, color="green", alpha=0.5) >>> plt.show()
3.3.4 對(duì)數(shù)坐標(biāo)
plot()所繪制圖表的X-Y軸坐標(biāo)都是算術(shù)坐標(biāo)。繪制對(duì)數(shù)坐標(biāo)圖的函數(shù)有三個(gè):semilogx()、semilogy()和loglog(),它們分別繪制X軸為對(duì)數(shù)坐標(biāo)、Y軸為對(duì)數(shù)坐標(biāo)以及兩個(gè)軸都為對(duì)數(shù)坐標(biāo)時(shí)的圖表。
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> x = np.linspace(0, 3, 100) >>> y = np.power(2, np.power(2,x)) >>> plt.subplot(121) >>> plt.semilogy(x, y , '-r') >>> plt.subplot(122) >>> plt.plot(x,y, '--g') >>> plt.show()
3.3.5極坐標(biāo)繪圖
極坐標(biāo)系是和笛卡爾(X-Y)坐標(biāo)系完全不同的坐標(biāo)系,極坐標(biāo)系中的點(diǎn)由一個(gè)夾角和一段相對(duì)中心點(diǎn)的距離來(lái)表示。polar(theta, r, **kwargs)可以直接創(chuàng)建極坐標(biāo)子圖并在其中繪制曲線。也可以使用程序中調(diào)用subplot()創(chuàng)建子圖時(shí)通過設(shè) polar參數(shù)為True,創(chuàng)建一個(gè)極坐標(biāo)子圖,然后調(diào)用plot()在極坐標(biāo)子圖中繪圖。
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> theta = np.arange(0, 2*np.pi, 0.02) >>> plt.polar(theta, 1.4*np.cos(5*theta), "--", linewidth=2) >>> plt.polar(theta, 1.8*np.cos(4*theta), linewidth=2) >>> plt.rgrids(np.arange(0.5, 2, 0.5), angle=45) >>> plt.thetagrids([0, 45])thetagridlabel objects>) >>> plt.show() >>>
3.4 2D繪圖
3.4.1 等值線圖
所謂等值線,是指由函數(shù)值相等的各點(diǎn)連成的平滑曲線。等值線可以直觀地表示二元函數(shù)值的變化趨勢(shì),例如等值線密集的地方表示函數(shù)值在此處的變化較大。matplotlib中可以使用contour()和contourf()描繪等值線,它們的區(qū)別是:contourf()所得到的是帶填充效果的等值線。
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> y, x = np.ogrid[-2:2:200j, -3:3:300j] >>> z = x * np.exp( - x**2 - y**2) >>> extent = [np.min(x), np.max(x), np.min(y), np.max(y)] >>> plt.subplot(121) >>> cs = plt.contour(z, 10, extent=extent) >>> plt.clabel(cs) >>> plt.subplot(122) >>> plt.contourf(x.reshape(-1), y.reshape(-1), z, 20) >>> plt.show()
為了更淸楚地區(qū)分X軸和Y軸,這里讓它們的取值范圍和等分次數(shù)均不相同.這樣得 到的數(shù)組z的形狀為(200, 300),它的第0軸對(duì)應(yīng)Y軸、第1軸對(duì)應(yīng)X軸。
調(diào)用contour()繪制數(shù)組z的等值線圖,第二個(gè)參數(shù)為10,表示將整個(gè)函數(shù)的取值范圍等分為10個(gè)區(qū)間,即顯示的等值線圖中將有9條等值線??梢允褂胑xtent參數(shù)指定等值線圖的X軸和Y軸的數(shù)據(jù)范圍。
contour()所返回的是一個(gè)QuadContourSet對(duì)象, 將它傳遞給clabel(),為其中的等值線標(biāo)上對(duì)應(yīng)的值。
調(diào)用contourf(),繪制將取值范圍等分為20份、帶填充效果的等值線圖。這里演示了另外一種設(shè)置X、Y軸取值范圍的方法,它的前兩個(gè)參數(shù)分別是計(jì)算數(shù)組z時(shí)所使用的X軸和Y軸上的取樣點(diǎn),這兩個(gè)數(shù)組必須是一維的。
3.4.2 二維數(shù)據(jù)的平面色彩顯示
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> data=np.clip(np.random.randn(5,5),-1,1) >>> plt.subplot(221) >>> plt.imshow(data) >>> plt.subplot(222) >>> plt.imshow(data,cmap=plt.cm.cool) >>> plt.subplot(223) >>> plt.imshow(data,cmap=plt.cm.hot) >>> plt.colorbar() >>> plt.subplot(224) >>> im = plt.imshow(data,cmap=plt.cm.winter) >>> plt.colorbar(im, cmap=plt.cm.winter, ticks=[-1,0,1]) >>> plt.show()
3.5 3D繪圖
雖然matplotlib主要專注于繪圖,并且主要是二維的圖形,但是它也有一些不同的擴(kuò)展,能讓我們?cè)诘乩韴D上繪圖,讓我們把Excel和3D圖表結(jié)合起來(lái)。在matplotlib的世界里,這些擴(kuò)展叫做工具包(toolkits)。工具包是一些關(guān)注在某個(gè)話題(如3D繪圖)的特定函數(shù)的集合。
比較流行的工具包有Basemap、GTK 工具、Excel工具、Natgrid、AxesGrid和mplot3d。
mpl_toolkits.mplot3工具包提供了一些基本的3D繪圖功能,其支持的圖表類型包括散點(diǎn)圖(scatter)、曲面圖(surf)、線圖(line)和網(wǎng)格圖(mesh)。雖然mplot3d不是一個(gè)最好的3D圖形繪制庫(kù),但是它是伴隨著matplotlib產(chǎn)生的,因此我們對(duì)其接口已經(jīng)很熟悉了。
下面是一個(gè)使用plot_surface繪制3d曲面圖的例子。
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import mpl_toolkits.mplot3d
>>> x, y = np.mgrid[-2:2:50j,-2:2:50j]
>>> z = x*np.exp(-x**2-y**2)
>>> ax = plt.subplot(111,projection='3d')
>>> ax.plot_surface(x,y,z,rstride=2,cstride=1,cmap=plt.cm.coolwarm,alpha=0.8)
>>> ax.set_xlabel('x')
>>> ax.set_ylabel('y')
>>> ax.set_zlabel('z')
>>> plt.show()python創(chuàng)新互聯(lián)教程,免費(fèi)的在線學(xué)習(xí)python平臺(tái),歡迎關(guān)注!
相關(guān)推薦:
1、Python數(shù)學(xué)建模三劍客之Numpy
2、Python數(shù)學(xué)建模三劍客之Scipy
分享標(biāo)題:創(chuàng)新互聯(lián)Python教程:Python數(shù)學(xué)建模三劍客之Matplotlib
地址分享:http://m.5511xx.com/article/codccph.html


咨詢
建站咨詢
