python 用 matplotlib 中的 patch 模块绘制几何形状(圆,椭圆,圆弧,锲形块,矩形),组装一个机器人图
图形预览:
0、import
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Arc, Circle, Ellipse, Rectangle, Wedge
1、绘图
# 创建画布
fig, ax = plt.subplots(nrows=1,
ncols=1,
subplot_kw=dict(aspect='equal',
facecolor='whitesmoke'
),
figsize=(12, 8),
facecolor='sienna'
)
# --------------------------------- head, body ---------------------------------
# head
ax.plot([1, 4],
[6.4, 6.4],
c='steelblue'
)
head = Arc(xy=(2.5, 6.4), # 椭圆中心,(圆弧是椭圆的一部分而已)
width=3, # 长半轴
height=2.5, # 短半轴
theta1=0, # 圆弧起点处角度
theta2=180, # 圆弧终点处角度
fc='w', # 填充色
ec='steelblue' # 边框颜色
)
# body
body = Rectangle(xy=(1, 2.1), # 左下角坐标
width=3,
height=4,
fc='steelblue'
)
# --------------------------------- eyes ---------------------------------
# eye_socket
left_eye_socket = Wedge(center=(2, 7), # 锲形的中心
r=0.4, # 半径
theta1=0, # 起始角度
theta2=360, # 终止角度
fc='gold' # 填充颜色
)
right_eye_socket = Wedge(center=(3, 7),
r=0.4,
theta1=0,
theta2=360,
fc='k'
)
# eyeball
left_eyeball = Wedge(center=(2, 7), # 中心
r=0.3, # 半径
theta1=15, # 起始角度
theta2=345, # 终止角度
color='k'
)
right_eyeball = Wedge(center=(3, 7), # 中心
r=0.3, # 半径
theta1=156, # 起始角度
theta2=195, # 终止角度
color='darkred'
)
# --------------------------------- base, shadow ---------------------------------
# base
ax.plot([1.1, 4], [1, 1.3], color='k')
base = Arc(xy=(2.5, 1.1), # 椭圆中心,(圆弧是椭圆的一部分而已)
width=3, # 长半轴
height=1, # 短半轴
angle=10, # 椭圆旋转角度(逆时针)
theta1=0, # 圆弧的起点处角度
theta2=175, # 圆度的终点处角度
color='k',
alpha=0.8
)
# shadow
shadow = Ellipse(xy=(2.5, 0.5), # 椭圆中心
width=4.2, # 长半轴
height=0.5, # 短半轴
fc='silver', # facecolor
alpha=0.2
)
# --------------------------------- wheels ---------------------------------
left_wheel = Ellipse(xy=(1, 1), # 中心
width=0.7, # 长半轴
height=0.4, # 短半轴
angle=95, # 逆时针旋转角度
color='k'
)
right_wheel = Ellipse(xy=(4, 1.3), # 中心
width=0.7, # 长半轴
height=0.4, # 短半轴
angle=85, # 逆时针旋转角度
color='k'
)
# --------------------------------- arms ---------------------------------
left_upper_arm = ax.plot([0.3, 0.875],
[4.55, 5.75],
color='silver', # facecolor
lw=4, # line width
)
left_lower_arm = ax.plot([0, 0.3],
[4.2, 4.55],
color='silver', # facecolor
lw=4, # line width
)
right_upper_arm = ax.plot([4.125, 4.3],
[5.75, 6.95],
color='silver', # facecolor
lw=4, # line width
)
right_lower_arm = ax.plot([4.3, 4.3],
[6.95, 7.25],
color='silver', # facecolor
lw=4, # line width
)
# --------------------------------- hands ---------------------------------
left_hand = Wedge(center=(0, 4),
r=0.2,
theta1=290,
theta2=250,
fc='k'
)
right_hand = Wedge(center=(4.3, 7.45),
r=0.2,
theta1=110,
theta2=70,
fc='k'
)
# --------------------------------- shoulders ---------------------------------
left_shoulder = Ellipse(xy=(1, 5.75), # 中心
width=0.5, # 长半轴
height=0.25, # 短半轴
angle=90, # 逆时针旋转角度
fc='k', # facecolor
)
right_shoulder = Ellipse(xy=(4, 5.75), # 中心
width=0.5, # 长半轴
height=0.25, # 短半轴
angle=90, # 逆时针旋转角度
fc='k', # facecolor
)
# --------------------------------- elbows ---------------------------------
left_elbow = Wedge(center=(0.3, 4.55),
r=0.1,
theta1=0,
theta2=360,
fc='k'
)
right_elbow = Wedge(center=(4.3, 6.95),
r=0.1,
theta1=0,
theta2=360,
fc='k'
)
# --------------------------------- joints ---------------------------------
top_joint1 = Ellipse(xy=(2.5, 6.2),
width=0.5,
height=0.2,
fc='silver',
ec='w'
)
top_joint2 = Ellipse(xy=(2.5, 6.3),
width=0.5,
height=0.2,
fc='silver',
ec='w'
)
bottom_joint1 = Ellipse(xy=(2.5, 2), # 中心
width=1, # 长半轴
height=0.3, # 短半轴
fc='silver', # facecolor
ec='w'
)
bottom_joint2 = Ellipse(xy=(2.5, 1.7), # 中心
width=1, # 长半轴
height=0.3, # 短半轴
fc='silver', # facecolor
ec='w'
)
# --------------------------------- 向绘图区添加几何形状 ---------------------------------
polygons = [body,
head,
left_eye_socket,
right_eye_socket,
left_eyeball,
right_eyeball,
shadow,
base,
left_wheel,
right_wheel,
left_hand,
right_hand,
left_shoulder,
right_shoulder,
left_elbow,
right_elbow,
top_joint1,
top_joint2,
bottom_joint1,
bottom_joint2
]
for pln in polygons:
ax.add_patch(pln)
# 设置刻度范围
ax.axis([-1, 6, 0, 10]) # [xmin, xmax, ymin, ymax]
# 隐藏轴脊
for position in ['left', 'top', 'right', 'bottom']:
ax.spines[position].set_visible(False)
# 隐藏刻度
ax.set(xticks=(),
yticks=()
)
# 显示图形
plt.show()
图形:
软件信息:
非学无以广才,非志无以成学。