2012-12-11 4 views
4

sankey-toolboxMatplotlib을 사용하여 sankey-diagrams을 자동으로 표시 할 수 있습니다. sankey-object의 위치는 이전 객체의 위치를 ​​기반으로 자동 계산되며 수동으로 지정할 수 없습니다. Sankey- 다이어그램이 초기화 될 때, 첫 번째 sankey-object의 위치는 축의 입력으로 할당 될 것입니다. (0,0) - 점이이 객체의 중심점이됩니다.Matplotlib : 서브 플롯을 만들지 않고 주어진 y- 오프셋으로 새 축을 만들 수 있습니까?

그리고 여기 상황이 있습니다 : 주어진 y- 오프셋과 두 개의 다이어그램 중 몇 개의 포트를 가진 두 개의 sankey 다이어그램을 그려야합니다. 연결되어야합니다. 따라서 동일한 서브 도표에서 y- 오프셋이 필요한 두 좌표 시스템이 필요합니다. 'add_axes'메서드를 시도했지만이 메서드를 사용하면 새 하위 그림이 만들어지고 그래픽 크기 조정 문제가 발생합니다.

이제 질문입니다. 서브 플롯을 만들지 않고 주어진 y 오프셋을 사용하여 새로운 좌표계를 만들 수 있습니까?

+0

다이어그램의 각 부분에 대해 x/y를 증가시키는 것과 같이 데이터를 변경하지 않는 이유는 무엇입니까? – tiago

+0

귀하의 조언에 감사드립니다. 그러나이 도구 상자는 정확한 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

문제가 해결되었습니다. Affine2DBase 하위 클래스를 작성하여 주어진 변형 객체를 기반으로하는 좌표 변환을 수행합니다 (예 : 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__ 
관련 문제