matplotlib: используйте (один и тот же) пользовательский шрифт в любом виде текста: оси, заголовок, наложение текста, легенда - PullRequest
0 голосов
/ 15 июня 2019

Я рисую график, и мне нужно использовать определенный шрифт везде в нем. Я обнаружил, как использовать пользовательский шрифт при использовании matplotlib.pyplot.text:

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import numpy as np
import pandas as pd

font_black = "fonts/Montserrat_Black.ttf" # A local file
font_light = "fonts/Montserrat_Light.ttf" # Another local file

plt.text( 0.5, 0.5, "Wuz hatnen?"
        , fontproperties =
          fm.FontProperties(fname=font_black) )
plt.show()

Но мне нужно использовать этот шрифт во многих других видах текста - заголовок, метки осей, метки галочек, легенда и текст, нарисованный с помощью Axes.text. Я надеюсь, что есть глобальный элемент управления, который изменяет шрифт, используемый для всего на графике. Я надеялся на matplotlilb.pyplot.rc, но не смог заставить его работать. Я также пытался использовать отдельные функции настройки текста, такие как Axes.set_title (а не более общие Axes.set), но также не смог заставить это работать.

Следующее демонстрирует все виды вещей, которые я рисую; это работает, но не делает шрифты.

df = pd.DataFrame( { "2014": [1,2,3,4]
                   , "2015": [3,4,5,1] }
                 , index=["Saturn","hedgehog","abstract","crunk"] )

_,ax = plt.subplots()
nCols = len( df.columns )
nRows = len( df.index )
xvals = np.arange( nCols )

if True: # Draw stuff.
  plots = {}
  for rn in range(nRows):

    if True: # Irrelevant details -- stack some box plots.
      if rn < 1: bottom = [0. for i in range(nCols)]
      else:      bottom = df.iloc[0:rn,:].sum()
      top =      bottom + df.iloc[  rn,:]
      plots[rn] = ax.bar(
          xvals
        , df.iloc[rn,:]
        , width = [ 0.8 for i in range( nCols ) ]
        , bottom = bottom )

    for cn in range( nCols ): # Overlay text onto the box plot boxes
      ax.text( float( cn )
             , ((bottom + top) / 2)[cn]
             , df.iloc[ rn, cn ]
             , fontsize=10
             , verticalalignment='center'
             , horizontalalignment='center' )

plt.legend( plots.values(), df.index )        # Another kind of text
ax.set( title="What it is"                    # Another kind of text
      , xlabel="Year"                         # Another kind of text
      , ylabel='Real spending (2019 pesos)' ) # Another kind of text

plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...