Python数据可视化(二)

Patches绘制几何图形

模块 patches 主要用来完成多边形的绘制工作。这些多边形都是以类(Class)的形式出现的, 主要包括圆(Circle)、椭圆(Ellipse)、矩形(Rectangle)、圆弧(Arc)、楔形(Wedge)等几何图形。 下面,我们就介绍这些几何图形的实现方法。

一,圆的实现方法

(1)代码示例

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Circle

fig, 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 Rectangle

fig, ax = plt.subplots(subplot_kw={"aspect": "equal"})

x1 = np.arange(1, 2.6, 0.1)
y1 = x1 + 2

x2 = 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, Wedge

fig, 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>在“代码实现”部分里涉及的其他几何图形的绘制方法,我们已经在前面的内容中介绍过 了,这里就不再讲解这些几何图形的绘制方法和操作细节。

 

 

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值