天天看點

Matplotlib添加自定義形狀前言添加形狀自定義形狀

前言

我們可以用 Matplotlib 繪制出複雜而又精美的統計圖,同時也講解了注釋的用法,但是這遠遠不夠,很多時候我們還需要繪制複雜形狀,考慮到這一需求,Matplotlib 提供了大量自定義形狀的函數,利用可以在統計圖中添加各種複雜形狀,以使得所繪制的統計圖更加具有進階感。

添加形狀

我們已經學習了使用 lines 原語制作線條,但是在實際中,我們可能需要更多的形狀,使用其他形狀的方式與 lines 原語的相同。

import matplotlib.patches as patches
import matplotlib.pyplot as plt
# 圓形
shape = patches.Circle((0, 0), radius = 1., color = 'm')
plt.gca().add_patch(shape)
# 四邊形
shape = patches.Rectangle((2.5, -.5), 2., 1., color = 'c')
plt.gca().add_patch(shape)
# 橢圓形
shape = patches.Ellipse((0, -2.), 2., 1., angle = 45., color = 'y')
plt.gca().add_patch(shape)
# 花狀框
shape = patches.FancyBboxPatch((2.5, -2.5), 2., 1., boxstyle = 'sawtooth', color = 'b')
plt.gca().add_patch(shape)
# 顯示
plt.grid(True, alpha=0.3)
plt.axis('scaled')
plt.show()      
Matplotlib添加自定義形狀前言添加形狀自定義形狀

Tips:與使用lines原語一樣,使用 Matplotlib 其它形狀原語進行操作時,必須使用 pyplot.axis() 函數修改圖形比例,否則将導緻繪制圖形不能完整顯示。

無論顯示哪種形狀,其原理都是一樣的。在 Matplotlib 中,形狀被描述為名為 patch 的路徑。matplotlib.patches 子產品中提供了幾種形狀的路徑。與線端一樣,僅建立路徑并不會在螢幕上渲染它,必須明确使用渲染函數 plt.gca()。

matplotlib.patches 子產品包含很多路徑構造類,常用的主要包括:

路徑構造類名 描述
Circle 需要圓心坐标和半徑作為參數
Rectangle 需要四邊形左下角的坐标和邊長作為參數
Ellipse 需要橢圓中心坐标和兩軸半長作為參數
FancyBox 這類似于花形框,需要可選參數 boxstyle 指定樣式,可選值包括:"larrow"、"rarrow"、"round"、"round4"、"roundtooth"、"sawtooth"以及 "square" 等

自定義形狀

除了預定義的形狀外,我們還可以使用多邊形定義任意形狀。

使用多邊形

多邊形的使用方法與上一部分中路徑的使用方法類似:

import numpy as np
import matplotlib.patches as patches
import matplotlib.pyplot as plt
theta = np.linspace(0, 2 * np.pi, 8)
points = np.vstack((np.cos(theta), np.sin(theta))).transpose()
plt.gca().add_patch(patches.Polygon(points, color = 'm'))
plt.grid(True)
plt.axis('scaled')
plt.show()      
Matplotlib添加自定義形狀前言添加形狀自定義形狀

Tips:matplotlib.patches.Polygon() 構造函數接受多邊形頂點的坐标清單作為輸入參數值。

使用路徑屬性

所有的路徑都可以使用線條及填充的屬性:包括 linewidth、linestyle、edgecolor、facecolor、hatch 等:

import numpy as np
import matplotlib.patches as patches
import matplotlib.pyplot as plt
theta = np.linspace(0, 2 * np.pi, 8)
points = np.vstack((np.cos(theta), np.sin(theta))).transpose()
plt.gca().add_patch(plt.Circle((0, 0), radius = 1., color = 'm'))
plt.gca().add_patch(plt.Polygon(points, closed=None, fill=None, lw = 3., ls = 'dashed', edgecolor = 'c'))
plt.grid(True)
plt.axis('scaled')
plt.show()      
Matplotlib添加自定義形狀前言添加形狀自定義形狀

Tips:上述示例中,使用帶有虛線邊(ls = 'dashed')的非填充(fill=None)多邊形來繪制多邊形輪廓,使用此方法,就不必建立多個Line對象來繪制此多邊形。