如何将图例从matplotlib图中删除

我有一系列20个地块(不是小插曲)在一个单一的数字。 我希望传奇在盒子外面。 与此同时,我不想改变坐标轴,因为图形的大小会减小。 请帮助我进行以下查询:

  • 我想保留图例区域外的图例框。 (我希望传说在剧情区域的右侧)。
  • 无论如何,我会减小图例框内文本的字体大小,以便图例框的大小很小。

  • 创建字体属性

    from matplotlib.font_manager import FontProperties
    
    fontP = FontProperties()
    fontP.set_size('small')
    legend([plot1], "title", prop=fontP)
    

    有很多方法可以做你想做的事。 要添加@inalis和@Navi已经说过的内容,您可以使用bbox_to_anchor关键字参数将图例部分放置在坐标轴之外和/或减小字体大小。

    在考虑缩小字体大小(可能使事情难以阅读)之前,请尝试在将图例置于不同位置的情况下进行游戏:

    那么,让我们从一个通用的例子开始:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.arange(10)
    
    fig = plt.figure()
    ax = plt.subplot(111)
    
    for i in xrange(5):
        ax.plot(x, i * x, label='$y = %ix$' % i)
    
    ax.legend()
    
    plt.show()
    

    替代文字

    如果我们做同样的事情,但使用bbox_to_anchor关键字参数,我们可以稍微在轴边界之外移动图例:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.arange(10)
    
    fig = plt.figure()
    ax = plt.subplot(111)
    
    for i in xrange(5):
        ax.plot(x, i * x, label='$y = %ix$' % i)
    
    ax.legend(bbox_to_anchor=(1.1, 1.05))
    
    plt.show()
    

    替代文字

    同样,你可以让图例更加水平和/或把它放在图的顶部(我也打开圆角和一个简单的阴影):

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.arange(10)
    
    fig = plt.figure()
    ax = plt.subplot(111)
    
    for i in xrange(5):
        line, = ax.plot(x, i * x, label='$y = %ix$'%i)
    
    ax.legend(loc='upper center', bbox_to_anchor=(0.5, 1.05),
              ncol=3, fancybox=True, shadow=True)
    plt.show()
    

    替代文字

    或者,您可以缩小当前绘图的宽度,并将图例完全放在图形轴的外面:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.arange(10)
    
    fig = plt.figure()
    ax = plt.subplot(111)
    
    for i in xrange(5):
        ax.plot(x, i * x, label='$y = %ix$'%i)
    
    # Shrink current axis by 20%
    box = ax.get_position()
    ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
    
    # Put a legend to the right of the current axis
    ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
    
    plt.show()
    

    替代文字

    以类似的方式,您可以垂直缩小绘图,并将水平图例置于底部:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.arange(10)
    
    fig = plt.figure()
    ax = plt.subplot(111)
    
    for i in xrange(5):
        line, = ax.plot(x, i * x, label='$y = %ix$'%i)
    
    # Shrink current axis's height by 10% on the bottom
    box = ax.get_position()
    ax.set_position([box.x0, box.y0 + box.height * 0.1,
                     box.width, box.height * 0.9])
    
    # Put a legend below current axis
    ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
              fancybox=True, shadow=True, ncol=5)
    
    plt.show()
    

    替代文字

    看看matplotlib图例指南。 你也可以看看plt.figlegend() 。 无论如何,希望这会有所帮助!


    放置图例( bbox_to_anchor

    图例使用plt.legendloc参数定位在轴的边界框内。
    例如, loc="upper right"将图例置于边界框的右上角,默认情况下,轴坐标中的( (0,0)(1,1) (或边界框符号(x0,y0, width, height)=(0,0,1,1) )。

    要将图例置于坐标轴边框外,可以指定图例左下角坐标的元组(x0,y0)

    plt.legend(loc=(1.04,0))
    

    但是,更通用的方法是使用bbox_to_anchor参数手动指定放置图例的边界框。 可以限制自己只提供bbox的(x0,y0)部分。 这将创建一个零跨度框,其中图例将按照loc参数给出的方向展开。 例如

    plt.legend(bbox_to_anchor=(1.04,1), loc="upper left")

    将图例置于轴的外部,以使图例的左上角位于轴坐标中的位置(1.04,1)

    下面给出进一步的例子,其中另外显示了不同参数如modencols之间的相互作用。

    在这里输入图像描述

    l1 = plt.legend(bbox_to_anchor=(1.04,1), borderaxespad=0)
    l2 = plt.legend(bbox_to_anchor=(1.04,0), loc="lower left", borderaxespad=0)
    l3 = plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)
    l4 = plt.legend(bbox_to_anchor=(0,1.02,1,0.2), loc="lower left",
                    mode="expand", borderaxespad=0, ncol=3)
    l5 = plt.legend(bbox_to_anchor=(1,0), loc="lower right", 
                    bbox_transform=fig.transFigure, ncol=3)
    l6 = plt.legend(bbox_to_anchor=(0.4,0.8), loc="upper right")
    

    有关如何解释bbox_to_anchor的4元组参数的详细信息(如l4 )可以在此问题中找到。 mode="expand"在由四元组给出的边界框内水平扩展图例。 对于垂直展开的图例,请参阅此问题。

    有时可以在图形坐标中指定边界框而不是坐标轴。 这在上面的示例l5示出,其中bbox_transform参数用于将图例置于图的左下角。

    后期处理

    将图例置于轴之外往往会导致不希望的情况,即它完全或部分位于图形画布之外。

    解决这个问题的方法是:

  • 调整子图参数
    一个可以调节副区参数,例如,使得轴取更小的空间图内(从而留下更多的空间,以图例)通过使用plt.subplots_adjust 。 例如

    plt.subplots_adjust(right=0.7)
    

    在图的右侧留下30%的空间,其中可以放置图例。

  • 紧凑的布局
    使用plt.tight_layout允许自动调整子图参数,使图中的元素与图边紧密对齐。 不幸的是,在这种自动机制中没有考虑图例,但是我们可以提供一个矩形框,整个子图区域(包括标签)都可以适应。

    plt.tight_layout(rect=[0,0,0.75,1])
    
  • bbox_inches = "tight"保存图形
    这个论点bbox_inches = "tight"plt.savefig可以用来保存数字使得画布(包括图例)上的所有艺术家被装配到已保存的区域。 如果需要,数字大小会自动调整。

    plt.savefig("output.png", bbox_inches="tight")
    
  • 自动调整子区域参数
    在这个答案中可以找到一种自动调整子图位置的方法,以便图例适合画布内部而不更改图形大小 :创建具有精确大小和无填充的图形(以及轴外图例)
  • 上面讨论的情况之间的比较:

    在这里输入图像描述

    备择方案

    一个人物传奇
    可以使用图形的图例而不是轴, matplotlib.figure.Figure.legend 。 这对matplotlib版本> = 2.1特别有用,其中不需要特殊参数

    fig.legend(loc=7) 
    

    为图中不同轴上的所有艺术家创造一个传奇。 图例使用loc参数放置,与放置在坐标轴中的坐标类似,但是参考整个图形 - 因此它会自动在轴外部。 剩下的就是调整子图,使得图例和坐标轴之间没有重叠。 这里从上面的“调整子图​​参数”点将会很有帮助。 一个例子:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0,2*np.pi)
    colors=["#7aa0c4","#ca82e1" ,"#8bcd50","#e18882"]
    fig, axes = plt.subplots(ncols=2)
    for i in range(4):
        axes[i//2].plot(x,np.sin(x+i), color=colors[i],label="y=sin(x+{})".format(i))
    
    fig.legend(loc=7)
    fig.tight_layout()
    fig.subplots_adjust(right=0.75)   
    plt.show()
    

    在这里输入图像描述

    专用子图轴内的图例
    使用bbox_to_anchor的替代方法bbox_to_anchor将图例置于其专用子图轴( lax )中。 由于图gridspec_kw={"width_ratios":[4,1]}图应该小于图,我们可以在创建坐标轴时使用gridspec_kw={"width_ratios":[4,1]} 。 我们可以隐藏坐标轴lax.axis("off")但仍然放入一个图例。图例句柄和标签需要通过h,l = ax.get_legend_handles_labels()从实际h,l = ax.get_legend_handles_labels()图中获得,然后可以提供给在图例lax副区, lax.legend(h,l) 下面是一个完整的例子。

    import matplotlib.pyplot as plt
    plt.rcParams["figure.figsize"] = 6,2
    
    fig, (ax,lax) = plt.subplots(ncols=2, gridspec_kw={"width_ratios":[4,1]})
    ax.plot(x,y, label="y=sin(x)")
    ....
    
    h,l = ax.get_legend_handles_labels()
    lax.legend(h,l, borderaxespad=0)
    lax.axis("off")
    
    plt.tight_layout()
    plt.show()
    

    这产生了一个与上面的情节非常相似的情节:

    在这里输入图像描述

    我们也可以使用第一个轴放置图例,但使用图例轴的bbox_transform

    ax.legend(bbox_to_anchor=(0,0,1,1), bbox_transform=lax.transAxes)
    lax.axis("off")
    

    在这种方法中,我们不需要从外部获取图例句柄,但我们需要指定bbox_to_anchor参数。

    进一步阅读和说明:

  • 考虑matplotlib传说指南,其中包含一些您想要对传说做些事情的例子。
  • 用于放置饼图的图例的一些示例代码可以直接在这个问题的答案中找到:Python - Legend与饼图重叠
  • loc参数可以采用数字而不是字符串,这样可以缩短调用时间,但是,它们不是很直观地映射到对方。 以下是供参考的映射:
  • 在这里输入图像描述

    链接地址: http://www.djcxy.com/p/67589.html

    上一篇: How to put the legend out of matplotlib plot

    下一篇: Plot logarithmic axes with matplotlib in python