MEP26: アーティストスタイリング#

ステータス番号

却下

ブランチとプルリクエスト#

アブストラクト#

この MEP は、アーティストのより包括的かつ動的なスタイリングを可能にする新しいスタイルシートの実装を提案します。

現在のバージョンの matplotlib (1.4.0) では、プロットを作成する前に、rcParams 構文に基づくスタイルシートを適用できます。以下の方法論は、既存のオブジェクトに動的に適用できる個々のアーティストとプロパティのスタイリングを可能にする、CSS に基づく新しい構文を提案します。

これは、DOM/ツリーのようなアーキテクチャに移行するという全体的な目標に関連しています (そして、それに向けて一歩を踏み出します)。

詳細な説明#

現在、既存のアーティスト オブジェクト (Figure、Axes、Line2D など) のルックと外観は、アーティスト オブジェクトの メソッドset_get_メソッドを介してのみ更新できます。これは、特にアーティストへの参照が保存されていない場合は非常に面倒です。 . 1.4 で導入された新しいスタイル シートでは、プロットを作成する前にスタイルを設定できますが、プロットを動的に更新したり、同じタイプのアーティストを区別したりする手段は提供されません (つまり、異なるオブジェクトに対してと を別々に指定する)。line colorline styleLine2D

Artist最初の開発では、アーティスト プリミティブ (他の を含まない ) のスタイリングを許可することに集中する必要がありますArtist。さらに開発を進めると、CSS 構文規則とパーサーが拡張され、より複雑なスタイリングが可能になります。プリミティブのリストについては、付録を参照してください。

新しい方法論では、いくつかのステップの開発が必要になります。

  • タイプ、クラス、ID などによるアーティストの選択を可能にする新しいスタイルシート構文 (おそらく CSS に基づく)。

  • スタイルシートを解析してツリーにするメカニズム

  • 関連するアーティストのプロパティを更新するために使用できるものに解析ツリーを変換するメカニズム。理想的には、ツリーのような構造でアーティストをトラバースする方法を実装します。

  • 既存のアーティスト プロパティからスタイルシートを生成するメカニズム。これは、ユーザーが既存の図 (matplotlib API を使用して外観が設定されている可能性がある) からスタイルシートをエクスポートできるようにするのに役立ちます...

実装#

「スタイル」が別のクラスとして作成され、アーティストに対してプロパティとして保存されている場合、「サードパーティ」がアーティストのスタイルを変更/設定できるようにするのが最も簡単です。クラスはすでにクラスのGraphicsContextBase基礎を提供して Styleおり、アーティストのdrawメソッドをリファクタリングして、独自のクラスを設定してスタイル関連のプロパティをクラスに転送するStyleのではなく、クラスを使用することができます。GraphicsContextBaseこれを実装する方法の最小限の例を次に示します: https://github.com/JamesRamm/mpl_experiment

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"

ArtistIdentIdentNumberおよびColourは、正規表現によって定義されるトークン (式の基本的なビルディング ブロック) です。

構文#

CSS スタイルシートは、一連のルール セットが階層順に構成されています (ルールは上から下に適用されます)。各ルールは構文に従います

selector {attribute: value;}

各ルールには任意の数のペアを含めることができ、スタイルシートには任意の数のルールを含めることができます。attribute: value

Artist初期構文は、プリミティブ専用に設計されています。型にプロパティを設定する方法の問題には対処していませんContainer(そのプロパティ自体が設定可能なプロパティを持つArtists である可能性があります)。 RuleSet

セレクター#

セレクターは、属性の更新を適用するオブジェクトを定義します。出発点として、初期開発で使用するセレクターを 2 つだけ提案します。

アーティスト タイプ セレクター

タイプ別に選択しArtistます。例Line2DまたはText:

Line2D {attribute: value}

アーティスト タイプ セレクター ( ArtistIdentBNF 文法) に一致する正規表現は次のようになります。

ArtistIdent = r'(?P<ArtistIdent>\bLine2D\b|\bText\b|\bAxesImage\b|\bFigureImage\b|\bPatch\b)'

GID セレクター#

によって を選択Artistしますgid:

Line2D#myGID {attribute: value}

Agidは任意の文字列にすることができるため、正規表現は次のようになります。

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 から借りることができます)、パーサーを作成する必要があります。幸いなことに、Python クックブックにもこのレシピがあります。

matplotlib 図のビジター パターン#

関連するアーティストにスタイルシートのルールを適用するには、フィギュア内の各アーティストを「訪問」し、関連するルールを適用する必要があります。これはビジター クラスです (これも python cookbook のおかげです)。それぞれ 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

  • 文章

  • 軸イメージ

  • 図イメージ

  • パッチ