matplotlib架構分爲三層:各層之間單向通訊,即每一層只能與它的下一層通訊,而下層沒法與上層通訊。編程
Scripting(腳本)層:後端
Artist(變現層):數組
Backend(後端層):網絡
在matplotlib的架構中,最下面一層爲 Backend層。 matplotlib API即位於該層,這些是用來在底層實現圖形元素的一個個類。架構
FigureCanvas對象實現了繪圖區域這一律念。框架
Renderer對象在 Figure Canvas上繪圖dom
Event對象處理用戶輸入(鍵盤和鼠標事件)。ide
中間層爲 Artist,層。圖形中全部能看到的元素都屬於 Artist對象,即標題、軸標籤、刻度等組成圖形的全部元素都是 Artis對象的實例。函數
Artist類分爲兩種:原始(primitive)和複合(composite)工具
繪製Line2D或矩形、圓形等幾何圖形,甚至文本等圖形時,造成圖形表示的基礎元素由primitive artist單個對象組成。
由多個基礎元素primitive artist
組成的圖表中的圖像元素叫做 composite artist,
Figure對象在 Artist層的最上面,對應整個圖形表示,一般可包含多條軸(Axes)
Axes對象一般表示圖形或圖表是對什麼內容進行做圖的。每一個Axes對象只屬於一個Figure對象,由兩個(三維就有三個) Artist axis對象組成。標題、x標籤和y標籤等對象都屬於Axes這個composite artist類型的對象。
Axis對象負責展現在Axes對象上面的數值,定義數值範圍,管理刻度(軸上的標記)和刻度值標籤(表明每一個刻度大小的文本標籤)。刻度的位置用 Locator對象調整,刻度標籤的格式用Formatter對象調整。
from pylab import * import matplotlib.pyplot as plt import numpy as np
pylab在同一命名空間整合了 pyplot和 NumPy的功能,所以無需再單獨導入 NumPy。更進一步來講,導人 pylab後, pyplot和 NumPy的函數就能夠直接調用,而不用再指定其所屬模塊(命名空間),從而使得 matplotlib開發環境更像是 Matlab。
pyplot模塊提供操做 matplotlib庫的經典 Python編程接口,有着本身的命名空間,須要單獨導入NumPy庫
經過pyplot函數能夠操做或改動 Figure對象,例如建立 Figure對象和繪圖區域、表示一條線或爲圖形添加標籤等。
pyplot還具備狀態性特性,它能跟蹤當前圖形和繪圖區域的狀態。調用函數時,函數只對當前圖形起做用。
生成一幅簡單的交互式圖表
import matplotlib.pyplot as plt plt.plot([1,2,3,4,5]) plt.show()
1.用紅點來表示每一對(x,y)
import matplotlib.pyplot as plt plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.show()
2.title()函數增長標題。
plt.axis([0,5,0,20]) plt.title('The first') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.show()
3.如何在同一圖形中繪製三種不一樣的趨勢圖.
這些關鍵字做爲參數傳遞給函數。在matplotlib庫各個函數的參考文檔中,每一個函數的最後個參數老是 kwargs。
matplotlib.pyplot.plot(*args, **kwargs)
所以,使用 pyplot時,必須時刻注意當前 Figure對象和當前Axes對象的概念(也就是 Figure對象中當前所顯示的圖形)
一幅圖形中有兩個子圖
subplot(函數不只能夠將圖形分爲不一樣的繪圖區域,還能激活特定子圖,以便用命令控制它。
subplot()函數用參數設置分區模式和當前子圖。只有當前子圖會受到命令的影響。
subplot()函數的參數由三個整數組成:第一個數字決定圖形沿垂直方向被分爲幾部分,第二個數字決定圖形沿水平方向被分爲幾部分,第三個數字設定能夠直接用命令控制的子圖。
把畫布分爲上下兩個向水平方向延伸的子圖
import matplotlib.pyplot as plt import numpy as np t = np.arange(0,5,0.1) y1= np.sin(2*np.pi*t) y2= np.sin(2*np.pi*t) plt.subplot(211) plt.plot(t, y1, 'b-') plt.subplot(212) plt.plot(t,y2, 'r--') plt.show()
t = np.arange(0,5,0.1) y1= np.sin(2*np.pi*t) y2= np.sin(2*np.pi*t) plt.subplot(121) plt.plot(t, y1, 'b-') plt.subplot(122) plt.plot(t,y2, 'r--') plt.show()
plt.axis([0,5,0,20]) plt.title('The first') plt.xlabel('Counting') plt.ylabel('Square Values') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.show()
plt.axis([0,5,0,20]) plt.title('The first',fontsize=20,fontname='Times New Roman' ) plt.xlabel('Counting',color='gray' ) plt.ylabel('Square Values',color='gray') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.show()
text(x, y, s, fontdict=None, **kwargs)
plt.axis([0,5,0,20]) plt.title('The first',fontsize=20,fontname='Times New Roman' ) plt.text(1,1.5,'first') plt.text(2,4.5,'second') plt.text(3,9.5,'third') plt.text(4,16.5,'fourth') plt.xlabel('Counting',color='gray' ) plt.ylabel('Square Values',color='gray') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.show()
將表達式內容置於兩個符號之間,可在文本中添加 LaTeX表達式。解釋器會將該符號之間的文本識別成 LaTex表達式,把它們轉換爲數學表達式、公式、數學符號或希臘字母等,而後在圖像中顯示出來。一般,須要在包含LaTeX表達式的字符串前添加r字符,代表它後面是原始文本,不能對其進行轉義操做。
plt.axis([0,5,0,20]) plt.title('The first',fontsize=20,fontname='Times New Roman' ) plt.text(1,1.5,'first') plt.text(2,4.5,'second') plt.text(3,9.5,'third') plt.text(4,16.5,'fourth') plt.text(1.1,12, r'$y = x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha': 0.2})#添加公式 plt.xlabel('Counting',color='gray' ) plt.ylabel('Square Values',color='gray') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.show()
plt.grid(True)
plt.axis([0,5,0,20]) plt.title('The first',fontsize=20,fontname='Times New Roman' ) plt.text(1,1.5,'first') plt.text(2,4.5,'second') plt.text(3,9.5,'third') plt.text(4,16.5,'fourth') plt.text(1.1,12, r'$y = x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha': 0.2}) plt.grid(True) plt.xlabel('Counting',color='gray' ) plt.ylabel('Square Values',color='gray') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.legend(['first serises']) plt.show()
一處位置,默認爲1,也就是右上角位置。
0:最佳位置
1:右上角
2:左上角
3:右下角
4:左下角
5:右側
6:左側垂直居中
7:右側垂直居中
8:下方水平居中
9:上方水平居中
10:正中間
注意:一般,圖例經過標籤、顏色和(或)符號向讀者代表這是哪個序列,應該與其餘序列區分開來。在前面全部的例子中,咱們只使用了由一個p1ot()函數繪製的單個序列。
plt.axis([0,5,0,20]) plt.title('The first',fontsize=20,fontname='Times New Roman' ) plt.text(1,1.5,'first') plt.text(2,4.5,'second') plt.text(3,9.5,'third') plt.text(4,16.5,'fourth') plt.text(1.1,12, r'$y = x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha': 0.2}) plt.grid(True) plt.xlabel('Counting',color='gray' ) plt.ylabel('Square Values',color='gray') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.plot([1,2,3,4],[0.8,3.5,8,15],'g^') plt.plot([1,2,3,4],[0.5,2.5,4,12],"b*") plt.legend(['first series','second series','third series'],loc=2) plt.show()
保存代碼
將回話轉化成HTML
將圖表直接轉化成圖片
plt.savefig('mychart.png')
注意:保存成圖像的命令以前不要使用plt.show(),不然將獲得空白圖像。
import datetime events=[datetime.date(2015, 1, 23), datetime.date(2015, 1, 28), datetime.date(2015, 2, 3), datetime.date(2015, 2, 21), datetime.date(2015, 3, 15), datetime.date(2015, 3, 24), datetime.date(2015, 4, 8), datetime.date(2015, 4, 24)] readings=[12,22,25,20,18,15,17,14] plt.plot(events, readings) plt.show()
若是讓 matplotlib自動管理刻度,尤爲是刻度的標籤,其後果無疑是一場災難。以這種方式顯示日期時,可讀性不好,兩個數據點之間的時間間隔不清晰,而且還存在重影現象。建議用合適的對象,定義時間尺度來管理日期。
首先須要導入matplotlib.dates模塊,該模塊專門用於管理日期類型的數據。而後,定義時間尺度。下面例子中,用 Monthlocator()和 DayLocator()函數,分別表示月份和日子。
日期格式也很重要,要避免出現重影問題或顯示無效的日期數據,只顯示必要的刻度標籤就好。咱們這裏只顯示年月,把這種格式做爲參數傳給
DateFormatter()函數。
import datetime import numpy as np import matplotlib. pyplot as plt import matplotlib.dates as mdates months = mdates.MonthLocator() days= mdates. DayLocator() timeFmt = mdates.DateFormatter('%Y-%m') events = [datetime. date(2015, 1, 23), datetime.date(2015, 1, 28), datetime.date(2015, 2, 3), datetime.date(2015, 2, 21), datetime.date(2015, 3, 15), datetime.date(2015, 3, 24), datetime.date(2015, 4, 8), datetime.date(2015, 4, 24)] readings=[12,22,25,20,18,15,17,14] fig, ax= plt.subplots() plt.plot(events, readings) ax.xaxis.set_major_locator(months) ax.xaxis.set_major_formatter(timeFmt) ax.xaxis.set_minor_locator( days) plt.show()
y=sin(3*x)/x 圖像
import matplotlib.pyplot as plt import numpy as np x = np.arange(-2*np.pi,2*np.pi,0.01) y=np.sin(3*x)/x plt.plot(x,y) plt.show()
y=sin(n* x)/x的圖像
x = np.arange(-2*np.pi,2*np.pi,0.01) y=np.sin(3*x)/x y1=np.sin(4*x)/x y2=np.sin(5*x)/x plt.plot(x,y) plt.plot(x,y1) plt.plot(x,y2) plt.show()
能夠用plot(函數的第三個參數指定顏色/線型,把這些設置所用的字符編碼放到同一個字符串便可。
還可使用兩個單獨的關鍵字參數,用 color指定顏色,用 linestyle指定線型
| 編碼 | 顏色 |
| :--- | :--- |
| b | 藍色 |
| g | 綠色 |
| r | 紅色 |
| c | 藍綠色 |
| m | 洋紅 |
| y | 黃色 |
| k | 黑色 |
| w | 白色 |
x軸的數值範圍爲-2π~2π,可是刻度標籤默認使用數值形式須要用π的倍數代替數值。
同理,能夠替換y軸刻度的標籤。方法是使用 sticks()和 sticks()函數,分別爲每一個函數傳入兩列數值。第一個列表存儲刻度的位置,第二個列表存儲刻度的標籤。
import matplotlib.pyplot as plt import numpy as np x = np.arange(-2*np.pi,2*np.pi,0.01) y=np.sin(3*x)/x y1=np.sin(4*x)/x y2=np.sin(5*x)/x plt.plot(x,y,color='b') plt.plot(x,y1,color='r') plt.plot(x,y2,color='g' ) plt.xticks([-2*np.pi,-np.pi,0,np.pi,2*np.pi], [r'$-2\pi$',r'$-\pi$',r'$0$',r'$+\pi$',r'$+2pi$']) plt.yticks([-1,0,+1,+2,+3], [r'$-1$',r'$ 0 $',r'$+1$',r'$+2$',r'$+3$']) plt.show()
前面的全部線性圖中,x軸和軸老是置於 Figure的邊緣(跟圖像的邊框重合)
另一種顯示軸的方法是,兩條軸穿過原點(0,0),也就是笛卡兒座標軸。
具體作法是,首先必須用gca()函數獲取Axes對象。接着經過這個對象,指定每條邊的位置:右、左、下和上,可選擇組成圖形邊框的每條邊。使用 set_color()函數,把顏色設置爲none,刪除跟座標軸不符合的邊(右和上)。而後,用 set_position()函數移動跟x軸和軸相符的邊框,使其穿過原點(0,0)
ax.spines['right']. set_color('none') ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data', 0)) ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data',0))
用註釋和箭頭(可選)明曲線上某一數據點的位置,這一功能很是有用。例如,能夠用 LaTeX表達式做爲註釋,好比添加表示x趨於0時函數 sinx/x的極限的公式。
matplotlib庫的 annotate()函數特別適用於添加註釋。雖然它有多個關鍵字參數,這些參數可改善顯示效果,可是參數設置略顯繁瑣,也就使得 annotate()函數看似有些麻煩。
第一個參數爲含有 LaTex表達式、要在圖形中顯示的字符串;
隨後是各類關鍵字參數。註釋在圖表中的位置用存放數據點[x,y]座標的列表來表示,需把它們傳給xy關鍵字參數。
文本註釋跟它所解釋的數據點之間的距離用xytext關鍵字參數指定,用曲線箭頭將其表示出來。
箭頭的屬性則由arrowprops關鍵字參數指定。
plt.annotate(r'$\lim_{x\to 0}\frac{\sin()}{x}= 1$', xy=[0, 1], xycoords='data', xytext=[30, 30], fontsize=16, textcoords='offset points', arrowprops=dict(arrowstyle="->", connectionstyle="arc, rad= 2"))
-將DataFrame中的數據作成線性圖表很簡單,只需把 DataFrame做爲參數傳入plot()函數,就能獲得多序列線性圖。
import matplotlib.pyplot as plt import numpy as np import pandas as pd data = { 'series1':[1,3,4,3,5], 'series2':[2,4,5,2,4], 'series3':[3,2,3,1,3]} df = pd.DataFrame(data) x = np.arange(5) plt.axis([0,5,0,7]) plt.plot(x,df) plt.legend(data,loc=2) plt.show()
pyplot用於繪製直方圖的函數爲hist(),該函數具備一個其餘繪圖函數所沒有的功能。它除了繪製直方圖外,還以元組形式返回直方圖的計算結果。事實上,hist()函數還能夠實現直方圖的計算。也就是說,它可以接收一系列樣本個體和指望的面元數量做爲參數,會把樣本範圍分紅多個區間(面元),而後計算每一個面元所包含的樣本個體的數量。運算結果除了以圖形形式表示外,還能以元組形式返回。
例子
pop = np.random.randint(0,100,100) n,bins,patches = plt.hist(pop,bins=20) plt.show()
index = [0,1,2,3,4] values = [5,7,3,4,6] plt.bar(index,values) plt.show()
index = np.arange(5) values = [5,7,3,4,6] plt.bar(index,values) plt.xticks(index,['A','B','C','D','E']) plt.show()
還能夠藉助不少其餘步驟進一步改進條狀圖。每一種改進方法都是經過在bar()函數中添加特定的關鍵字參數來實現的。
例如,把包含標準差的列表傳給yerr關鍵字參數,就能添加標準差。這個參數常跟error_kw參數一塊兒使用,然後者又接收其餘可用於顯示偏差線的關鍵字參數。
經常使用的兩個是 eColor和 capsize, eColor指定偏差線的顏色,而 capsize指定偏差線兩頭橫線的寬度。
還有一個參數叫做 alpha,它控制的是彩色條狀圖的透明度。 alpha的取值範圍爲0-1。0表示對象徹底透明,隨着alpha值的增長,對象逐漸清晰起來,到1時,顏色顯示全了。
帶有偏差線的條狀圖
index = np.arange(5) values = [5,7,3,4,6] std1 = [0.8,1,0.4,0.9,1.3] plt.title('A bar Chart') plt.bar(index,values,yerr=std1,error_kw={'ecolor':'0.1', 'capsize':6},alpha=0.7,label='First') plt.xticks(index,['A','B','C','D','E']) plt.show()
軸的用途跟垂直條狀圖恰好相反。水平條狀圖中,類別分佈在軸上,數值顯示在x軸。
index = np.arange(5) values = [5,7,3,4,6] std1 = [0.8,1,0.4,0.9,1.3] plt.title('A Horizontal bar Chart') plt.barh(index,values,xerr=std1,error_kw={'ecolor':'0.1', 'capsize':6},alpha=0.7,label='First') plt.yticks(index,['A','B','C','D','E']) plt.show()
條,就將其分爲幾部分。建議再增長一個額外的空間,以便區分兩個相鄰的類別。
index = np.arange(5) values1 = [5,7,3,4,6] values2 = [6,6,4,5,7] values3 = [5,6,5,4,6] bw = 0.3 plt.axis([0,5,0,8]) plt.title('A Multiseries Bar Chart',fontsize=20) plt.bar(index,values1,bw,color='b') plt.bar(index+bw,values2,bw,color='g') plt.bar(index+2*bw,values3,bw,color='r') plt.xticks(index+1.5*bw,['A','B','C','D','E']) plt.show()
index = np.arange(5) values1 = [5,7,3,4,6] values2 = [6,6,4,5,7] values3 = [5,6,5,4,6] bw = 0.3 plt.axis([0,8,0,5]) plt.title('A Multiseries Bar Chart',fontsize=20) plt.barh(index,values1,bw,color='b') plt.barh(index+bw,values2,bw,color='g') plt.barh(index+2*bw,values3,bw,color='r') plt.yticks(index+1.5*bw,['A','B','C','D','E']) plt.show()
data = { 'series1':[1,3,4,3,5], 'series2':[2,4,5,2,4], 'series3':[3,2,3,1,3]} df = pd.DataFrame(data) df.plot(kind='bar',stacked=True) plt.show()
另一種很是有用的圖形表示法是用條狀圖表現對比關係。兩列有着共同類別的數據,其條狀圖形分列於x軸兩側,沿y軸方向生長。
要生成這類圖形,需事先對其中一個序列的y值進行取相反數操做
如何修改條狀圖的邊框和條狀圖內部區域的顏色。其實,只要用另外兩個關鍵字參數 facecolor和 edgecolor設置兩種不一樣的顏色便可。
如何在每一個長條的末端顯示ν值標籤,這有助於加強條狀圖的可讀性。可使用for循環,在循環體內再借助text()函數顯示y值標籤。標籤的位置可用ha和va關鍵字參數來調整,它們分別控制着標籤在水平和垂直方向上的對齊效果。
x0 = np.arange(8) y1 = np.array([1,3,4,6,4,3,2,1]) y2 = np.array([1,2,3,4,3,3,2,1]) plt.ylim(-7,7) plt.bar(x0,y1,0.9,facecolor='r',edgecolor='w') plt.bar(x0,-y2,0.9,facecolor='b',edgecolor='w') plt.xticks(()) plt.grid(True) for x ,y in zip(x0,y1): plt.text(x+0.4,y+0.05,'%d' %y,ha='center',va='bottom') for x ,y in zip(x0,y2): plt.text(x+0.4,-y-0.05,'%d' %y,ha='center',va='top') plt.show()
餅圖也能夠用來表示數據。用pie(函數製做餅圖很簡單。
該函數仍然以要表示的一列數據做爲主要參數。這裏直接選用百分比(總和爲100),能夠選用每種類別的實際數值,而讓pie(函數本身去計算每一個類別所佔的比例。
對於這類圖表,仍需用關鍵字參數設置關鍵特徵。例如,若要定義顏色列表,爲做爲輸入的數據序列分配顏色,可以使用 colors關鍵字參數,把顏色列表賦給它。另一個重要的功能是爲餅圖的每一小塊添加標籤,爲此需使用 labels關鍵字參數,把標籤列表賦給它。此外,爲了繪製標準的圓形餅圖,還須要在代碼最後調用axis()函數,用字符串' equal'做爲參數。
labels=['Nokia','Samsung','Apple', 'Lumia'] values=[10,30,45,15] colors=['yellow','green','red', 'blue'] plt.pie(values,labels=labels,colors=colors) plt.axis('equal') plt.show()
然是一個完整的圓;而0~1的值則表示這一塊未徹底脫離餅圖。
labels=['Nokia','Samsung','Apple', 'Lumia'] values=[10,30,45,15] colors=['yellow','green','red', 'blue'] explode = [0.3,0,0,0] plt.title('A Pie Chart') plt.pie(values,labels=labels,colors=colors,explode=explode,startangle=180) plt.axis('equal') plt.show()
用autopct關鍵字參數,在每一塊的中間位置添加文本標籤來顯示百分比。
能夠用 shadow關鍵字參數添加陰影效果,將其置爲True便可
plt.pie(values,labels=labels,colors=colors,explode=explode,startangle=180,shadow=True,autopct='%1.1f%%')
data = { 'series1':[1,3,4,3,5], 'series2':[2,4,5,2,4], 'series3':[3,2,3,1,3]} df = pd.DataFrame(data) df['series1'].plot(kind='pie',figsize=(6,6)) plt.show()
等值線圖或等高線圖在科學界很經常使用。這種可視化方法用由一圈圈封閉的曲線組成的等值線圖表示三維結構的表面,其中封閉的曲線表示的是一個個處於同一層級或z值相同的數據點。雖然等值線圖看上去結構很複雜,其實用 matplotlib實現起來並不難。首先,你須要用z=f(xy)函數生成三維結構。而後,定義x、y的取值範圍,肯定要顯示的區域。以後使用(xy)函數計算每一對(xy)所對應的z值,獲得一個z值矩陣。最後,用 Contour()函數生成三維結構表面的等值線圖。
定義顏色表,爲等值線圖添加不一樣顏色,效果每每會更好;也就是說,用漸變色填充由等值線劃分紅的區域。
dx = 0.01 dy = 0.01 x = np.arange(-2.0,2.0,dx) y = np.arange(-2.0,2.0,dy) X,Y = np.meshgrid(x,y) def f(x,y): return (1-y**5+x**5)*np.exp(-x**2-y**2) C = plt.contour(X,Y,f(X,Y),8,color='black') plt.contourf(X,Y,f(X,Y),8) plt.clabel(C,inline=1,fontsize=10) plt.show()
cmap關鍵字參數決定了顏色的種類
colorbar()函數增長圖例做爲對圖表中所用顏色的說明
dx = 0.01 dy = 0.01 x = np.arange(-2.0,2.0,dx) y = np.arange(-2.0,2.0,dy) X,Y = np.meshgrid(x,y) def f(x,y): return (1-y**5+x**5)*np.exp(-x**2-y**2) C = plt.contour(X,Y,f(X,Y),8,color='black') plt.contourf(X,Y,f(X,Y),8,cmap=plt.cm.hot) plt.clabel(C,inline=1,fontsize=10) plt.colorbar() plt.show()
這種圖表由一系列呈放射狀延伸的區域組成,其中每塊區域佔據必定的角度。所以若要用極區圖表示兩個不一樣的數值,分別指定它們在極區圖中所佔的份量:每塊區域的半徑r和它所佔的角度,其實這就是極座標(r,θ),是在座標軸系中表示數據的另外一種方法。
自定義任意的顏色列表,方法是指定顏色列表,其中每一個元素爲字符
串類型的RGB編碼,其格式爲#rrggbb
N = 8 theta = np.arange(0.,2*np.pi,2*np.pi/N) radii = np.array([4,7,5,3,1,5,6,7]) plt.axes([0.025,0.025,0.95,0.95],polar=True) colors = np.array(['#4bb2c5',"#c5b47f","#EAAA28","#579575",'#839557',"#958c12", '#953579',"#4b5de4"]) bars = plt.bar(theta,radii,width=(2*np.pi/N),bottom=0.0,color=colors) plt.show()
colors =np.array(['lightgreen', 'darkred','navy','brown','violet','plum', 'yellow','darkgreen'])
plot3d仍然使用 Figure對象,只不過Axes對象要替換爲該工具集的Axes3D對象。所以,使用Axes30對象前,需先將其導入進來。
from mpl_toolkits.mplot3d import Axes3D
plot_surface()函數繪製曲面。
fig = plt.figure() ax = Axes3D(fig) X = np.arange(-2,2,0.1) Y = np.arange(-2,2,0.1) X,Y = np.meshgrid(X,Y) def f(x,y): return (1-y**5+x**5)*np.exp(-x**2-y**2) ax.plot_surface(X,Y,f(X,Y),rstride=1,cstride=1) plt.show()
fig = plt.figure() ax = Axes3D(fig) X = np.arange(-2,2,0.1) Y = np.arange(-2,2,0.1) X,Y = np.meshgrid(X,Y) def f(x,y): return (1-y**5+x**5)*np.exp(-x**2-y**2) ax.plot_surface(X,Y,f(X,Y),rstride=1,cstride=1,cmap=plt.cm.hot) ax.view_init(elev=30,azim=125) plt.show()
經過這種可視化方法,可以識別數據點的分佈是否遵循某種特定趨勢,尤爲是能夠識別它們是否有彙集成簇的趨勢。
下面這個例子中,咱們仍舊使用 scatter()函數,使用方法跟繪製2D圖形相同,可是要將其應用於AXes3D對象。這樣作,你能夠屢次調用scatter()函數,在同一個3D對象中顯示不一樣的序列。
xs = np.random.randint(30, 40,100) ys = np.random.randint (20, 30, 100) zs =np.random.randint(10,20,100) xs2 =np. random.randint (50, 60, 100) ys2 =np. random.randint(30,40,100) zs2 = np. random.randint(50,70, 100) xs3 =np.random.randint(10, 30, 100) ys3 =np. random.randint(40, 50, 100) zs3 =np. random.randint(40, 50, 100) fig = plt.figure() ax = Axes3D(fig) ax.scatter(xs,ys,zs) ax.scatter(xs2,ys2,zs2,c='r',marker='^') ax.scatter(xs3,ys3,zs3,c='g',marker='*') ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label') plt.show()
x = np.arange(8) y = np.random.randint(0,10,8) y2 = y + np.random.randint(0,10,8) y3 = y2 + np.random.randint(0,10,8) y4 = y3 + np.random.randint(0,10,8) y5 = y4 + np.random.randint(0,10,8) clr = ['#4bb2c5',"#c5b47f","#EAAA28", "#579575",'#839557',"#958c12", '#953579',"#4b5de4"] fig = plt.figure() ax = Axes3D(fig) ax.bar(x,y,0,zdir='y',color=clr) ax.bar(x,y2,10,zdir='y',color=clr) ax.bar(x,y3,20,zdir='y',color=clr) ax.bar(x,y4,30,zdir='y',color=clr) ax.bar(x,y5,40,zdir='y',color=clr) ax.set_xlabel('X Axis') ax.set_ylabel('Y Axis') ax.set_zlabel('Z Axis') ax.view_init(elev=40) plt.show()
fig = plt.figure() ax = fig.add_axes([0.1,0.1,0.8,0.8]) inner_ax = fig.add_axes([0.6,0.6,0.25,0.25]) x1 = np.arange(10) y1 = np.array([1,2,7,1,5,2,4,2,3,1]) x2 = np.arange(10) y2 = np.array([1,3,4,5,4,5,2,6,4,3]) ax.plot(x1,y1) inner_ax.plot(x2,y2) plt.show()
數,方法也很簡單。 matplotlib的 Gridspec()函數可用來管理更爲複雜的狀況。它把繪圖區域分紅多個子區域,你能夠把一個或多個子區域分配給每一幅子圖。
gs = plt.GridSpec(3,3) fig = plt.figure(figsize=(6,6)) fig.add_subplot(gs[1,:2]) fig.add_subplot(gs[0,:2]) fig.add_subplot(gs[2,0]) fig.add_subplot(gs[:2,2]) fig.add_subplot(gs[2,1:]) plt.show()
gs = plt.GridSpec(3,3) fig = plt.figure(figsize=(6,6)) x1 = np.array([1,3,2,5]) y1 = np.array([4,3,7,2]) x2 = np.arange(5) y2 = np.array([3,2,4,6,4]) s1 = fig.add_subplot(gs[1,:2]) s1.plot(x1,y1,'r') s2 = fig.add_subplot(gs[0,:2]) s2.bar(x2,y2) s3 = fig.add_subplot(gs[2,0]) s3.barh(x2,y2,color='g') s4 = fig.add_subplot(gs[:2,2]) s4.plot(x2,y2,'k') s5 = fig.add_subplot(gs[2,1:]) s5.plot(x1,y1,'b',x2,y2,'yo') plt.show()