【问题标题】:How to rotate fancy arrow in Matplotlib如何在 Matplotlib 中旋转花式箭头
【发布时间】:2018-12-22 06:35:07
【问题描述】:

如何在 Matplotlib 中旋转花哨的箭头(我不想动画),我尝试了 rotation 和 transform,但它们都不起作用我,我想,我犯了一些错误,请任何帮助或替代解决方案表示赞赏,我已将我的代码粘贴在下面。

import matplotlib.pyplot as plt


fig, ax = plt.subplots()

#Arrow in degree
#Arrow represent the wind direction
degree= 45 #Arrow should rotate as per the specified degree, (0 degree is North)

#Draw Circle
#CENTER POINT
Circle1 = plt.Circle((5, 5), 0.1, color='blue', fill=True)
ax.add_artist(Circle1)
#CIRCLE
Circle2 = plt.Circle((5, 5), 6, color='blue', fill=False)
ax.add_artist(Circle2)

x3=5.0
y3=6.8
x4=5.0
y4=9.0  

#Wind Direction Arrow
#LEFT ARROW
ax.annotate('',
    xy=(x3-0.5, y3), xycoords='data',
    xytext=(-20, 50), textcoords='offset points', rotation=degree,
    size=20,
    # bbox=dict(boxstyle="round", fc="0.8"),
    arrowprops=dict(arrowstyle="fancy",
                    fc="0.6", ec="none",
                    connectionstyle="angle3,angleA=0,angleB=-90"))
#CENTER ARROW
ax.annotate('',
    xy=(x3, y3), xycoords='data',
    xytext=(0, 50), textcoords='offset points', rotation=degree,
    size=20,
    # bbox=dict(boxstyle="round", fc="0.8"),
    arrowprops=dict(arrowstyle="fancy",
                    fc="0.6", ec="none",
                    connectionstyle="angle3,angleA=0,angleB=-90"))
#RIGHT ARROW
ax.annotate('',
    xy=(x3+0.5, y3), xycoords='data',
    xytext=(20, 50), textcoords='offset points', rotation=degree,
    size=20,
    # bbox=dict(boxstyle="round", fc="0.8"),
    arrowprops=dict(arrowstyle="fancy",
                    fc="0.6", ec="none",
                    connectionstyle="angle3,angleA=0,angleB=-90"))

ax.set_aspect('equal') 
ax.set_xlim([-2.5,12.5])
ax.set_ylim([-3,15])
plt.show()

代码结果。

我的要求:

所有3个箭头(箭头代表风向)应旋转到指定的角度,保持中心点为锚点。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    由于箭头的头部和尾部是在不同的坐标系中指定的,我似乎唯一的选择是围绕圆心单独旋转坐标。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.transforms as mtrans
    
    fig, ax = plt.subplots()
    
    #Arrow represent the wind direction
    #Arrow should rotate as per the specified degree, (0 degree is North)
    x3=5.0
    y3=5.0
    #Draw Circle
    #CENTER POINT
    Circle1 = plt.Circle((x3, y3), 0.1, color='blue', fill=True)
    ax.add_artist(Circle1)
    #CIRCLE
    Circle2 = plt.Circle((x3, y3), 6, color='blue', fill=False)
    ax.add_artist(Circle2)
    
    
    def winddirectionarrow(ax, xy, deg):
        m1 = np.array( (-1, 1) )
        m2 = np.array( (0, 1) )
        s1 = np.array( (0.5, 1.8) )
        s2 = np.array( (20, 50) )
        xy = np.array(xy)
        rot = mtrans.Affine2D().rotate_deg(deg)
        #Wind Direction Arrow
        cncs = "angle3,angleA={},angleB={}".format(deg,deg-90)
        kw = dict(xycoords='data',textcoords='offset points',size=20,
                  arrowprops=dict(arrowstyle="fancy", fc="0.6", ec="none",
                                  connectionstyle=cncs))
        #LEFT ARROW
        ax.annotate('', xy=xy + rot.transform_point(m1*s1), 
                        xytext=rot.transform_point(m1*s2), **kw)
        #CENTER ARROW
        ax.annotate('', xy=xy + rot.transform_point(m2*s1), 
                        xytext=rot.transform_point(m2*s2), **kw)
        #RIGHT ARROW
        ax.annotate('', xy=xy + rot.transform_point(s1), 
                        xytext=rot.transform_point(s2), **kw)
    
    winddirectionarrow(ax, (x3,y3),  45)
    winddirectionarrow(ax, (x3,y3), -60)
    winddirectionarrow(ax, (x3,y3), 170)
    
    ax.set_aspect('equal') 
    ax.set_xlim([-2.5,12.5])
    ax.set_ylim([-3,15])
    plt.show()
    

    【讨论】:

    • 非常感谢,非常适合我。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多