- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
程式語言:Python
Package:matplotlib
官網
官方圖廊
功能:畫圖
Python--matplotlib绘图可视化知识点整理
Package:matplotlib
官網
官方圖廊
功能:畫圖
基本概念
- Figure
- 最上層的物件
- 包含 Axes 物件,甚至其他的元件
- Axes
- 常用的畫圖物件,包含座標軸,像是直方圖、折線圖、圓餅圖等
- Axis
- 座標軸物件
- 若使用 plt.method,其實就是在呼叫當前的 axes 進行畫圖
- matplotlib.pyplot.gcf()
- 得到當前的 figure
- matplotlib.pyplot.gca()
- 得到當前的 axes
- matplotlib.pyplot.sca(ax)
- 設定當前的 axes,並且會自動更正 figure
- 參數對應圖
import numpy as np import matplotlib.pyplot as plt # 建立 x,從 -pi 到 pi,共 100 點,且需包含終點 pi x = np.linspace(-np.pi, np.pi, num=100, endpoint=True) c,s,t = np.cos(x), np.sin(x), np.tan(x) # 第一次呼叫 plt.plot 會自動建立合適的 figure # 之後若有使用到 plt.method 皆以此 figure 為主 # 可以使用 latex 語法,需用 $ ... $ 包住 plt.plot(x, c, label=r'cos$\theta$') # 之後呼叫 plt.plot 會使用先前建立的 figure # 畫出紅色向下三角形 plt.plot(x, s, 'rv', label=r'sin$\theta$') # 畫出綠虛線,並在各點位置標上綠線青圓點 plt.plot(x, t, color='g', linestyle='dashed', marker='o', markerfacecolor='c', markersize=5) # 以下為特調需求,不見得需要 # --------------------------------------------- # 用来正常顯示中文標簽 plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常顯示負號 plt.rcParams['axes.unicode_minus']=False # 設定 x軸 label plt.xlabel('X軸') # 設定 x軸對應的刻度,並替換為文字 plt.xticks( [-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$']) # 設定 x軸左右範圍 xmin ,xmax = x.min(), x.max() dx = (xmax - xmin) * 0.2 plt.xlim(xmin - dx, xmax + dx) # 設定 y軸 label plt.ylabel('Y軸') # 設定 x軸對應的刻度 plt.yticks([-1, 0, +1]) # 設定 y軸上下範圍 ymin ,ymax = c.min(), c.max() dy = (ymax - ymin) * 0.2 plt.ylim(ymin - dy, ymax + dy) plt.title('標題') # 放置文字 plt.text(0, 1.2, '我在這', color='red') # 需有 label 才會顯示,所以 tanθ 並無顯示 plt.legend() # 建立中心坐標軸 # 回傳目前的坐標軸 get current axes ax = plt.gca() # 將上跟右的線,設成隱藏 ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') # 設定 x軸刻度顯示在下方 ax.xaxis.set_ticks_position('bottom') # 設定下方的線,移動至 data 為 -1 的地方 ax.spines['bottom'].set_position(('data',-1)) # 設定 y軸刻度顯示在左方 ax.yaxis.set_ticks_position('left') # 設定左方的線,移動至坐標軸中心 ax.spines['left'].set_position(('axes', 0.5)) # --------------------------------------------- # 顯示圖 plt.show()
兩種方法
subplot
較簡單,但自定性不高
subplot 搭配 gridspec
subplot
較簡單,但自定性不高
import matplotlib.pyplot as plt # 建立第一張圖,若直接 plt.plot 隱含自動建立 figure 並建立 subplot(111) plt.figure(1) # 第一張圖的第一張子圖,231 表示大小為 row:2 col:3 的第一張,index 從 1 開始 plt.subplot(231) plt.plot([1,2,3]) # 第一張圖的第五張子圖,等同235,index 從 1 開始 # plt.subplot(nrows, ncols, plot_number) # 但 plot_number 不是參數名,所以無法寫成 plt.subplot(nrows=2, ncols=3, plot_number=5) plt.subplot(2, 3, 5) plt.plot([4,5,6]) # 建立第二張圖,若無建立,以下行為會覆蓋之前的圖 plt.figure(2) # 默認建立子圖 subplot(111) plt.plot([4,5,6]) # 切換到 figure 1 ; 子圖 subplot(235) 仍是當前圖 plt.figure(1) # 加入 subplot 235 的標题 plt.title('fifth', color='r') # 顯示圖 plt.show()
subplot 搭配 gridspec
import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec # 建立 3x3 的 GridSpec gs = gridspec.GridSpec(2, 3) # 建立第一張圖,若直接 plt.plot 隱含自動建立 figure 並建立 subplot(111) plt.figure(1) # 第一張圖的 (0,-1) 子圖,index 從 0 開始 plt.subplot(gs[0,-1]) plt.plot([1,2,3]) # 第一張圖的第二欄,index 從 0 開始,也可用 [1,0:3] 表示 plt.subplot(gs[1,:]) plt.plot([4,5,6]) # 建立第二張圖,若無建立,以下行為會覆蓋之前的圖 plt.figure(2) # 默認建立子圖 subplot(111) plt.plot([4,5,6]) # 切換到 figure 1 ; 子圖 (1,:) 仍是當前圖 plt.figure(1) # 切換到 (0,-1) 成為 figure1 的當前圖 plt.subplot(gs[0,-1]) # 加入 subplot (0,-1) 的標题 plt.title('(0,-1)', color='r') # 顯示圖 plt.show()
import numpy as np import matplotlib.pyplot as plt np.random.seed(0) # 平均 200,標準差為 25 的分佈 mu = 200 sigma = 25 x = np.random.normal(mu, sigma, size=100) # 擁有兩張子圖,大小為 15x4 inch,dpi 分辨率 為 100 px/inch,故圖大小為 1500x400 px fig, (ax0, ax1) = plt.subplots(ncols=2, figsize=(15, 4), dpi=100) # 分成 5 組,背景為透明度為 0.75 的綠色,並且縱軸不做正規化處理為數量,直條的間距填滿 ax0.hist(x, 5, normed=0, histtype='stepfilled', facecolor='g', alpha=0.75) ax0.set_title('stepfilled\n' + r'$\mu = 200, \sigma=25$') # 自定分組,縱軸執行正規化處理表示為機率,直條的寬度大小為 80% bins = [100, 150, 180, 195, 205, 220, 250, 300] ax1.hist(x, bins, normed=1, histtype='bar', rwidth=0.8) ax1.set_title('unequal bins\n' + r'$\mu = 200, \sigma=25$') # 緊密排列,並填滿原圖大小 fig.tight_layout() # 顯示圖 plt.show()
import numpy as np import matplotlib.pyplot as plt N = 150 # 產生 150 個 0~2 之間的隨機半徑 r = 2 * np.random.rand(N) # 產生 150 個 0~2pi 之間的隨機弧度 theta = 2 * np.pi * np.random.rand(N) # 區域大小與半徑成正比 area = 50 * r**2 # 顏色由弧度決定 colors = theta ax = plt.subplot(211) c = ax.scatter(theta, r, c=colors, s=area, cmap='hsv', alpha=0.75) # 畫出極座標圖,此時的 x 為弧度,y 為半徑 ax = plt.subplot(212, projection='polar') c = ax.scatter(theta, r, c=colors, s=area, cmap='hsv', alpha=0.75) plt.show()
import matplotlib.pyplot as plt labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' sizes = [15, 30, 45, 10] # 分離係數,所以只有 'Hogs' 會分離 explode = (0, 0.1, 0, 0) fig1, ax1 = plt.subplots() # 從 90° 開始,逆時針排列,並加上陰影,並加上每塊的比例,格式為 '%1.2f%%' ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.2f%%', shadow=True, startangle=90) # 調整比例,確認顯示為圓形 ax1.axis('equal') plt.show()
參考
Matplotlib 教程Python--matplotlib绘图可视化知识点整理
留言
張貼留言