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