用旋转箭头绘制圆图

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。之后,您需要做的就是设置线型并确定每个图表的起点和终点。