matplotlib 다 중 하위 그림 을 그 려 마우스 커서 를 공유 하 는 방법 예제

matplotlib공식 적 으로 마우스 십자 커서 의 예 시 를 제공 하 는 동시에 같은 이미지 에 있 는 여러 개의 서브 맵 공유 커서 의 예 시 를 제공 했다.그 기능 은 주로widgets모듈 의MultiCursor류 에 의 해 지원 된다.MultiCursor류 는Cursor류 의 매개 변수 와 유사 하고 차 이 는 주로 다음 과 같다.
  • Cursor클래스 매개 변 수 는 하나ax만 있 습 니 다.즉,커서 의 하위 그림 을 표시 해 야 합 니 다.MultiCursor클래스 매개 변 수 는canvasaxes이 고 그 중에서axes커서 를 공유 해 야 하 는 하위 그림 목록 입 니 다.
  • Cursor클래스 에서 커서 는 기본적으로 십자선 입 니 다.MultiCursor클래스 에서 커서 는 기본적으로 세로 줄 입 니 다.
  • 공식 예시
    
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.widgets import MultiCursor
    
    t = np.arange(0.0, 2.0, 0.01)
    s1 = np.sin(2*np.pi*t)
    s2 = np.sin(4*np.pi*t)
    
    fig, (ax1, ax2) = plt.subplots(2, sharex=True)
    ax1.plot(t, s1)
    ax2.plot(t, s2)
    
    multi = MultiCursor(fig.canvas, (ax1, ax2), color='r', lw=1)
    plt.show()
    在这里插入图片描述
    간이 수정판
    
    multi = MultiCursor(fig.canvas, (ax1, ax2), color='r', lw=1, horizOn=True, vertOn=True)
    在这里插入图片描述 MultiCursor클래스 소스 코드
    
    class MultiCursor(Widget):
      """
      Provide a vertical (default) and/or horizontal line cursor shared between
      multiple axes.
    
      For the cursor to remain responsive you must keep a reference to it.
    
      Example usage::
    
        from matplotlib.widgets import MultiCursor
        import matplotlib.pyplot as plt
        import numpy as np
    
        fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)
        t = np.arange(0.0, 2.0, 0.01)
        ax1.plot(t, np.sin(2*np.pi*t))
        ax2.plot(t, np.sin(4*np.pi*t))
    
        multi = MultiCursor(fig.canvas, (ax1, ax2), color='r', lw=1,
                  horizOn=False, vertOn=True)
        plt.show()
    
      """
      def __init__(self, canvas, axes, useblit=True, horizOn=False, vertOn=True,
             **lineprops):
    
        self.canvas = canvas
        self.axes = axes
        self.horizOn = horizOn
        self.vertOn = vertOn
    
        xmin, xmax = axes[-1].get_xlim()
        ymin, ymax = axes[-1].get_ylim()
        xmid = 0.5 * (xmin + xmax)
        ymid = 0.5 * (ymin + ymax)
    
        self.visible = True
        self.useblit = useblit and self.canvas.supports_blit
        self.background = None
        self.needclear = False
    
        if self.useblit:
          lineprops['animated'] = True
    
        if vertOn:
          self.vlines = [ax.axvline(xmid, visible=False, **lineprops)
                  for ax in axes]
        else:
          self.vlines = []
    
        if horizOn:
          self.hlines = [ax.axhline(ymid, visible=False, **lineprops)
                  for ax in axes]
        else:
          self.hlines = []
    
        self.connect()
        
      def connect(self):
        """Connect events."""
        self._cidmotion = self.canvas.mpl_connect('motion_notify_event',
                             self.onmove)
        self._ciddraw = self.canvas.mpl_connect('draw_event', self.clear)
    
      def disconnect(self):
        """Disconnect events."""
        self.canvas.mpl_disconnect(self._cidmotion)
        self.canvas.mpl_disconnect(self._ciddraw)
    
      def clear(self, event):
        """Clear the cursor."""
        if self.ignore(event):
          return
        if self.useblit:
          self.background = (
            self.canvas.copy_from_bbox(self.canvas.figure.bbox))
        for line in self.vlines + self.hlines:
          line.set_visible(False)
    
      def onmove(self, event):
        if self.ignore(event):
          return
        if event.inaxes is None:
          return
        if not self.canvas.widgetlock.available(self):
          return
        self.needclear = True
        if not self.visible:
          return
        if self.vertOn:
          for line in self.vlines:
            line.set_xdata((event.xdata, event.xdata))
            line.set_visible(self.visible)
        if self.horizOn:
          for line in self.hlines:
            line.set_ydata((event.ydata, event.ydata))
            line.set_visible(self.visible)
        self._update()
    
    
      def _update(self):
        if self.useblit:
          if self.background is not None:
            self.canvas.restore_region(self.background)
          if self.vertOn:
            for ax, line in zip(self.axes, self.vlines):
              ax.draw_artist(line)
          if self.horizOn:
            for ax, line in zip(self.axes, self.hlines):
              ax.draw_artist(line)
          self.canvas.blit()
        else:
          self.canvas.draw_idle()
    이 글 은 matplotlib 에서 다 자 도 를 그 려 마우스 커서 를 공유 하 는 방법 에 대한 예 시 를 소개 합 니 다.더 많은 matplotlib 다 자 도 마우스 커서 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기