【问题标题】:How to change the font size on a matplotlib plot如何更改 matplotlib 图上的字体大小
【发布时间】:2011-04-23 10:25:06
【问题描述】:

如何更改 matplotlib 图上所有元素(刻度、标签、标题)的字体大小?

我知道如何更改刻度标签大小,这是通过以下方式完成的:

import matplotlib 
matplotlib.rc('xtick', labelsize=20) 
matplotlib.rc('ytick', labelsize=20) 

但是如何改变其他的呢?

【问题讨论】:

    标签: python matplotlib font-size


    【解决方案1】:

    来自matplotlib documentation

    font = {'family' : 'normal',
            'weight' : 'bold',
            'size'   : 22}
    
    matplotlib.rc('font', **font)
    

    这会将所有项目的字体设置为 kwargs 对象指定的字体,font

    或者,您也可以使用this answer 中建议的rcParams update 方法:

    matplotlib.rcParams.update({'font.size': 22})
    

    import matplotlib.pyplot as plt
    plt.rcParams.update({'font.size': 22})
    

    您可以在Customizing matplotlib page 上找到可用房产的完整列表。

    【讨论】:

    • 不错,只是它覆盖了沿途找到的任何 fontsize 属性 è_é
    • 在哪里可以找到更多关于 'family''weight' 等元素的选项?
    • 由于很多人都是以import matplotlib.pyplot as plt开头的,你可能想指出pyplot也有rc。你可以做plt.rc(...,而不必改变你的导入。
    • 对于不耐烦的人:默认字体大小为 10,如第二个链接所示。
    • @user32882 - 不是永久的,它不会保存到磁盘,但我认为它会改变在相同代码中生成的后续绘图,除非原始值被存储和恢复,这并不总是方便。您可以执行for label in (ax.get_xticklabels() + ax.get_yticklabels()): label.set_fontsize(22) 之类的操作来影响单个图中的文本大小。
    【解决方案2】:
    matplotlib.rcParams.update({'font.size': 22})
    

    【讨论】:

    • 在可能的情况下,此解决方案仅在我创建第一个绘图时才有效,然后按照建议“更新”,这会导致新图形的字体大小更新。也许第一个情节是初始化 rcParams 所必需的......
    【解决方案3】:

    如果您只想更改已创建的特定绘图的字体大小,请尝试以下操作:

    import matplotlib.pyplot as plt
    
    ax = plt.subplot(111, xlabel='x', ylabel='y', title='title')
    for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +
                 ax.get_xticklabels() + ax.get_yticklabels()):
        item.set_fontsize(20)
    

    【讨论】:

    • 我的目的是让 x-y 标签、刻度和标题的字体大小不同。修改后的版本对我来说效果很好。
    • 要获取图例,也可以使用 ax.legend().get_texts()。在 Matplotlib 1.4 上测试。
    • 这最直接地回答了这个问题。谢谢。
    • 如果绘图是在没有定义轴的情况下创建的,可能需要ax=plt.gca()
    • @JamesS。而是使用ax.get_legend().get_texts(),因为ax.legend() 在返回ax.get_legend() 的值之上使用默认参数重绘整个图例。
    【解决方案4】:

    更新:请参阅答案的底部以获得更好的方法。
    更新#2:我已经想出改变图例标题字体
    更新 #3: 有一个 bug in Matplotlib 2.0.0 导致对数轴的刻度标签恢复为默认字体。应该在 2.0.1 中修复,但我在答案的第二部分中包含了解决方法。

    此答案适用于任何试图更改所有字体(包括图例)的人,也适用于任何试图为每件事使用不同字体和大小的人。它不使用 rc (这似乎对我不起作用)。这相当麻烦,但我个人无法掌握任何其他方法。它基本上将 ryggyr 的答案与 SO 上的其他答案结合在一起。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.font_manager as font_manager
    
    # Set the font dictionaries (for plot title and axis titles)
    title_font = {'fontname':'Arial', 'size':'16', 'color':'black', 'weight':'normal',
                  'verticalalignment':'bottom'} # Bottom vertical alignment for more space
    axis_font = {'fontname':'Arial', 'size':'14'}
    
    # Set the font properties (for use in legend)   
    font_path = 'C:\Windows\Fonts\Arial.ttf'
    font_prop = font_manager.FontProperties(fname=font_path, size=14)
    
    ax = plt.subplot() # Defines ax variable by creating an empty plot
    
    # Set the tick labels font
    for label in (ax.get_xticklabels() + ax.get_yticklabels()):
        label.set_fontname('Arial')
        label.set_fontsize(13)
    
    x = np.linspace(0, 10)
    y = x + np.random.normal(x) # Just simulates some data
    
    plt.plot(x, y, 'b+', label='Data points')
    plt.xlabel("x axis", **axis_font)
    plt.ylabel("y axis", **axis_font)
    plt.title("Misc graph", **title_font)
    plt.legend(loc='lower right', prop=font_prop, numpoints=1)
    plt.text(0, 0, "Misc text", **title_font)
    plt.show()
    

    这种方法的好处是,通过拥有多个字体字典,您可以为各种标题选择不同的字体/大小/粗细/颜色,为刻度标签选择字体,为图例选择字体,所有独立。


    更新:

    我已经制定了一种稍微不同的、不那么混乱的方法,它取消了字体字典,并允许在您的系统上使用任何字体,甚至是 .otf 字体。要为每个事物设置单独的字体,只需编写更多 font_pathfont_prop 之类的变量即可。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.font_manager as font_manager
    import matplotlib.ticker
    # Workaround for Matplotlib 2.0.0 log axes bug https://github.com/matplotlib/matplotlib/issues/8017 :
    matplotlib.ticker._mathdefault = lambda x: '\\mathdefault{%s}'%x 
    
    # Set the font properties (can use more variables for more fonts)
    font_path = 'C:\Windows\Fonts\AGaramondPro-Regular.otf'
    font_prop = font_manager.FontProperties(fname=font_path, size=14)
    
    ax = plt.subplot() # Defines ax variable by creating an empty plot
    
    # Define the data to be plotted
    x = np.linspace(0, 10)
    y = x + np.random.normal(x)
    plt.plot(x, y, 'b+', label='Data points')
    
    for label in (ax.get_xticklabels() + ax.get_yticklabels()):
        label.set_fontproperties(font_prop)
        label.set_fontsize(13) # Size here overrides font_prop
    
    plt.title("Exponentially decaying oscillations", fontproperties=font_prop,
              size=16, verticalalignment='bottom') # Size here overrides font_prop
    plt.xlabel("Time", fontproperties=font_prop)
    plt.ylabel("Amplitude", fontproperties=font_prop)
    plt.text(0, 0, "Misc text", fontproperties=font_prop)
    
    lgd = plt.legend(loc='lower right', prop=font_prop) # NB different 'prop' argument for legend
    lgd.set_title("Legend", prop=font_prop)
    
    plt.show()
    

    希望这是一个全面的答案

    【讨论】:

      【解决方案5】:

      基于以上内容:

      import matplotlib.pyplot as plt
      import matplotlib.font_manager as fm
      
      fontPath = "/usr/share/fonts/abc.ttf"
      font = fm.FontProperties(fname=fontPath, size=10)
      font2 = fm.FontProperties(fname=fontPath, size=24)
      
      fig = plt.figure(figsize=(32, 24))
      fig.text(0.5, 0.93, "This is my Title", horizontalalignment='center', fontproperties=font2)
      
      plot = fig.add_subplot(1, 1, 1)
      
      plot.xaxis.get_label().set_fontproperties(font)
      plot.yaxis.get_label().set_fontproperties(font)
      plot.legend(loc='upper right', prop=font)
      
      for label in (plot.get_xticklabels() + plot.get_yticklabels()):
          label.set_fontproperties(font)
      

      【讨论】:

        【解决方案6】:

        这是一种完全不同的方法,它可以很好地改变字体大小:

        改变人物大小

        我通常使用这样的代码:

        import matplotlib.pyplot as plt
        import numpy as np
        fig = plt.figure(figsize=(4,3))
        ax = fig.add_subplot(111)
        x = np.linspace(0,6.28,21)
        ax.plot(x, np.sin(x), '-^', label="1 Hz")
        ax.set_title("Oscillator Output")
        ax.set_xlabel("Time (s)")
        ax.set_ylabel("Output (V)")
        ax.grid(True)
        ax.legend(loc=1)
        fig.savefig('Basic.png', dpi=300)
        

        你使图形大小,字体是相对于情节。这也放大了标记。注意我还设置了dpi 或每英寸点数。我是从 AMTA(美国美国模特老师)论坛的帖子中了解到这一点的。 上述代码示例:

        【讨论】:

        • 为避免轴标签被截断,请使用bbox_inches 参数fig.savefig('Basic.png', bbox_inches="tight") 保存图形
        • 如果我不保存图形怎么办?我正在 Juypter Notebook 中绘图,结果轴标签被截断。
        • 谢谢!指出 dpi 设置对我准备绘图的可打印版本非常有帮助,而无需调整所有线条大小、字体大小等。
        • 为了防止标签被截断,同样在@Zythyr问的笔记本中,可以使用plt.tight_layout()
        • @Zythyr 您也可以在 plt.figure() 的调用中使用 dpi=XXX 参数:plt.figure(figsize=(4,3), dpi=300) 无需保存即可获得相同的结果
        【解决方案7】:

        如果你和我一样是控制狂,你可能想明确设置所有字体大小:

        import matplotlib.pyplot as plt
        
        SMALL_SIZE = 8
        MEDIUM_SIZE = 10
        BIGGER_SIZE = 12
        
        plt.rc('font', size=SMALL_SIZE)          # controls default text sizes
        plt.rc('axes', titlesize=SMALL_SIZE)     # fontsize of the axes title
        plt.rc('axes', labelsize=MEDIUM_SIZE)    # fontsize of the x and y labels
        plt.rc('xtick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
        plt.rc('ytick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
        plt.rc('legend', fontsize=SMALL_SIZE)    # legend fontsize
        plt.rc('figure', titlesize=BIGGER_SIZE)  # fontsize of the figure title
        

        请注意,您还可以在matplotlib 上调用rc 方法设置大小:

        import matplotlib
        
        SMALL_SIZE = 8
        matplotlib.rc('font', size=SMALL_SIZE)
        matplotlib.rc('axes', titlesize=SMALL_SIZE)
        
        # and so on ...
        

        【讨论】:

        • 我尝试了很多答案。这个看起来最好,至少在 Jupyter notebooks 中是这样。只需将上面的块复制到顶部并自定义三个字体大小常量即可。
        • 同意 fvitkor,这是最好的答案!
        • 对我来说,标题大小不起作用。我用过:plt.rc('axes', titlesize=BIGGER_SIZE)
        • 我认为您可以将同一对象的所有设置合并到一行中。例如,plt.rc('axes', titlesize=SMALL_SIZE, labelsize=MEDIUM_SIZE)
        【解决方案8】:

        我完全同意 Huster 教授的观点,即最简单的方法是更改​​图形的大小,这样可以保留默认字体。将图形保存为 pdf 时,我只需要使用 bbox_inches 选项来补充它,因为轴标签已被剪切。

        import matplotlib.pyplot as plt
        plt.figure(figsize=(4,3))
        plt.savefig('Basic.pdf', bbox_inches='tight')
        

        【讨论】:

          【解决方案9】:

          这是 Marius Retegan answer 的扩展。您可以使用所有修改创建一个单独的 JSON 文件,然后使用 rcParams.update 加载它。更改将仅适用于当前脚本。所以

          import json
          from matplotlib import pyplot as plt, rcParams
          
          s = json.load(open("example_file.json")
          rcParams.update(s)
          

          并将此“example_file.json”保存在同一文件夹中。

          {
            "lines.linewidth": 2.0,
            "axes.edgecolor": "#bcbcbc",
            "patch.linewidth": 0.5,
            "legend.fancybox": true,
            "axes.color_cycle": [
              "#348ABD",
              "#A60628",
              "#7A68A6",
              "#467821",
              "#CF4457",
              "#188487",
              "#E24A33"
            ],
            "axes.facecolor": "#eeeeee",
            "axes.labelsize": "large",
            "axes.grid": true,
            "patch.edgecolor": "#eeeeee",
            "axes.titlesize": "x-large",
            "svg.fonttype": "path",
            "examples.directory": ""
          }
          

          【讨论】:

          【解决方案10】:

          使用plt.tick_params(labelsize=14)

          【讨论】:

          • 感谢您提供代码 sn-p,它可能会提供一些有限的即时帮助。通过描述为什么这是解决问题的好方法,正确的解释将极大地改进其long-term value,并使其对有其他类似问题的未来读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设。
          • 这不只是改变刻度的字体大小吗?
          【解决方案11】:

          您可以使用plt.rcParams["font.size"]matplotlib 中设置font_size,也可以使用plt.rcParams["font.family"]matplotlib 中设置font_family。试试这个例子:

          import matplotlib.pyplot as plt
          plt.style.use('seaborn-whitegrid')
          
          label = [1,2,3,4,5,6,7,8]
          x = [0.001906,0.000571308,0.0020305,0.0037422,0.0047095,0.000846667,0.000819,0.000907]
          y = [0.2943301,0.047778308,0.048003167,0.1770876,0.532489833,0.024611333,0.157498667,0.0272095]
          
          
          plt.ylabel('eigen centrality')
          plt.xlabel('betweenness centrality')
          plt.text(0.001906, 0.2943301, '1 ', ha='right', va='center')
          plt.text(0.000571308, 0.047778308, '2 ', ha='right', va='center')
          plt.text(0.0020305, 0.048003167, '3 ', ha='right', va='center')
          plt.text(0.0037422, 0.1770876, '4 ', ha='right', va='center')
          plt.text(0.0047095, 0.532489833, '5 ', ha='right', va='center')
          plt.text(0.000846667, 0.024611333, '6 ', ha='right', va='center')
          plt.text(0.000819, 0.157498667, '7 ', ha='right', va='center')
          plt.text(0.000907, 0.0272095, '8 ', ha='right', va='center')
          plt.rcParams["font.family"] = "Times New Roman"
          plt.rcParams["font.size"] = "50"
          plt.plot(x, y, 'o', color='blue')
          

          【讨论】:

            【解决方案12】:

            这是我在 Jupyter Notebook 中通常使用的:

            # Jupyter Notebook settings
            
            from IPython.core.display import display, HTML
            display(HTML("<style>.container { width:95% !important; }</style>"))
            %autosave 0
            %matplotlib inline
            %load_ext autoreload
            %autoreload 2
            
            from IPython.core.interactiveshell import InteractiveShell
            InteractiveShell.ast_node_interactivity = "all"
            
            
            # Imports for data analysis
            import pandas as pd
            import matplotlib.pyplot as plt
            pd.set_option('display.max_rows', 2500)
            pd.set_option('display.max_columns', 500)
            pd.set_option('display.max_colwidth', 2000)
            pd.set_option('display.width', 2000)
            pd.set_option('display.float_format', lambda x: '%.3f' % x)
            
            #size=25
            size=15
            params = {'legend.fontsize': 'large',
                      'figure.figsize': (20,8),
                      'axes.labelsize': size,
                      'axes.titlesize': size,
                      'xtick.labelsize': size*0.75,
                      'ytick.labelsize': size*0.75,
                      'axes.titlepad': 25}
            plt.rcParams.update(params)
            

            【讨论】:

              【解决方案13】:

              rcParams 的更改非常精细,大多数情况下您只需要缩放所有字体大小,以便在您的图中更好地看到它们。数字大小是一个很好的技巧,但是您必须为所有数字携带它。另一种方法(不是纯粹的 matplotlib,或者如果你不使用 seaborn 可能会矫枉过正)是使用 seaborn 设置字体比例:

              sns.set_context('paper', font_scale=1.4)
              

              免责声明:我知道,如果您只使用 matplotlib,那么您可能不想安装整个模块来缩放您的绘图(我的意思是为什么不),或者如果您使用 seaborn,那么您可以更好地控制选项.但是在这种情况下,您的数据科学虚拟环境中有 seaborn,但在此笔记本中没有使用它。无论如何,还有另一种解决方案。

              【讨论】:

                猜你喜欢
                • 2012-07-07
                • 1970-01-01
                • 1970-01-01
                • 2018-01-24
                • 2011-10-28
                • 1970-01-01
                • 1970-01-01
                • 2021-10-30
                • 1970-01-01
                相关资源
                最近更新 更多