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.
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.
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
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.
Tags und Links python matplotlib