首頁  >  文章  >  後端開發  >  利用python中的繪圖庫繪圖的方法介紹

利用python中的繪圖庫繪圖的方法介紹

Y2J
Y2J原創
2017-05-12 10:49:429420瀏覽

matplotlib是Python最著名的繪圖庫,本文給大家分享了利用matplotlib+numpy繪製多種繪圖的方法實例,其中包括填充圖、散點圖(scatter plots)、. 長條圖(bar plots) 、等高線圖(contour plots)、 點陣圖和3D圖,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

matplotlib 是Python最著名的繪圖庫,它提供了一整套和matlab相似的指令API,十分適合互動式地進行製圖。本文將以例子的形式分析matplot中所支持的,分析中常用的幾種圖。其中包括填充圖、散佈圖(scatter plots)、. 長條圖(bar plots)、等高線圖(contour plots)、 點陣圖和3D圖,下面來一起看看詳細的介紹:

一、填入圖

參考程式碼


from matplotlib.pyplot import *
x=linspace(-3,3,100)
y1=np.sin(x)
y2=np.cos(x)
fill_between(x,y1,y2,where=(y1>=y2),color='red',alpha=0.25)
fill_between(x,y1,y2,where=(y<>y2),color=&#39;green&#39;,alpha=0.25)
plot(x,y1)
plot(x,y2)
show()

簡要分析

這裡主要是用到了fill_between函數。這個函數很好理解,就是傳入x軸的數組和需要填充的兩個y軸數組;然後傳入填充的範圍,用where=來確定填充的區域;最後可以加上填滿顏色啦,透明度之類修飾的參數。

當然fill_between函數還有更進階的用法,詳見fill_between用法或help文件。

效果圖

#二、散佈圖(scatter plots)

參考程式碼


from matplotlib.pyplot import *
n = 1024
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)
T = np.arctan2(Y,X)
scatter(X,Y, s=75, c=T, alpha=.5)
xlim(-1.5,1.5)
ylim(-1.5,1.5)
show()

簡單分析

先介紹一下numpy 的normal函數,很明顯,這是產生常態分佈的函數。這個函數接受三個參數,分別表示常態分佈的平均值,標準差,還有就是產生數組的長度。很好記。

然後是arctan2函數,這個函數接受兩個參數,分別表示y數組和x數組,然後傳回對應的arctan(y/x)的值,結果是弧度製。

接下來用到了繪製散佈圖的scatter方法,首先當然是傳入x和y數組,接著s參數表示scale,即散點的大小;c參數表示color ,我給他傳的是根據角度劃分的一個數組,對應的就是每一個點的顏色(雖然不知道是怎麼對應的,不過好像是一個根據數組內其他元素進行的相對的轉換,這裡不重要了,反正相同的顏色賦一樣的值就好了);最後是alpha參數,表示點的透明度。

至於scatter函數的高階用法可以參見官方文件scatter函式或help文件。

最後設定下座標範圍就好了。

效果圖

#三、長條圖(bar plots)

參考程式碼


