2013-05-15 3 views
8

ich ein matplotlib Skript, das beginnt ...Wie zu laden. TTF-Datei in Matplotlib mit mpl.rcParams?

import matplotlib as mpl 
import matplotlib.pyplot as plt 
import matplotlib.font_manager as fm 

mpl.rcParams['xtick.labelsize']=16 
... 

ich verwendet habe, den Befehl

fm.findSystemFonts() 

eine Liste der Schriftarten auf meinem System zu bekommen. Ich habe den vollständigen Pfad zu einer Datei Ttf entdeckte ich verwenden möchte,

'/usr/share/fonts/truetype/anonymous-pro/Anonymous Pro BI.ttf' 

Ich habe versucht, diese Schriftart ohne Erfolg zu verwenden, um die folgenden Befehle

mpl.rcParams['font.family'] = 'anonymous-pro' 

und

mit
mpl.rcParams['font.family'] = 'Anonymous Pro BI' 

, die beide etwas zurückgeben wie

/usr/lib/pymodules/python2.7/matplotlib/font_manager.py:1218: UserWarning: findfont: Font family ['anonymous-pro'] not found. Falling back to Bitstream Vera Sans 

Kann ich das mpl.rcParams-Wörterbuch verwenden, um diese Schriftart in meinen Plots festzulegen?

EDIT

Nach ein wenig mehr lesen, scheint es sich hierbei um ein generelles Problem ist aus einer .ttf-Datei die Schriftfamiliennamen zu bestimmen. Ist das in Linux oder Python so einfach?

Außerdem habe ich versucht,

mpl.use['agg'] 
mpl.rcParams['text.usetex'] = False 

ohne Erfolg Zugabe

Antwort

11

eine Schriftfamilie angeben:

Wenn alles, was Sie wissen, dass der Weg zum ttf ist, können Sie dann kann den Namen der Schriftfamilie mit der Methode get_name ermitteln:

import matplotlib as mpl 
import matplotlib.pyplot as plt 
import matplotlib.font_manager as font_manager 

path = '/usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf' 
prop = font_manager.FontProperties(fname=path) 
mpl.rcParams['font.family'] = prop.get_name() 
fig, ax = plt.subplots() 
ax.set_title('Text in a cool font', size=40) 
plt.show() 

eine Schriftart mit Pfad angeben:

import matplotlib.pyplot as plt 
import matplotlib.font_manager as font_manager 

path = '/usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf' 
prop = font_manager.FontProperties(fname=path) 
fig, ax = plt.subplots() 
ax.set_title('Text in a cool font', fontproperties=prop, size=40) 
plt.show() 
+0

Dank. Ich sah diese Lösung in [http://stackoverflow.com/questions/12790284/why-doesnt-matplotlib-use-the-ttf-font-that-i-provide?rq=1] Post. Ich möchte jedoch die Schriftart des gesamten Textes im Diagramm ändern, ohne jeden Befehl zu aktualisieren, der Text erzeugt und/oder Befehle zum Ändern des Textes der Achsenbeschriftungen hinzufügt. Deshalb würde ich mpl.rcParams bevorzugen, wenn möglich. –

+0

das macht den Trick. Vielen Dank! –

+0

Kühl. Danke für die ausführliche Antwort. Hilft viel! –

3

Sie können den fc-Abfrage myfile.ttf Befehl verwenden, um die Metadaten-Informationen einer Schriftart nach dem Linux-Schriftsystem (fontconfig) zu überprüfen. Es sollte Ihre Namen drucken, die matplotlib akzeptiert. Allerdings ist die matplotlib-fontconfig-Integration zur Zeit ziemlich unvollständig, und ich fürchte, es ist durchaus möglich, dass Sie auf Fehler und Einschränkungen stoßen werden, die für die gleichen Schriften in anderen Linux-Anwendungen nicht existieren.

(dieser traurige Zustand wird von allen fest codierten Font-Namen versteckt in matplotlib der Standardkonfiguration, sobald Sie anfangen zu versuchen, sie zu ändern, sind Sie in gefährlichem Land)

1

Puh ich es unter 100 Zeilen gemacht, @nim dies erklärt auch im Detail, wie gefährlich es ist, einige Änderungen ändern vollständig das Verhalten der Schriftart-Eigenschaft und Schriftgröße.

Voraussetzungen: Matplotlib und ein Font-Ordner auf der gleichen Ebene des Skripts, das die ttf-Fontdatei calibri enthält.ttf

Aber das ist, was ich für Sie ein Osterei haben:

import os 
import matplotlib 
import matplotlib.pyplot as plt 
import matplotlib.font_manager as fm 
from matplotlib import ft2font 
from matplotlib.font_manager import ttfFontProperty 

__font_dir__ = os.path.join(os.path.dirname(__file__),"font") 
fpath = os.path.join(__font_dir__,'calibri.ttf') 

font = ft2font.FT2Font(fpath) 
fprop = fm.FontProperties(fname=fpath) 

ttfFontProp = ttfFontProperty(font) 

fontsize=18 

fontprop = fm.FontProperties(family='sans-serif', 
          #name=ap.fontprop.name, 
          fname=ttfFontProp.fname, 
          size=fontsize, 
          stretch=ttfFontProp.stretch, 
          style=ttfFontProp.style, 
          variant=ttfFontProp.variant, 
          weight=ttfFontProp.weight) 

matplotlib.rcParams.update({'font.size': fontsize, 
         'font.family': 'sans-serif'}) 

fig, axis = plt.subplots() 

axis.set_title('Text in a cool font',fontsize=fontsize,fontproperties=fontprop) 

ax_right = axis.twinx() 

axis.set_xlabel("some Unit",fontsize=fontsize,fontproperties=fontprop) 

leftAxesName,rightAxesName = "left Unit", "right Unit" 

axis.set_ylabel(leftAxesName,fontsize=fontsize,fontproperties=fontprop) 
if rightAxesName: 
    ax_right.set_ylabel(rightAxesName,fontsize=fontsize,fontproperties=fontprop) 

for xLabel in axis.get_xticklabels(): 
    xLabel.set_fontproperties(fontprop) 
    xLabel.set_fontsize(fontsize) 

for yLabel in axis.get_yticklabels(): 
    yLabel.set_fontproperties(fontprop) 
    yLabel.set_fontsize(fontsize)  

yTickLabelLeft = ax_right.get_yticklabels() 

for yLabel in yTickLabelLeft: 
    yLabel.set_fontproperties(fontprop) 
    yLabel.set_fontsize(fontsize) 

axis.plot([0,1],[0,1],label="test") 

nrow,ncol=1,1 
handels,labels= axis.get_legend_handles_labels() 

propsLeft=axis.properties() 

propsRight=ax_right.properties() 

print(propsLeft['title'],propsLeft['xlabel'],propsLeft['ylabel']) 
print(propsRight['ylabel']) 

fig.set_tight_layout({'rect': [0, 0, 1, 0.95], 'pad': 0.05, 'h_pad': 1.5}) 
fig.tight_layout() 
fig.set_alpha(True) 

leg_fig = plt.figure() 

leg = leg_fig.legend(handels, labels, #labels = tuple(bar_names) 
    ncol=ncol, mode=None, 
    borderaxespad=0., 
    loc='center',  # the location of the legend handles 
    handleheight=None, # the height of the legend handles 
    #fontsize=9,   # prop beats fontsize 
    markerscale=None, 
    frameon=False, 
    prop=fontprop) 

plt.show()