Python的matplotlib—绘图(3)
1、快速繪圖
matplotlib的pyplot子庫提供了和matlab類似的繪圖API,方便快速繪制2D圖表
# -*- coding: utf-8 -*- """ Created on Thu Aug 10 18:14:43 2017@author: LiLong """ import numpy as np import matplotlib.pyplot as pltx = np.linspace(0, 10, 1000) y = np.sin(x) z = np.cos(x**2)# 調用figure創建一個繪圖對象,figsize參數指定繪圖對象的寬度和高度 plt.figure(figsize=(8,4)) plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2) # 參數"b--"指定曲線的顏色和線型,這個參數稱為格式化參數 plt.plot(x,z,"b--",label="$cos(x^2)$") # 標簽值 plt.xlabel("Time(s)") plt.ylabel("Volt") # 標題 plt.title("PyPlot First Example") # ylim : 設置Y軸的范圍 plt.ylim(-1.2,1.2) # legend : 顯示圖示 plt.legend() plt.show()- label : 給所繪制的曲線一個名字,此名字在圖示(legend)中顯示。只要在字符串前后添加”$”符號,matplotlib就會使用其內嵌的latex引擎繪制的數學公式。
- color : 指定曲線的顏色
- linewidth : 指定曲線的寬度
運行結果:
2、Artist對象
Artists分為簡單類型和容器類型兩種。簡單類型的Artists為標準的繪圖元件,例如Line2D、 Rectangle、 Text、AxesImage 等等。而容器類型則可以包含許多簡單類型的Artists,使它們組織成一個整體,例如Axis、 Axes、Figure等。
直接使用Artists創建圖表的標準流程如下:
- 創建Figure對象
- 用Figure對象創建一個或者多個Axes或者Subplot對象
- 調用Axies等對象的方法創建各種簡單類型的Artists
下面首先調用pyplot.figure輔助函數創建Figure對象,然后調用Figure對象的add_axes方法在其中創建一個Axes對象,add_axes的參數是一個形如[left, bottom, width, height]的列表,這些數值分別指定所創建的Axes對象相對于fig的位置和大小,取值范圍都在0到1之間。
調用ax的plot方法繪圖,創建一條曲線,并且返回此曲線對象(Line2D)
ax.lines是一個為包含ax的所有曲線的列表,后續的ax.plot調用會往此列表中添加新的曲線。如果想刪除某條曲線的話,直接從此列表中刪除即可。
運行結果:
2.1 Artist的屬性
圖表中的每個元素都用一個matplotlib的Artist對象表示,而每個Artist對象都有一大堆屬性控制其顯示效果。例如Figure對象和Axes對象都有patch屬性作為其背景,它的值是一個Rectangle對象。通過設置此它的一些屬性可以修改Figrue圖表的背景顏色或者透明度等屬性
patch的color屬性通過set_color函數進行設置,屬性修改之后并不會立即反映到圖表的顯示上,還需要調用fig.canvas.draw()函數才能夠更新顯示。
下面是Artist對象都具有的一些屬性:
alpha : 透明度,值在0到1之間,0為完全透明,1為完全不透明
animated : 布爾值,在繪制動畫效果時使用
axes : 此Artist對象所在的Axes對象,可能為None
clip_box : 對象的裁剪框
clip_on : 是否裁剪
clip_path : 裁剪的路徑
contains : 判斷指定點是否在對象上的函數
figure : 所在的Figure對象,可能為None
label : 文本標簽
picker : 控制Artist對象選取
transform : 控制偏移旋轉
visible : 是否可見
zorder : 控制繪圖順序
2.2 Figure容器
最大的Artist容器是matplotlib.figure.Figure,它包括組成圖表的所有元素。圖表的背景是一個Rectangle對象,用Figure.patch屬性表示。當你通過調用add_subplot或者add_axes方法往圖表中添加軸(子圖時),這些子圖都將添加到Figure.axes屬性中,同時這兩個方法也返回添加進axes屬性的對象,注意返回值的類型有所不同,實際上AxesSubplot是Axes的子類。
Figure對象可以擁有自己的文字、線條以及圖像等簡單類型的Artist。缺省的坐標系統為像素點,但是可以通過設置Artist對象的transform屬性修改坐標系的轉換方式。最常用的Figure對象的坐標系是以左下角為坐標原點(0,0),右上角為坐標(1,1)。下面的程序創建并添加兩條直線到fig中:
from matplotlib.lines import Line2D fig = plt.figure() line1 = Line2D([0,1],[0,1], transform=fig.transFigure, figure=fig, color="r") line2 = Line2D([0,1],[1,0], transform=fig.transFigure, figure=fig, color="g") fig.lines.extend([line1, line2]) fig.show()注意為了讓所創建的Line2D對象使用fig的坐標,我們將fig.TransFigure賦給Line2D對象的transform屬性;為了讓Line2D對象知道它是在fig對象中,我們還設置其figure屬性為fig;最后還需要將創建的兩個Line2D對象添加到fig.lines屬性中去。
Figure對象有如下屬性包含其它的Artist對象:
axes : Axes對象列表
patch : 作為背景的Rectangle對象
images : FigureImage對象列表,用來顯示圖片
legends : Legend對象列表
lines : Line2D對象列表
patches : patch對象列表
texts : Text對象列表,用來顯示文字
2.3 Axes容器
Axes容器是整個matplotlib庫的核心,它包含了組成圖表的眾多Artist對象,并且有許多方法函數幫助我們創建、修改這些對象。和Figure一樣,它有一個patch屬性作為背景,當它是笛卡爾坐標時,patch屬性是一個Rectangle對象,而當它是極坐標時,patch屬性則是Circle對象
fig = plt.figure() ax = fig.add_subplot(111) ax.patch.set_facecolor("green") x, y = np.random.rand(2, 100) line, = ax.plot(x, y, "-", color="blue", linewidth=2) fig.show()當你調用Axes的繪圖方法(例如plot),它將創建一組Line2D對象,并將所有的關鍵字參數傳遞給這些Line2D對象,并將它們添加進Axes.lines屬性中
當你調用Axes的繪圖方法(例如plot),它將創建一組Line2D對象,并將所有的關鍵字參數傳遞給這些Line2D對象,并將它們添加進Axes.lines屬性中
與plot方法類似,繪制直方圖的方法bar和繪制柱狀統計圖的方法hist將創建一個Patch對象的列表,每個元素實際上都是Patch的子類Rectangle,并且將所創建的Patch對象都添加進Axes.patches屬性中:
一般我們不會直接對Axes.lines或者Axes.patches屬性進行操作,而是調用add_line或者add_patch等方法,這些方法幫助我們完成許多屬性設置工作:
import matplotlib.patchesfig = plt.figure() ax = fig.add_subplot(111) rect = matplotlib.patches.Rectangle((1,1), width=5, height=12) ax.add_patch(rect) # 將rect添加進ax ax.autoscale_view() # 自動調整坐標軸范圍 fig.show()下面詳細列出Axes包含各種Artist對象的屬性:
artists : Artist對象列表
patch : 作為Axes背景的Patch對象,可以是Rectangle或者Circle
collections : Collection對象列表
images : AxesImage對象列表
legends : Legend對象列表
lines : Line2D對象列表
patches : Patch對象列表
texts : Text對象列表
xaxis : XAxis對象
yaxis : YAxis對象
下面列出Axes的創建Artist對象的方法:
下面以繪制散列圖(scatter)為例,驗證一下
fig = plt.figure() ax = fig.add_subplot(111) t = ax.scatter(np.random.rand(20), np.random.rand(20)) fig.show() print t.get_sizes() # 獲得Collection的點數 print t # 返回值為CircleCollection對象 print ax.collections # 返回的對象已經添加進了collections列表中2.4 Axis容器
Axis容器包括坐標軸上的刻度線、刻度文本、坐標網格以及坐標軸標題等內容。刻度包括主刻度和副刻度,分別通過Axis.get_major_ticks和Axis.get_minor_ticks方法獲得。每個刻度線都是一個XTick或者YTick對象,它包括實際的刻度線和刻度文本。為了方便訪問刻度線和文本,Axis對象提供了get_ticklabels和get_ticklines方法分別直接獲得刻度線和刻度文本:
from matplotlib.ticker import MultipleLocator, FuncFormatterx = np.arange(0, 4*np.pi, 0.01) y = np.sin(x) plt.figure(figsize=(8,4)) plt.plot(x, y) ax = plt.gca() def pi_formatter(x, pos):"""比較羅嗦地將數值轉換為以pi/4為單位的刻度文本"""m = np.round(x / (np.pi/4))n = 4if m%2==0: m, n = m/2, n/2if m%2==0: m, n = m/2, n/2if m == 0:return "0"if m == 1 and n == 1:return "$\pi$"if n == 1:return r"$%d \pi$" % mif m == 1:return r"$\frac{\pi}{%d}$" % nreturn r"$\frac{%d \pi}{%d}$" % (m,n)# 設置兩個坐標軸的范圍 plt.ylim(-1.5,1.5) plt.xlim(0, np.max(x))# 設置圖的底邊距 plt.subplots_adjust(bottom = 0.15)plt.grid() #開啟網格# 主刻度為pi/4 ax.xaxis.set_major_locator( MultipleLocator(np.pi/4) )# 主刻度文本用pi_formatter函數計算 ax.xaxis.set_major_formatter( FuncFormatter( pi_formatter ) )# 副刻度為pi/20 ax.xaxis.set_minor_locator( MultipleLocator(np.pi/20) )# 設置刻度文本的大小 for tick in ax.xaxis.get_major_ticks():tick.label1.set_fontsize(16) plt.show()關于刻度的定位和文本格式的東西都在matplotlib.ticker中定義,程序中使用到如下兩個類:
MultipleLocator : 以指定值的整數倍為刻度放置刻度線
FuncFormatter : 使用指定的函數計算刻度文本,他會傳遞給所指定的函數兩個參數:刻度值和刻度序號,程序中通過比較笨的辦法計算出刻度值所對應的刻度文本
參考:
http://old.sebug.net/paper/books/scipydoc/matplotlib_intro.html
總結
以上是生活随笔為你收集整理的Python的matplotlib—绘图(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wps表格怎么算百分比数值(wps表格怎
- 下一篇: websocket python爬虫_p