Patches绘制几何图形
模块 patches 主要用来完成多边形的绘制工作。这些多边形都是以类(Class)的形式出现的, 主要包括圆(Circle)、椭圆(Ellipse)、矩形(Rectangle)、圆弧(Arc)、楔形(Wedge)等几何图形。 下面,我们就介绍这些几何图形的实现方法。
一,圆的实现方法
(1)代码示例
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Circlefig, ax = plt.subplots(2, 2)# subplot(221)
circle = Circle((2, 2), radius=2, facecolor="white", edgecolor="cornflowerblue")
ax[0, 0].add_patch(circle)ax[0, 0].set_xlim(-1, 5)
ax[0, 0].set_ylim(-1, 5)# subplot(222)
rectangle = ax[0, 1].patch
rectangle.set_facecolor("gold")circle = Circle((2, 2), radius=2, facecolor="white", edgecolor="cornflowerblue")
ax[0, 1].add_patch(circle)ax[0, 1].set_xlim(-1, 5)
ax[0, 1].set_ylim(-1, 5)ax[0, 1].set_aspect("equal", "box")# subplot(223)
rectangle = ax[1, 0].patch
rectangle.set_facecolor("palegreen")circle = Circle((2, 2), radius=2, facecolor="white", edgecolor="cornflowerblue")
ax[1, 0].add_patch(circle)ax[1, 0].axis("equal")# subplot(224)
rectangle = ax[1, 1].patch
rectangle.set_facecolor("lightskyblue")circle = Circle((2, 2), radius=2, facecolor="white", edgecolor="cornflowerblue")
ax[1, 1].add_patch(circle)ax[1, 1].axis([-1, 5, -1, 5])
ax[1, 1].set_yticks(np.arange(-1, 6, 1))ax[1, 1].axis("equal")plt.subplots_adjust(left=0.1)plt.show()
(2)代码讲解
(1)以“Circle((2,2),radius=2,facecolor="white",edgecolor="cornflowerblue")”语句为例,讲解类 Circle 的使用方法,具体参数和参数值的含义如下。
- (2,2):圆的中心的坐标位置。
- radius:圆的半径大小。
- facecolor:圆的填充颜色。
- edgecolor:圆的轮廓的颜色。
(2)通过调用“Circle((2,2),radius=2,facecolor="white",edgecolor="cornflowerblue")”语句,生成 了子区 1 中圆心在(2,2)处、半径为 2、填充颜色是白色和轮廓颜色是矢车菊蓝的圆的实例。
(3)为了在子区 1 中展示实例 circle 的可视化效果,需要调用“ax[0,0].add_patch(circle)”语句。 也就是说,需要调用实例方法 add_patch()将实例 circle 以参数值形式添加到坐标轴实例 ax[0,0]中, 从而完成指定位置和指定半径的圆的绘制工作。
(4)为了清楚地显示绘制的圆的位置和半径,调用实例方法 set_xlim()和 set_ylim(),调整 x 轴 和 y 轴的坐标轴的显示范围。 注意: 子区 1 中圆的形状并不是圆,而是椭圆,是由于坐标轴的刻度线的变化量不一致导致的。
(5)为了解决圆的形状不理想的问题,调用“ax[0,1].set_aspect("equal","box")”语句。这样,我 们就实现了 x 轴和 y 轴的长度相同、刻度线的变化量相同的目标。 第 2 章 使用模块 patches 绘制几何图形
(6)为了凸显圆的形状的理想情况,调用类 Rectangle 的实例方法 set_facecolor()分别设置子 区 2、子区 3 和子区 4 的坐标轴的背景色。
(7)在子区 2 中,可以看到在调用这些语句后产生的理想的圆的展示效果。
(8)在子区 3 中,不进行调整 x 轴和 y 轴的坐标轴的显示范围的操作,只是简单地调用 “ax[1,0].axis("equal")”语句,将刻度线的变化量进行调整,使之保持相同的增量,从而产生理想的 圆的可视化效果。
(9)在子区 4 中,既通过调用“ax[1,1].axis([-1,5,-1,5])”语句调整了 x 轴和 y 轴的坐标轴的显示 范围和通过调用“ax[1,1].set_yticks(np.arange(-1,6,1))”语句调整了刻度线的位置,也通过调用 “ax[1,1].axis("equal")”语句调整了刻度线的变化量。
二,矩形的实现方法
矩形是数据可视化中一种比较常见的几何图形。在具体实践中,我们通过类 Rectangle 生成矩形 实例,将矩形实例添加到坐标轴中,从而完成矩形的绘制任务。这种多边形既可以充当坐标轴背景, 也可以作为组合图形的一部分。
(1)代码示例
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Rectanglefig, ax = plt.subplots(subplot_kw={"aspect": "equal"})x1 = np.arange(1, 2.6, 0.1)
y1 = x1 + 2x2 = np.arange(2.5, 4.1, 0.1)
y2 = -x2 + 7# set background color
rectangle = ax.patch
rectangle.set_facecolor("lightskyblue")# house
rectangle1 = Rectangle((1, 0), 3, 3, facecolor="w", edgecolor="rosybrown")# door
rectangle2 = Rectangle((1.5, 0), 1, 1.5, facecolor="w", edgecolor="rosybrown",hatch="|||")# window
rectangle3 = Rectangle((2.9, 1.7), 0.6, 0.6, facecolor="w", edgecolor="rosybrown")rectangle_list = [rectangle1, rectangle2, rectangle3]# roof line
ax.plot([1, 2.5, 4], [3, 4.5, 3], color="rosybrown")# window line
ax.plot([3.2, 3.2], [1.7, 2.3], color="rosybrown")
ax.plot([2.9, 3.5], [2.0, 2.0], color="rosybrown")# roof filled color
ax.fill_between(x1, 3, y1, color="w", interpolate=True)
ax.fill_between(x2, 3, y2, color="w", interpolate=True)for rect in rectangle_list:ax.add_patch(rect)ax.axis([0, 5, 0, 6])plt.show()
(2)代码讲解
<1>通过调用“ax.patch”语句,获得类 Rectangle(xy=(0,0),width=1,height=1)的实例 rectangle。 <2>通过调用“rectangle.set_facecolor("lightskyblue")”语句,设置坐标轴实例 ax 的背景色。
<3>通过调用“Rectangle((1,0),3,3,facecolor="w",edgecolor="rosybrown")”语句,绘制第一个矩 形。这个矩形的左下角顶点的坐标是(1,0),矩形的宽度和高度都是 3,也是一个正方形。我们也设 置了矩形内部的填充颜色和轮廓的线条颜色。其他两个矩形的绘制方法与第一个矩形的绘制方法完 全相同,只是矩形的左下角顶点的位置和矩形的形状不同。 注意: 第二个矩形 rectangle2 还使用参数 hatch 增加了装饰图案“|”,使房子的门产生木质纹理的展示效果。
<4>使用“ax.plot([1,2.5,4],[3,4.5,3],color="rosybrown")”语句,设置屋顶的轮廓的线条颜色。
<5>通过实例方法 plot()向第三个矩形中添加了窗户的窗框。
<6>通过调用实例方法 fill_between()将屋顶的填充颜色设置为白色,与所有矩形内部的填充颜 色一致。 这样,我们将绘制矩形的方法与前面讲过的相关方法相结合,相对完整地绘制了一个简易房屋。 需要补充的是,我们看到,使用 matplotlib 不仅可以完成绘制统计图形的任务,还可以实现绘制图画的目标。
三,圆弧和楔形的实现方法
圆弧作为椭圆的一部分而被大量使用,楔形作为圆的一部分而得到广泛应用。具体而言,圆弧 的实现方法是借助类 Arc 实现的,楔形是通过类 Wedge 进行绘制的。
(1)代码示例
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Arc, Ellipse, Rectangle, Wedgefig, ax = plt.subplots(subplot_kw={"aspect": "equal"})# shadow
shadow = Ellipse((2.5, 0.5), 4.2, 0.5, color="silver", alpha=0.2)# base
ax.plot([1, 4], [1, 1.3], color="k")
base = Arc((2.5, 1.1), 3, 1, angle=10, theta1=0, theta2=180, color="k", alpha=0.8)# wheel
left_wheel = Ellipse((1, 1), 0.7, 0.4, angle=95, color="k")
right_wheel = Ellipse((4, 1.3), 0.7, 0.4, angle=85, color="k")# joinstyle
bottom_joinstyle1 = Ellipse((2.5, 2), 1, 0.3, facecolor="silver", edgecolor="w")
bottom_joinstyle2 = Ellipse((2.5, 1.7), 1, 0.3, facecolor="silver", edgecolor="w")
left_joinstyle = Ellipse((1, 5.75), 0.5, 0.25, angle=90, color="k")
left_arm_joinstyle1 = Wedge((0.3, 4.55), 0.1, 0, 360, color="k")
left_arm_joinstyle2 = Wedge((0, 4.0), 0.2, 290, 250, color="k")
right_joinstyle = Ellipse((4, 5.75), 0.5, 0.25, angle=90, color="k")
right_arm_joinstyle1 = Wedge((4.3, 6.95), 0.1, 0, 360, color="k")
right_arm_joinstyle2 = Wedge((4.3, 7.45), 0.2, 110, 70, color="k")
top_joinstyle1 = Ellipse((2.5, 6.2), 0.5, 0.2, facecolor="silver", edgecolor="w")
top_joinstyle2 = Ellipse((2.5, 6.3), 0.5, 0.2, facecolor="silver", edgecolor="w")# body
body = Rectangle((1, 2.1), 3, 4, color="steelblue")# arms
left_arm1 = ax.plot([0.3, 1 - 0.125], [4.55, 5.75], color="silver", lw=4)
left_arm2 = ax.plot([0, 0.3], [4.2, 4.55], color="silver", lw=4)
right_arm1 = ax.plot([4 + 0.125, 4.3], [5.75, 6.95], color="silver", lw=4)
right_arm2 = ax.plot([4.3, 4.3], [6.95, 7.25], color="silver", lw=4)# head
ax.plot([1, 4], [6.4, 6.4], color="steelblue")
head = Arc((2.5, 6.4), 3, 2.5, angle=0, theta1=0, theta2=180, color="steelblue")# eyes
left_eye = Wedge((2, 7), 0.4, 0, 360, color="gold")
left_eye_center = Wedge((2, 7), 0.3, 15, 345, color="k")
right_eye = Wedge((3, 7), 0.4, 0, 360, color="k")
right_eye_center = Wedge((3, 7), 0.3, 165, 195, color="darkred")polygon = [shadow,base,left_wheel,right_wheel,bottom_joinstyle1,bottom_joinstyle2,left_joinstyle,left_arm_joinstyle1,left_arm_joinstyle2,right_joinstyle,right_arm_joinstyle1,right_arm_joinstyle2,top_joinstyle1,top_joinstyle2,body,head,left_eye,left_eye_center,right_eye,right_eye_center]
for pln in polygon:ax.add_patch(pln)ax.axis([-1, 6, 0, 10])plt.show()
(2)代码讲解
<1>我们讲解“Arc((2.5,1.1),3,1,angle=10,theta1=0,theta2=180,color="k",alpha=0.8)”语句,这条 语句用来绘制机器人底部车轮的连接弧线,具体参数和参数值的含义如下。
- (2.5,1.1):圆弧的中心位置的坐标。
- 3:圆弧的宽度。
- 1:圆弧的高度。
- angle:圆弧的逆时针旋转的角度。
- theta1:圆弧起点处的角度。
- theta2:圆弧终点处的角度。
- color:圆弧的颜色。
- alpha:圆弧的透明度。
<2>我们讲解“Wedge((2,7),0.3,15,345,color="k")”语句,这条语句用来绘制机器人左眼的黑色 楔形,具体参数和参数值的含义如下。
- (2,7):楔形的中心位置的坐标。
- 0.3:楔形的半径。
- 15:楔形起始位置的角度(逆时针方向旋转)。
- 345:楔形终止位置的角度(逆时针方向旋转)。
- color:楔形的填充区域颜色。
<3>通过上面的两条典型语句,我们可以理解圆弧是椭圆没有内部填充颜色时的一部分,楔形 是特殊形式的圆形。通过调用“Wedge((2,7),0.4,0,360,color="gold")”语句,就可以完成绘制圆心位 置确定和半径大小确定的圆形的任务。
<4>在“代码实现”部分里涉及的其他几何图形的绘制方法,我们已经在前面的内容中介绍过 了,这里就不再讲解这些几何图形的绘制方法和操作细节。