MEP25: 직렬화 #

상태 번호

거부됨

이 작업은 중요하지만 이 특별한 노력은 중단되었습니다.

브랜치 및 풀 리퀘스트 #

  • 개발 지점:

  • 관련 풀 리퀘스트:

초록 #

이 MEP는 직렬화 가능한 Controller객체를 추가하여 Artist관리자 역할을 하는 것을 목표로 합니다. 그런 다음 사용자는 를 Artist통해 변경 사항을 에 전달합니다 Controller. 이러한 방식으로 Controller개체의 기능은 각각 Artist이 여전히 모든 것을 그리는 역할을 하기 때문에 점차적으로 추가될 수 있습니다. 목표는 그림에 대한 높은 수준의 설명이 필요한 그래프 라이브러리와 낮은 수준의 해석이 필요한 라이브러리 모두에서 사용할 수 있는 API를 만드는 것입니다.

자세한 설명 #

Matplotlib는 많은 사용자가 이미 이해하고 있는 API가 포함된 핵심 플로팅 엔진입니다. 다른 그래프 라이브러리가 (1) 완전한 그림 설명을 얻고, (2) 사용자가 제공한 대로 그림 개체에서 원시 데이터를 출력하고, (3) 휴리스틱 없이 그림 개체의 의미를 이해하고, ( 4) 시각화할 완전한 그림 설명을 matplotlib에 제공합니다. 또한 an Artist은 도형 내에서 고유한 의미 개념이 없기 때문에 자연스러운 방식으로 상호 작용하기가 어렵습니다.

이러한 의미에서 matplotlib는 표준 MVC(Model-View-Controller) 프레임워크를 채택합니다. 모델 은 사용자 정의 데이터, 스타일 및 의미입니다. 뷰 는 모델Artist 을 기반으로 최종 이미지를 생성하는 각 개인 의 앙상블입니다 . 컨트롤러 는 개체 집합을 관리하는 개체 가 됩니다.ControllerArtist

아마도 방법이나 유사한 방법 을 통해 명령에 따라 그림에 대해 전달 하는 Controller정보를 내보낼 수 있어야 합니다 . to_json모델의 모든 정보를 컨트롤러와 복제하는 것은 매우 관련이 없기 때문에 사용자 지정 정보(데이터 + 스타일)만 명시적으로 유지됩니다. 사용자가 보기/모델에서 더 많은 정보(기본값)를 원하면 쿼리할 수 있어야 합니다.

  • 지정되지 않은 kwargs는 사용자가 지정한 파일을 읽음으로써 생성되고 런타임에 동적으로 변경될 수 있는 rcParams 객체에서 가져오기 때문에 성가실 수 있습니다. 나는 우리가 기본 기본값의 사전을 유지하고 그것과 비교할 수 있다고 생각합니다. 이것이 스타일 시트 [[MEP26]]와 어떻게 상호 작용하는지 명확하지 않음 - @tacaswell

추가 참고 사항:

  • "원시 데이터"는 반드시 , 등일 필요는 없습니다 list. ndarray오히려 필요할 때 데이터를 생성하는 방법을 더 추상적으로 가질 수 있습니다.

  • 에는 Controller사용자가 보관하고 싶지 않은 추가 정보가 포함되어 있으므로 기본적으로 만들어서는 안 됩니다 . Controller (a) 그림을 사용하여 a를 인스턴스화하고 (b) a를 사용하여 그림을 빌드 할 수 있어야 합니다 Controller.

사용 사례:

  • 필요한 모든 정보 내보내기

  • matplotlib 그림을 직렬화하고 저장하고 나중에 다시 실행할 수 있습니다.

  • 열기 위해 적절하게 형식화된 표현을 matplotlib로 보내는 다른 모든 소스

#

다음은 컨트롤러가 수행할 수 있어야 하는 몇 가지 예입니다.

  1. 직렬화된 표현(예: JSON)에서 matplotlib 그림을 인스턴스화합니다.

    import json
    from matplotlib.controllers import Controller
    with open('my_figure') as f:
        o = json.load(f)
    c = Controller(o)
    fig = c.figure
    
  2. 컨트롤러에서 아티스트 관리(예: Line2D):

    # not really sure how this should look
    c.axes[0].lines[0].color = 'b'
    # ?
    
  3. 직렬화 가능 그림 표현 내보내기:

    o = c.to_json()
    # or... we should be able to throw a figure object in there too
    o = Controller.to_json(mpl_fig)
    

구현 #

  1. Controller객체를 관리할 수 있는 기본 객체 생성 Artist(예: Hist)

    코멘트:

    • 초기화는 언패킹을 통해 이루어져야 **하므로 Artist궁극적으로 제어하려는 호출 서명 매개변수의 복사본이 필요합니다. 안타까운 하드코딩 반복...

    • **kwargs각각에 의해 수락된 추가 항목 ArtistController

    • Controller어떤 아티스트가 어디에 속해 있는지 어떻게 알 수 있습니까 ? 예를 들어 참조를 전달해야 axes합니까?

    진전:

  2. 모델 Controller업데이트 하기 위한 프로토콜을 작성합니다 .

    코멘트:

    • 컨테이너는 어떻게 처리해야 합니까? 예를 들어, 히스토그램을 다시 분류하면 오래된 패치는 어떻게 됩니까?

    • (1)의 링크에서 이전 줄이 완전히 파괴되고 다시 그려집니다. 무언가가 그것을 참조하고 있다면 어떻게 될까요?

  3. json 객체를 어셈블할 수 있는 Create 메소드 Controllers

  4. 그림의 직렬화할 수 없는 측면을 직렬화 처리(예: 비아핀 변환?)

  5. 직렬화된 표현에서 인스턴스화할 수 있어야 합니다.

  6. 기존 pyplot 및 Axes 메서드를 다시 구현합니다(예: pyplot.histAxes.hist컨트롤러 클래스 측면에서).

> @theengineer: 위의 #2 에서 각 에서 업데이트 를 받는다는 것은 무엇을 의미 Artist합니까?

^ 응. 업데이트할 필요 Controller 가 없습니다 . 이것은 # 3에서 발생합니다. 이 댓글을 보면 삭제하세요.

이전 버전과의 호환성 #

  • 피클링이 변경됩니다

  • 비아핀 변환에는 정의된 피클링 방법이 필요합니다.

대안 #

PR #3150은 추가 컨테이너를 축 개체에 기생 방식으로 연결하여 시맨틱을 추가할 것을 제안했습니다. 이것은 보다 발전되고 유연하며 강력한 프레임워크가 있어야 하는 보다 완벽한 솔루션입니다.