MEP25: 직렬화 #
상태 번호
거부됨
이 작업은 중요하지만 이 특별한 노력은 중단되었습니다.
브랜치 및 풀 리퀘스트 #
개발 지점:
관련 풀 리퀘스트:
초록 #
이 MEP는 직렬화 가능한 Controller
객체를 추가하여 Artist
관리자 역할을 하는 것을 목표로 합니다. 그런 다음 사용자는 를
Artist
통해 변경 사항을 에 전달합니다 Controller
. 이러한 방식으로
Controller
개체의 기능은 각각
Artist
이 여전히 모든 것을 그리는 역할을 하기 때문에 점차적으로 추가될 수 있습니다. 목표는 그림에 대한 높은 수준의 설명이 필요한 그래프 라이브러리와 낮은 수준의 해석이 필요한 라이브러리 모두에서 사용할 수 있는 API를 만드는 것입니다.
자세한 설명 #
Matplotlib는 많은 사용자가 이미 이해하고 있는 API가 포함된 핵심 플로팅 엔진입니다. 다른 그래프 라이브러리가 (1) 완전한 그림 설명을 얻고, (2) 사용자가 제공한 대로 그림 개체에서 원시 데이터를 출력하고, (3) 휴리스틱 없이 그림 개체의 의미를 이해하고, ( 4) 시각화할 완전한 그림 설명을 matplotlib에 제공합니다. 또한 an Artist
은 도형 내에서 고유한 의미 개념이 없기 때문에 자연스러운 방식으로 상호 작용하기가 어렵습니다.
이러한 의미에서 matplotlib는 표준 MVC(Model-View-Controller) 프레임워크를 채택합니다. 모델 은 사용자 정의 데이터, 스타일 및 의미입니다. 뷰 는 모델Artist
을 기반으로 최종 이미지를 생성하는 각 개인 의 앙상블입니다 . 컨트롤러 는 개체 집합을 관리하는 개체
가 됩니다.Controller
Artist
아마도 방법이나 유사한 방법 을 통해 명령에 따라 그림에 대해 전달 하는 Controller
정보를 내보낼 수 있어야 합니다 . to_json
모델의 모든 정보를 컨트롤러와 복제하는 것은 매우 관련이 없기 때문에 사용자 지정 정보(데이터 + 스타일)만 명시적으로 유지됩니다. 사용자가 보기/모델에서 더 많은 정보(기본값)를 원하면 쿼리할 수 있어야 합니다.
지정되지 않은 kwargs는 사용자가 지정한 파일을 읽음으로써 생성되고 런타임에 동적으로 변경될 수 있는 rcParams 객체에서 가져오기 때문에 성가실 수 있습니다. 나는 우리가 기본 기본값의 사전을 유지하고 그것과 비교할 수 있다고 생각합니다. 이것이 스타일 시트 [[MEP26]]와 어떻게 상호 작용하는지 명확하지 않음 - @tacaswell
추가 참고 사항:
"원시 데이터"는 반드시 , 등일 필요는 없습니다
list
.ndarray
오히려 필요할 때 데이터를 생성하는 방법을 더 추상적으로 가질 수 있습니다.에는
Controller
사용자가 보관하고 싶지 않은 추가 정보가 포함되어 있으므로 기본적으로 만들어서는 안 됩니다 .Controller
(a) 그림을 사용하여 a를 인스턴스화하고 (b) a를 사용하여 그림을 빌드 할 수 있어야 합니다Controller
.
사용 사례:
필요한 모든 정보 내보내기
matplotlib 그림을 직렬화하고 저장하고 나중에 다시 실행할 수 있습니다.
열기 위해 적절하게 형식화된 표현을 matplotlib로 보내는 다른 모든 소스
예 #
다음은 컨트롤러가 수행할 수 있어야 하는 몇 가지 예입니다.
직렬화된 표현(예: 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
컨트롤러에서 아티스트 관리(예: Line2D):
# not really sure how this should look c.axes[0].lines[0].color = 'b' # ?
직렬화 가능 그림 표현 내보내기:
o = c.to_json() # or... we should be able to throw a figure object in there too o = Controller.to_json(mpl_fig)
구현 #
Controller
객체를 관리할 수 있는 기본 객체 생성Artist
(예:Hist
)코멘트:
초기화는 언패킹을 통해 이루어져야
**
하므로Artist
궁극적으로 제어하려는 호출 서명 매개변수의 복사본이 필요합니다. 안타까운 하드코딩 반복...**kwargs
각각에 의해 수락된 추가 항목Artist
을Controller
Controller
어떤 아티스트가 어디에 속해 있는지 어떻게 알 수 있습니까 ? 예를 들어 참조를 전달해야axes
합니까?
진전:
Line2DController
개체 에 대한 일부 기능을 보여주는 간단한 NB : https://nbviewer.jupyter.org/gist/theengineear/f0aa8d79f64325e767c0
모델
Controller
을 업데이트 하기 위한 프로토콜을 작성합니다 .코멘트:
컨테이너는 어떻게 처리해야 합니까? 예를 들어, 히스토그램을 다시 분류하면 오래된 패치는 어떻게 됩니까?
(1)의 링크에서 이전 줄이 완전히 파괴되고 다시 그려집니다. 무언가가 그것을 참조하고 있다면 어떻게 될까요?
json 객체를 어셈블할 수 있는 Create 메소드
Controllers
그림의 직렬화할 수 없는 측면을 직렬화 처리(예: 비아핀 변환?)
직렬화된 표현에서 인스턴스화할 수 있어야 합니다.
기존 pyplot 및 Axes 메서드를 다시 구현합니다(예:
pyplot.hist
새Axes.hist
컨트롤러 클래스 측면에서).
> @theengineer: 위의 #2 에서 각 에서 업데이트 를 받는다는 것은 무엇을 의미 Artist
합니까?
^ 응. 업데이트할 필요 Controller
가 없습니다 . 이것은 # 3에서 발생합니다. 이 댓글을 보면 삭제하세요.
이전 버전과의 호환성 #
피클링이 변경됩니다
비아핀 변환에는 정의된 피클링 방법이 필요합니다.
대안 #
PR #3150은 추가 컨테이너를 축 개체에 기생 방식으로 연결하여 시맨틱을 추가할 것을 제안했습니다. 이것은 보다 발전되고 유연하며 강력한 프레임워크가 있어야 하는 보다 완벽한 솔루션입니다.