4

借助 Matplotlib 中的sankey - toolbox,我们可以自动绘制 sankey-diagrams: sankey-object 的位置是根据其先验对象的位置自动计算的,不能手动给出;并且当一个 sankey-diagram 被初始化时,第一个 sankey-object 的位置将被分配一个轴的输入。((0,0)点将是该对象的中心点)

情况如下:我想绘制两个具有给定 y 偏移的 sankey 图,并且应该连接两个图的几个端口。因此,需要在同一个子图中具有 y 偏移的两个坐标系。我已经尝试了“ add_axes ”方法,但是使用这种方法会创建一个新的子图,并且会出现图形缩放问题。

现在的问题是:是否可以在不创建子图的情况下创建具有给定 y 偏移的新坐标系?

4

2 回答 2

2

不是一个完整的答案,但它可能会帮助您找到解决方案: sankey.add()支持transform关键字参数。根据您的图形,创建一个新transform实例,并将其用于图形的移动部分:

offset = transforms.ScaledTranslation(0.0, 0.5, fig.dpi_scale_trans)
new_transform = ax.transData + offset
sankey.add(flows=[-0.25, 0.15, 0.1], fc='#37c959', label='two',
           orientations=[-1, -1, -1], prior=0, connect=(0, 0),
           transform = new_transform)

为了创建新的变换,辅助函数matplotlib.transforms.offset_copy()也可能有用:

new_transform = offset_copy(ax.transData, fig=fig,
                            x = 0.05, y=0.10, units='inches')
于 2012-12-18T09:12:45.837 回答
0

问题解决了。我编写了Affine2DBase -class 的子类来根据给定的变换对象(例如ax.transData对象)进行坐标转换。它适用于我的程序......希望对其他人有所帮助。

class coordinateTranslation(Affine2DBase):
    def __init__(self, dx, dy, transform, **kwargs):
        Affine2DBase.__init__(self,**kwargs)
        self._dx = dx
        self._dy = dy
        self._transform = transform
        self._mtx = None
        self._inverted = None
    def __repr__(self):
        return "coordinateTranslation(%r, %r)" % (self._dx, self._dy)
    def get_matrix(self):
        dx, dy = self._transform.transform((self._dx, self._dy))
        dx_zero, dy_zero = self._transform.transform((0, 0))
        dx -= dx_zero; dy -= dy_zero
        self._mtx = np.array([[1.0, 0.0, dx],
                              [0.0, 1.0, dy],
                              [0.0, 0.0, 1.0]], np.float_)
        self._inverted = None
        return self._mtx
    get_matrix.__doc__ = Affine2DBase.get_matrix.__doc__
于 2013-01-02T15:52:35.537 回答