How to load .ttf file in matplotlib using mpl.rcParams?

后端 未结 3 1118
逝去的感伤
逝去的感伤 2020-12-01 15:10

I have a matplotlib script that starts ...

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

mpl.rcParams[\'xt         


        
3条回答
  •  孤城傲影
    2020-12-01 15:32

    Whew I made it in under 100 lines, @nim this also explains in more detail how dangerous it is, some modifications change completely the behaviour of the font property and font size.

    prerequisites: Matplotlib and a font folder at the same level of the script containing the ttf font-file calibri.ttf

    But this is what I have for you as an easter egg:

    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()
    

提交回复
热议问题