用旋转箭头绘制圆图
Plotting circle diagram with rotary arrow
这是我从 paper 中截取的图表。
http://i11.tietuku.com/e1c71d1b84b37a51.png
我可以画圆和直箭头,但是如何画特定角度的旋转箭头?
您可以使用sine/cosine、Arc and arrow:
在matplotlib中绘制一个圆圈和一个旋转箭头
import math
from matplotlib.patches import Arc
import matplotlib.pyplot as plt
ax = plt.axes()
x0, y0 = 0.5, 0.5
radius = 0.4
angle = 135
angle_rad = angle * math.pi / 180 # degrees to radians
# Draw circle
circle = plt.Circle((x0,y0), radius, color='red', fill=False)
fig = plt.gcf()
fig.gca().add_artist(circle)
# Draw radius arrow
head_length = 0.05
ax.arrow(x0, y0,
(radius - head_length) * math.cos(angle_rad),
(radius - head_length) * math.sin(angle_rad),
head_width=0.05, head_length=head_length, fc='k', ec='k')
# Draw arc with arrow.
arc_radius = radius / 4
arc = Arc((x0, y0),
arc_radius*2, arc_radius*2, # ellipse width and height
theta1=0, theta2=angle, linestyle='dashed')
ax.add_patch(arc)
arc_arrow_length = 0.03
arc_arrow_dx = arc_arrow_length * math.cos(angle_rad + math.pi / 2)
arc_arrow_dy = arc_arrow_length * math.sin(angle_rad + math.pi / 2)
ax.arrow(
x0 + arc_radius * math.cos(angle_rad) - arc_arrow_dx,
y0 + arc_radius * math.sin(angle_rad) - arc_arrow_dy,
# We want to define a vector,
# but we don't want to draw any line besides arrow head,
# so we make arrow "body" unnoticeable.
arc_arrow_dx * 0.000001,
arc_arrow_dy * 0.000001,
head_width=0.01,
head_length=0.03,
color='black')
plt.show()
请注意,这个解决方案不是最干净的,可能有更好的方法同时绘制弧线和箭头。
您可能想尝试 FancyArrowPatch 画一个漂亮的箭头。
使用plt.annotate,您可以在arrowprops 参数中传入一个connectionstyle,它将定义您绘制的线的曲率。这是 SciPy 文档中的 an example。之后,您需要做的就是设置线型并确定每个图表的起点和终点。
这是我从 paper 中截取的图表。
http://i11.tietuku.com/e1c71d1b84b37a51.png
我可以画圆和直箭头,但是如何画特定角度的旋转箭头?
您可以使用sine/cosine、Arc and arrow:
在matplotlib中绘制一个圆圈和一个旋转箭头import math
from matplotlib.patches import Arc
import matplotlib.pyplot as plt
ax = plt.axes()
x0, y0 = 0.5, 0.5
radius = 0.4
angle = 135
angle_rad = angle * math.pi / 180 # degrees to radians
# Draw circle
circle = plt.Circle((x0,y0), radius, color='red', fill=False)
fig = plt.gcf()
fig.gca().add_artist(circle)
# Draw radius arrow
head_length = 0.05
ax.arrow(x0, y0,
(radius - head_length) * math.cos(angle_rad),
(radius - head_length) * math.sin(angle_rad),
head_width=0.05, head_length=head_length, fc='k', ec='k')
# Draw arc with arrow.
arc_radius = radius / 4
arc = Arc((x0, y0),
arc_radius*2, arc_radius*2, # ellipse width and height
theta1=0, theta2=angle, linestyle='dashed')
ax.add_patch(arc)
arc_arrow_length = 0.03
arc_arrow_dx = arc_arrow_length * math.cos(angle_rad + math.pi / 2)
arc_arrow_dy = arc_arrow_length * math.sin(angle_rad + math.pi / 2)
ax.arrow(
x0 + arc_radius * math.cos(angle_rad) - arc_arrow_dx,
y0 + arc_radius * math.sin(angle_rad) - arc_arrow_dy,
# We want to define a vector,
# but we don't want to draw any line besides arrow head,
# so we make arrow "body" unnoticeable.
arc_arrow_dx * 0.000001,
arc_arrow_dy * 0.000001,
head_width=0.01,
head_length=0.03,
color='black')
plt.show()
请注意,这个解决方案不是最干净的,可能有更好的方法同时绘制弧线和箭头。
您可能想尝试 FancyArrowPatch 画一个漂亮的箭头。
使用plt.annotate,您可以在arrowprops 参数中传入一个connectionstyle,它将定义您绘制的线的曲率。这是 SciPy 文档中的 an example。之后,您需要做的就是设置线型并确定每个图表的起点和终点。