Gekrümmter Text Rendering in Matplotlib

8

In einem Projekt, das ich gerade mache, muss ich eine Benutzereingabe von einer strukturierten Datei (xml) übernehmen. Die Datei enthält Straßendaten eines Bereichs, den ich auf dem Matplotlib-Canvas plotten muss. Das Problem ist, dass ich neben der Straße auch den Straßennamen angeben muss, und die meisten Straßen sind gekrümmt. Ich weiß, wie man Text in einem Winkel rendert. Aber ich frage mich, ob es möglich ist, den Textwinkel in der Mitte der Saite zu ändern?

In etwa so: Zeichnen Sie gedrehten Text auf einem gekrümmten Pfad

>

Aber mit Matplotlib.

    
deepak 14.10.2013, 04:33
quelle

2 Antworten

9

Hier ist mein Blick auf das Problem:  Um den Text nach dem Zeichnen robust zu machen, leite ich eine Kindklasse, CurvedText , von matplotlib.text ab. Das Objekt CurvedText verwendet eine Zeichenfolge und eine Kurve in Form von x - und y -Wert-Arrays. Der Text, der selbst angezeigt werden soll, wird in separate Zeichen geschnitten, die jeweils an der entsprechenden Stelle zur Zeichnung hinzugefügt werden. Da matplotlib.text nichts zeichnet, wenn die Zeichenfolge leer ist, ersetze ich alle Leerzeichen durch unsichtbare 'a's. Bei figure -Anpassung ruft das überladene draw() die Funktion update_positions() auf, die dafür sorgt, dass die Zeichenpositionen und -ausrichtungen korrekt bleiben. Um die Aufrufreihenfolge sicherzustellen (die draw() -Funktion jedes Zeichens wird ebenfalls aufgerufen), sorgt das Objekt CurvedText auch dafür, dass zorder jedes Zeichens höher ist als sein eigenes zorder . Nach meinem Beispiel hier kann der Text ausgerichtet werden. Wenn der Text bei der aktuellen Auflösung nicht an die Kurve angepasst werden kann, wird der Rest ausgeblendet, erscheint jedoch bei der Größenanpassung. Unten ist der Code mit einem Anwendungsbeispiel.

%Vor%

Das Ergebnis sieht folgendermaßen aus:

Es gibt noch einige Probleme, wenn der Text der konkaven Seite einer stark gekrümmten Kurve folgt. Dies liegt daran, dass die Zeichen entlang der Kurve zusammengefügt werden, ohne Überlappungen zu berücksichtigen. Wenn ich Zeit habe, werde ich versuchen, das zu verbessern. Kommentare sind sehr willkommen.

Getestet in python 3.5 und 2.7

    
Thomas Kühn 13.06.2017, 12:46
quelle
4

Ich fand Ihr Problem ziemlich interessant, also habe ich etwas gemacht, das mit dem Matplotlib-Textwerkzeug ziemlich nah kommt:

%Vor%

Die Umsetzung ist bei weitem nicht perfekt, aber meiner Meinung nach ein guter Ausgangspunkt.

Außerdem scheint Matplotlib eine gewisse Entwicklung zu haben, um ein Streudiagramm mit Rotation der Marker zu erhalten, was für diesen Fall ideal wäre. Allerdings sind meine Programmierfähigkeiten fast nicht so hardcore, wie sie sein müssen, um dieses Problem anzugehen, also kann ich hier nicht helfen.

matplotlib auf github: Pull-Anforderung

matplotlib auf github: issue

    
Daan 08.06.2017 21:22
quelle

Tags und Links