可以使用自定义箭头或多边形作为标记,以绘制位置并驶入matplotlib



我有一系列X,y坐标和相关的多个飞机的标题。我可以绘制飞行的路径,我想使用一个特殊的标记来标记沿路径的特定位置,该位置在该位置时也显示了飞机的标题。

使用matplotlib.pyplot,我使用了一个没有基础的箭头,但是在绘制多个飞机时,必须定义头部和尾部位置,最终会出现不一致的箭头长度。我还使用了带有元组(Numsides,样式,角度)以及楔形和BigVee符号的自定义三面符号,但它们看起来永远不会很好。

从matplotlib的自定义箭头样式,pyplot.annotate Saullo Castro显示出一个不错的自定义箭头(arrow1),我想知道它是否可以使用或转换,以简单地将其简单地绘制在给定的x,y,并通过标题角度定义其方向。

我可以使用以下内容绘制自定义箭头。关于如何旋转它以反映标题的任何想法?

a1 = np.array([[0,0],[0,1],[-1,2],[3,0],[-1,-2],[0,-1],[0,0]], dtype=float)
polB = patches.Polygon(a1, closed=True, facecolor='grey')
ax.add_patch(polB)

预先感谢。

所以我使多边形更简单一些,还发现可以使用mpl.transforms.affine2d()。

    a2 = np.array([[newX,newY+2],[newX+1,newY-1],[newX,newY],[newX-1,newY-1],[newX,newY+2]], dtype=float)
    polB = patches.Polygon(a2, closed=True, facecolor='gold')
    t2 = mpl.transforms.Affine2D().rotate_deg_around(newX,newY,heading) + newax.transData
    polB.set_transform(t2)
    newax.add_patch(polB)

我首先试图将多边形覆盖在x,y坐标的线上。但是,X和Y轴的尺度并不相等(我也不希望它们成为),因此多边形最终在旋转时看上去所有扭曲和拉伸。我首先添加一个相等x/y缩放的新轴来解决这个问题:

    newax = fig.add_axes(ax.get_position(), frameon=False)
    newax.set_xlim(-20,20)
    newax.set_ylim(-20,20) 

我至少可以旋转我想要的一切,而没有翘曲问题。但是后来我需要弄清楚如何基本上连接两个轴,以便可以在原始轴引用的点上绘制新轴上的多边形。我认为这样做的方法是使用转换从原始轴上的数据坐标进行转换,将它们转换为显示坐标,然后将它们反转回数据坐标,除非这次在新轴上的数据坐标处:

    inTrans = ax.transData.transform((x, y))
    inv = newax.transData.inverted()
    newTrans = inv.transform((inTrans[0], inTrans[1]))
    newX = newTrans[0]
    newY = newTrans[1]

这样做的感觉有点像某种Rube Goldberg机器,但是它做了我想要的。

最后,我决定不喜欢这种方法,然后继续保持更简单,并使用幻想箭头而不是多边形。这就是生活...

最新更新