2016-09-08 2 views
2

Ich möchte einen Rahmen um einige Texte in einem Matplotlib-Diagramm hinzufügen, die ich mit patheffects.withStroke tun kann. Für einige Buchstaben und Zahlen gibt es jedoch eine kleine Lücke rechts oben auf dem Symbol.Lücken in der Grenze um Text

Gibt es eine Möglichkeit, diese Lücke nicht zu haben?

Minimal Arbeits Beispiel:

import matplotlib.pyplot as plt 
import matplotlib.patheffects as patheffects 

fig, ax = plt.subplots() 
ax.text(
    0.1, 0.5, "test: S6", 
    color='white', 
    fontsize=90, 
    path_effects=[patheffects.withStroke(linewidth=13, foreground='black')]) 
fig.savefig("text_stroke.png") 

Dies gibt das Bild, das die Lücke in S und 6 Symbolen zeigt. enter image description here

Ich benutze Matplotlib 1.5.1.

+0

Ich denke, das ist beabsichtigt. Die Kontur der Buchstaben wird wie bei einer geformten Bürste gezeichnet, wobei der Anfang und der Endpunkt in einem anderen Winkel ankommen, daher die Fehlverbindung. – Ian

Antwort

2

Die Dokumentation erwähnt es nicht (oder ich habe es nicht gefunden), aber, im Code suchend, können wir sehen, dass die Methode patheffects.withStroke eine Menge Schlüsselwortargumente akzeptiert.

Sie können die Liste dieser Schlüsselwort Argumente haben durch diese in interaktiven Sitzung ausführen:

>>> from matplotlib.backend_bases import GraphicsContextBase as gcb 
>>> print([attr[4:] for attr in dir(gcb) if attr.startswith("set_")]) 
['alpha', 'antialiased', 'capstyle', 'clip_path', 'clip_rectangle', 'dashes', 'foreground', 'gid', 'graylevel', 'hatch', 'joinstyle', 'linestyle', 'linewidth', 'sketch_params', 'snap', 'url'] 

Das Argument, das Sie suchen, ist capstyle die drei möglichen Werte akzeptiert:

  • „butt“
  • "rund"
  • "Projizieren"

In Ihrem Fall scheint der "runde" Wert das Problem zu beheben. den Code unten Betrachten ...

import matplotlib.pyplot as plt 
import matplotlib.patheffects as patheffects 

fig, ax = plt.subplots() 
ax.text(
    0.1, 0.5, "test: S6", 
    color='white', 
    fontsize=90, 
    path_effects=[patheffects.withStroke(linewidth=13, foreground='black', capstyle="round")]) 
fig.savefig("text_stroke.png") 

... es ergibt dies:

enter image description here


Die akzeptierten Schlüsselwörter Argumente sind eigentlich alle set_* (minus der "set_" Prefixe) Methoden der GraphicsContextBase Klasse. Details zu den akzeptierten Werten finden Sie in der Klassendokumentation.

+0

Das hat gut funktioniert, danke! Ich vermute, das sollte irgendwo besser dokumentiert werden, möglicherweise in der Doc-Zeichenfolge. Ich werde ein Problem auf dem GitHub Matplotlib-Repository machen. – Magnus