MEP26: 아티스트 스타일링 #
상태 번호
거부됨
브랜치 및 풀 리퀘스트 #
초록 #
이 MEP는 아티스트의 보다 포괄적이고 역동적인 스타일링을 허용하는 새로운 스타일시트 구현을 제안합니다.
현재 버전의 matplotlib(1.4.0)에서는 rcParams 구문을 기반으로 하는 스타일시트를 플롯 생성 전에 적용할 수 있습니다. 아래의 방법론은 기존 개체에 동적으로 적용할 수 있는 개별 아티스트 및 속성의 스타일을 지정할 수 있는 CSS 기반의 새로운 구문을 제안합니다.
이것은 DOM/트리와 같은 아키텍처로 이동하는 전반적인 목표와 관련이 있습니다(그리고 이를 향한 단계를 만듭니다).
자세한 설명 #
set_
현재 기존 아티스트 개체(그림, 축, Line2D 등)의 모양과 모양은 아티스트 개체의 및 메서드 를 통해서만 업데이트할 수 있으며 get_
, 이는 특히 아티스트에 대한 참조가 저장되지 않은 경우 상당히 힘든 작업입니다. . 1.4에 도입된 새로운 스타일 시트는 플롯이 생성되기 전에 스타일 지정을 허용하지만 플롯을 동적으로 업데이트하거나 동일한 유형의 아티스트를 구별하는 수단(즉, 다른 객체 에 대해 및 별도로 지정)을 제공하지 않습니다.line color
line
style
Line2D
Artist
초기 개발은 아티스트 프리미티브( 다른 를 포함하지 않는 )의
스타일 지정을 허용하는 데 집중해야 Artist
하며 추가 개발에서는 CSS 구문 규칙과 구문 분석기를 확장하여 더 복잡한 스타일 지정을 허용할 수 있습니다. 프리미티브 목록은 부록을 참조하십시오.
새로운 방법론은 여러 단계를 개발해야 합니다.
유형, 클래스, ID 등으로 아티스트를 선택할 수 있는 새로운 스타일시트 구문(CSS 기반)
스타일시트를 트리로 구문 분석하는 메커니즘
구문 분석 트리를 관련 아티스트의 속성을 업데이트하는 데 사용할 수 있는 것으로 변환하는 메커니즘입니다. 이상적으로 이것은 트리와 같은 구조에서 아티스트를 횡단하는 방법을 구현합니다.
기존 아티스트 속성에서 스타일시트를 생성하는 메커니즘입니다. 이는 사용자가 기존 그림(matplotlib API를 사용하여 모양을 설정했을 수 있음)에서 스타일시트를 내보낼 수 있도록 하는 데 유용합니다.
구현 #
'스타일'이 별도의 클래스로 생성되어 아티스트에 대한 속성으로 저장되는 경우 '제3자'가 아티스트의 스타일을 수정/설정하도록 허용하는 것이 가장 쉬울 것입니다. GraphicsContextBase
클래스는 이미 클래스의 기반을 제공하고
아티스트 Style
의 방법은 자체적으로 설정 하고 스타일 관련 속성을 클래스에 전송하는 대신 클래스 draw
를 사용하도록 리팩터링할 수 있습니다 . 이것이 어떻게 구현될 수 있는지에 대한 최소한의 예는 다음과 같습니다: https://github.com/JamesRamm/mpl_experimentStyle
GraphicsContextBase
IMO, 이것은 또한 아티스트 스타일 속성에 대한 개별 get/set 메서드가 이제 중복되므로 API 및 코드 베이스를 훨씬 더 깔끔하게 만들 것입니다... 간접적으로 관련된 것은 get/set 메서드를 속성으로 대체하는 일반적인 드라이브입니다. 속성이 있는 스타일 클래스를 구현하는 것은 이를 향한 큰 진전이 될 것입니다...
초기 개발의 경우 훨씬(훨씬) 단순화된 CSS 버전을 기반으로 구문을 개발할 것을 제안합니다. 저는 이 아티스트 스타일 시트를 더빙하는 것에 찬성합니다 :+1: :
BNF 문법 #
나는 초기에 구현할 수 있는 매우 간단한 구문(개념 증명과 같은)을 제안하고 나중에 확장할 수 있습니다. 구문의 BNF 형식은 아래에 나와 있으며 설명되어 있습니다.
RuleSet ::= SelectorSequence "{"Declaration"}"
SelectorSequence :: = Selector {"," Selector}
Declaration ::= propName":" propValue";"
Selector ::= ArtistIdent{"#"Ident}
propName ::= Ident
propValue ::= Ident | Number | Colour | "None"
ArtistIdent
, Ident
및 은 정규 표현식에 의해 정의되는 토큰(표현식의 기본 빌딩 블록)입니다 Number
.Colour
구문 #
CSS 스타일시트는 계층적 순서로 된 일련의 규칙 세트 로 구성됩니다 (규칙은 위에서 아래로 적용됨). 각 규칙은 구문을 따릅니다.
selector {attribute: value;}
각 규칙에는 원하는 수의 쌍이 있을 수 있으며 스타일시트에는 원하는 수의 규칙이 있을 수 있습니다.attribute: value
초기 구문은 Artist
프리미티브용으로만 설계되었습니다. Container
유형에 속성을 설정하는 방법(속성 자체가 설정 가능한 속성이 있는 s일 수 있음) 에 대한 질문은 다루지 않지만 이에 Artist
대한 향후 솔루션은 단순히 중첩
RuleSet
s 일 수 있습니다.
선택기 #
선택기는 특성 업데이트를 적용해야 하는 개체를 정의합니다. 시작점으로 초기 개발에 사용할 선택자를 2개만 제안합니다.
아티스트 유형 선택기
Artist
유형별로 선택합니다 . 예 Line2D
또는 Text
:
Line2D {attribute: value}
ArtistIdent
아티스트 유형 선택기( BNF 문법에서) 일치를 위한 정규식 은 다음과 같습니다.
ArtistIdent = r'(?P<ArtistIdent>\bLine2D\b|\bText\b|\bAxesImage\b|\bFigureImage\b|\bPatch\b)'
GID 선택기 #
Artist
다음 으로 선택하십시오 gid
.
Line2D#myGID {attribute: value}
A gid
는 모든 문자열이 될 수 있으므로 정규식은 다음과 같습니다.
Ident = r'(?P<Ident>[a-zA-Z_][a-zA-Z_0-9]*)'
위의 선택기는 대략 CSS 대응 항목( http://www.w3.org/TR/CSS21/selector.html ) 에 해당합니다.
속성 및 값 #
Attributes
문제 의 유효한(설정 가능한) 속성입니다Artist
.Values
속성에 대한 유효한 값입니다(일반적으로 문자열 또는 숫자).
파싱 #
구문 분석은 스타일시트를 토큰으로 나누고(Python 요리책은 66페이지에 멋진 토큰화 레시피를 제공합니다), 구문 규칙을 적용하고 Tree
. 이를 위해서는 스타일시트의 문법을 정의하고(CSS에서 빌릴 수 있음) 파서를 작성해야 합니다. 다행스럽게도 파이썬 요리책에도 이에 대한 레시피가 있습니다.
matplotlib 그림의 방문자 패턴 #
해당 아티스트에게 스타일시트 규칙을 적용하려면 Figure의 각 아티스트를 '방문'하여 해당 규칙을 적용해야 합니다. 여기 방문자 클래스가 있습니다(파이썬 요리책 덕분에). 여기에서 각각
node
은 그림에서 아티스트가 됩니다. 각각 의 visit_
다른 속성을 처리하려면 각 mpl 아티스트에 대해 메서드를 구현해야 합니다.
class Visitor:
def visit(self, node):
name = 'visit_' + type(node).__name__
meth = getattr(self, name, None)
if meth is None:
raise NotImplementedError
return meth(node)
그런 다음 클래스 는 evaluator
스타일시트 규칙을 가져와 각 규칙에 방문자를 구현합니다.
이전 버전과의 호환성 #
별도의 Style
클래스를 구현하면 아티스트에 대한 많은 get/set 메서드가 중복되므로 이전 버전과의 호환성이 손상됩니다. 이러한 메서드를 변경하여 Style
클래스(아티스트에 대한 속성으로 저장됨)에 연결하는 것이 가능하지만 코드베이스를 정리/단순화하고 단순하고 깔끔한 API를 제공하기 위해 간단히 제거하는 것이 좋습니다. .
대안 #
대안은 없지만 여기에서 다루는 일부 근거는 이 개발에 도움이 될 수 있는 MEP25와 겹칩니다.
부록 #
Matplotlib 프리미티브 #
이것은 스타일시트가 사용할 수 있는 초기 선택자를 형성합니다.
Line2D
텍스트
축 이미지
그림 이미지
반점