2012-12-11 41 views
4

的幫助下,sankey-toolboxmatplotlib,我們可以自動繪製sankey圖表:sankey對象的位置是根據其先前對象的位置自動計算出來的,不能手動給出;並且當sankey圖被初始化時,第一個sankey對象的位置將被賦予一個軸的輸入。 ((0,0)點將成爲此對象的中心點)Matplotlib:是否可以使用給定的y偏移量創建新軸,而不創建子圖?

而這裏是這樣的情況:我想繪製兩個具有給定y偏移量的sankey圖,以及兩個圖中的幾個端口應該連接。因此,在同一子圖中需要兩個具有y偏移量的座標系。我嘗試了'add_axes'方法,但是使用此方法會創建一個新的子圖,並且會出現圖形縮放問題。

現在,這是一個問題:是否有可能用給定的y偏移量創建一個新的座標系,而不創建子圖?

+0

爲什麼不改變數據,比如爲圖的每個部分增加x/y? – tiago

+0

@tiago感謝您的建議,但是此工具箱不接受確切的x或y位置。我們只能給出軸,並且(0,0)點將成爲開始對象的中心點。 – user1895999

+2

我明白了。如果您提供有關您的限制的更多信息,也許人們會發現更容易提出答案。 – tiago

回答

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') 
+0

感謝您的幫助。我也在研究這個**轉換**課程。使用你的代碼可以更容易地找到解決方案。謝謝! – user1895999

0

問題已解決。我寫了一個子類,用於根據給定的變換對象進行座標轉換,例如,一個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__ 
相關問題