MEP26: 아티스트 스타일링 #

상태 번호

거부됨

브랜치 및 풀 리퀘스트 #

초록 #

이 MEP는 아티스트의 보다 포괄적이고 역동적인 스타일링을 허용하는 새로운 스타일시트 구현을 제안합니다.

현재 버전의 matplotlib(1.4.0)에서는 rcParams 구문을 기반으로 하는 스타일시트를 플롯 생성 전에 적용할 수 있습니다. 아래의 방법론은 기존 개체에 동적으로 적용할 수 있는 개별 아티스트 및 속성의 스타일을 지정할 수 있는 CSS 기반의 새로운 구문을 제안합니다.

이것은 DOM/트리와 같은 아키텍처로 이동하는 전반적인 목표와 관련이 있습니다(그리고 이를 향한 단계를 만듭니다).

자세한 설명 #

set_현재 기존 아티스트 개체(그림, 축, Line2D 등)의 모양과 모양은 아티스트 개체의 및 메서드 를 통해서만 업데이트할 수 있으며 get_, 이는 특히 아티스트에 대한 참조가 저장되지 않은 경우 상당히 힘든 작업입니다. . 1.4에 도입된 새로운 스타일 시트는 플롯이 생성되기 전에 스타일 지정을 허용하지만 플롯을 동적으로 업데이트하거나 동일한 유형의 아티스트를 구별하는 수단(즉, 다른 객체 에 대해 및 별도로 지정)을 제공하지 않습니다.line colorline styleLine2D

Artist초기 개발은 아티스트 프리미티브( 다른 를 포함하지 않는 )의 스타일 지정을 허용하는 데 집중해야 Artist하며 추가 개발에서는 CSS 구문 규칙과 구문 분석기를 확장하여 더 복잡한 스타일 지정을 허용할 수 있습니다. 프리미티브 목록은 부록을 참조하십시오.

새로운 방법론은 여러 단계를 개발해야 합니다.

  • 유형, 클래스, ID 등으로 아티스트를 선택할 수 있는 새로운 스타일시트 구문(CSS 기반)

  • 스타일시트를 트리로 구문 분석하는 메커니즘

  • 구문 분석 트리를 관련 아티스트의 속성을 업데이트하는 데 사용할 수 있는 것으로 변환하는 메커니즘입니다. 이상적으로 이것은 트리와 같은 구조에서 아티스트를 횡단하는 방법을 구현합니다.

  • 기존 아티스트 속성에서 스타일시트를 생성하는 메커니즘입니다. 이는 사용자가 기존 그림(matplotlib API를 사용하여 모양을 설정했을 수 있음)에서 스타일시트를 내보낼 수 있도록 하는 데 유용합니다.

구현 #

'스타일'이 별도의 클래스로 생성되어 아티스트에 대한 속성으로 저장되는 경우 '제3자'가 아티스트의 스타일을 수정/설정하도록 허용하는 것이 가장 쉬울 것입니다. GraphicsContextBase클래스는 이미 클래스의 기반을 제공하고 아티스트 Style의 방법은 자체적으로 설정 하고 스타일 관련 속성을 클래스에 전송하는 대신 클래스 draw를 사용하도록 리팩터링할 수 있습니다 . 이것이 어떻게 구현될 수 있는지에 대한 최소한의 예는 다음과 같습니다: https://github.com/JamesRamm/mpl_experimentStyleGraphicsContextBase

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대한 향후 솔루션은 단순히 중첩 RuleSets 일 수 있습니다.

선택기 #

선택기는 특성 업데이트를 적용해야 하는 개체를 정의합니다. 시작점으로 초기 개발에 사용할 선택자를 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

  • 텍스트

  • 축 이미지

  • 그림 이미지

  • 반점