from matplotlib.pyplot import *
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)
bar(X, +Y1, facecolor=&#39;#9999ff&#39;, edgecolor=&#39;white&#39;)
bar(X, -Y2, facecolor=&#39;#ff9999&#39;, edgecolor=&#39;white&#39;)
for x,y in zip(X,Y1):
 text(x+0.4, y+0.05, &#39;%.2f&#39; % y, ha=&#39;center&#39;, va= &#39;bottom&#39;)
for x,y in zip(X,Y2):
 text(x+0.4, -y-0.05, &#39;%.2f&#39; % y, ha=&#39;center&#39;, va= &#39;top&#39;)
xlim(-.5,n)
xticks([])
ylim(-1.25,+1.25)
yticks([])
show()

簡單分析

注意要手動導入pylab包,否則會找不到bar。 。 。

先用numpy的arange函數產生一個[0,1,2,…,n]的陣列。 (用linspace也可以)

其次用numpy的uniform函數產生一個均勻分佈的數組,傳入三個參數分別表示下界、上界和陣列長度。並用這個數組產生需要顯示的資料。

然後就是bar函數的使用了,基本用法也和之前的plot、scatter類似,傳入橫縱座標和一些修飾性參數。

接著我們需要用for循環來為長條圖顯示數字:用python的zip函數將X和Y1兩兩配對並循環遍歷,得到每一個資料的位置,然後用text函數在該位置上顯示一個字串(注意位置上的細節調整)。 text傳入橫縱座標,要顯示的字串,ha參數制定橫向對齊,va參數制定縱向對齊。

最後調整下座標範圍,並取消橫縱座標上的刻度以保持美觀即可。

至於bar函數的具體用法可以參考bar函數用法或help文件。

效果圖

#四、等高線圖(contour plots)

參考程式碼


from matplotlib.pyplot import *
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)
contourf(X, Y, f(X,Y), 8, alpha=.75, cmap=cm.hot)
C = contour(X, Y, f(X,Y), 8, colors=&#39;black&#39;, linewidth=.5)
clabel(C, inline=1, fontsize=10)
show()

简要分析

首先要明确等高线图是一个三维立体图,所以我们要建立一个二元函数f,值由两个参数控制,(注意,这两个参数都应该是矩阵)。

然后我们需要用numpy的meshgrid函数生成一个三维网格,即,x轴由第一个参数指定,y轴由第二个参数指定。并返回两个增维后的矩阵,今后就用这两个矩阵来生成图像。

接着就用到coutourf函数了,所谓contourf,大概就是contour fill的意思吧,只填充,不描边;这个函数主要是接受三个参数,分别是之前生成的x、y矩阵和函数值;接着是一个整数,大概就是表示等高线的密度了,有默认值;然后就是透明度和配色问题了,cmap的配色方案这里不多研究。

随后就是contour函数了,很明显,这个函数是用来描线的。用法可以类似的推出来,不解释了,需要注意的是他返回一个对象,这个对象一般要保留下来个供后续的加工细化。

最后就是用clabel函数来在等高线图上表示高度了,传入之前的那个contour对象;然后是inline属性,这个表示是否清除数字下面的那条线,为了美观当然是清除了,而且默认的也是1;再就是指定线的宽度了,不解释,。

效果图

五、点阵图

参考代码


from matplotlib.pyplot import *
def f(x,y):
 return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)
n = 10
x = np.linspace(-3,3,3.5*n)
y = np.linspace(-3,3,3.0*n)
X,Y = np.meshgrid(x,y)
Z = f(X,Y)
imshow(Z,interpolation=&#39;nearest&#39;, cmap=&#39;bone&#39;, origin=&#39;lower&#39;)
colorbar(shrink=.92)
show()

简要分析

这段代码的目的就是将一个矩阵直接转换为一张像照片一样的图,完整的进行显示。

前面的代码就是生成一个矩阵Z,不作解释。

接着用到了imshow函数,传人Z就可以显示出一个二维的图像了,图像的颜色是根据元素的值进行的自适应调整,后面接了一些修饰性的参数,比如配色方案(cmap),零点位置(origin)。

最后用colorbar显示一个色条,可以不传参数,这里传进去shrink参数用来调节他的长度。

效果图

六、3D图

参考代码


import numpy as np
from pylab import *
from mpl_toolkits.mplot3d import Axes3D
fig = 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.cm.hot)
ax.contourf(X, Y, Z, zdir=&#39;z&#39;, offset=-2, cmap=plt.cm.hot)
ax.set_zlim(-2,2)
show()

简要分析

有点麻烦,需要用到的时候再说吧,不过原理也很简单,跟等高线图类似,先画图再描线,最后设置高度,都是一回事。

效果图

总结

【相关推荐】

1. Python免费视频教程

2. Python基础入门教程

3. Python在数据科学中的应用

以上是利用python中的繪圖庫繪圖的方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn