如何将图例排除在情节之外


986

我要在一个图中制作一系列20个图(不是子图)。我希望图例在框外。同时,由于图形尺寸变小,我不想更改轴。请帮助我进行以下查询:

  1. 我想将图例框保留在绘图区域之外。(我希望图例位于绘图区域的右侧)。
  2. 无论如何,我是否减小了图例框内文本的字体大小,以使图例框的大小变小。

14
对于较新的matplotlib版本,此答案显示了如何设置matplotlib以自动确定在何处放置图例而不干扰绘图
dotancohen

2
遇到了同样的问题,发现了一个出色的示例,对我很有效:matplotlib.org/1.3.1/users/legend_guide.html
robodasha

1
这个答案更深入https://stackoverflow.com/a/43439132/52074。并用两行代码来完成!+1200最高答案也不错,但我发现它的通用性较差。
Trevor Boyd Smith,

2
@dotancohen “在不干扰图的情况下自动确定将图例放置在何处”在某些情况下,当图具有很多曲线时,很可能是不可能的。在那些情况下,用户可能希望手动放置图例,并确实将其放置在绘图区域之外。我现在在这样的情节上遇到困难。
阿里

顺便说一句,loc的选择列表:最佳;右上方; 左上; 左下;右下; 对; 居中左;右中 下中心 上中心 中央;
Z-Y00

Answers:


57

您可以通过创建字体属性来缩小图例文本:

from matplotlib.font_manager import FontProperties

fontP = FontProperties()
fontP.set_size('small')
legend([plot1], "title", prop=fontP) 
# or add prop=fontP to whatever legend() call you already have

50
什么是plot1这个答案吗?
Paul H

41
什么是legend这个答案吗?
理查德

28
这回答了问题的第二部分,而不是第一部分(标题为)。
Mateen Ulhaq,

8
另外,执行此操作的正确方法是plt.legend(fontsize='small')
Mateen Ulhaq,

41
这个答案很糟糕,提供的背景很少!
Tekill

1793

有很多方法可以做您想要的。要添加@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()

替代文字

另外,您可以缩小当前图的宽度,并将图例完全放在图的轴外(注意:如果使用ight_layout(),则省略ax.set_position():

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


10
如果有人对此有疑问,请注意,tight_layout()会引起问题!
马修·

4
好答案!指向文档的正确链接是matplotlib.org/users/legend_guide.html#legend-location
meduz,2013年

4
作为完整性,您可以说(通常是根据文档总结的)“ bbox_to_anchor是4个浮点数的元组(x,y,bbox的宽度,高度),或者是标准化轴上2个浮点数的元组(x,y)坐标。”
meduz

5
我必须承认这可能是我访问量最大的答案。我只是忍不住一遍又一遍地重复它,因为没有理智的人如果不在这里查找它就无法记住这个逻辑。
KT。

9
请注意,如果要将图形保存到文件中,则可能应存储返回的对象,即legend = ax.legend()和更高版本fig.savefig(bbox_extra_artists=(legend,))
coldfix

786

放置图例(bbox_to_anchor

通过使用loc参数将图例放置在轴的边界框内plt.legend
例如,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参数手动指定图例应放入的边框。可以限制自己只提供(x0,y0)bbox 的一部分。这将创建一个零跨度的框,图例将从该框沿loc参数给出的方向扩展。例如

plt.legend(bbox_to_anchor =(1.04,1),loc =“左上方”)

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

下面给出了进一步的示例,另外还显示了不同参数(例如mode和)之间的相互作用ncols

在此处输入图片说明

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

要如何解释4元组参数的详细信息bbox_to_anchor,如l4,可以在发现这个问题。的mode="expand"由4元组给出的边界框内水平方向扩展的图例。有关纵向扩展的图例,请参见此问题

有时,在图形坐标而不是轴坐标中指定边界框可能会很有用。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方法是将图例放置在其专用子图轴(lax)中。由于图例子图应该小于图,因此我们可以gridspec_kw={"width_ratios":[4,1]}在轴创建时使用它。我们可以隐藏轴,lax.axis("off")但仍然可以放置图例。图例的句柄和标签需要通过来从实际图获得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-图例与饼图重叠
  • loc参数可以使用数字而不是字符串,这会使调用更短,但是,它们之间并不是很直观地相互映射。这是供参考的映射:

在此处输入图片说明


将图例与专用子图轴协同效果非常好fig.tight_layout。如果要plt.subplots用于创建轴,则给它一个类似gridspec_kw={'height_ratios': [100, 1]}(或width_ratios)的东西,这样图例的轴就很小了……然后fig.tight_layout()将其扩展以适合。至少对于matplotlib 3.0.3。
travc

160

只需拨打legend()该电话后,plot()像这样的电话:

# matplotlib
plt.plot(...)
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))

# Pandas
df.myCol.plot().legend(loc='center left', bbox_to_anchor=(1, 0.5))

结果看起来像这样:

在此处输入图片说明


4
将相同的参数传递给matplotlib.pyplot.legend时也可以工作
kidmose

8
这会切断别人的传说中的文字吗?
user1717828

85

要将图例放置在绘图区域之外,请使用loc和的bbox_to_anchor关键字legend()。例如,以下代码将图例放置在绘图区域的右侧:

legend(loc="upper left", bbox_to_anchor=(1,1))

有关更多信息,请参见图例指南


10
好的-我喜欢实现,但是当我保存图形(无需在窗口中手动调整大小,我不想每次都做)时,图例就被砍掉了。关于如何解决该问题的任何想法?
astromax

@astromax我不确定,但也许尝试致电plt.tight_layout()
Christian Alis

81

简短的答案:您可以使用bbox_to_anchor+ bbox_extra_artists+ bbox_inches='tight'


更长的答案:bbox_to_anchor正如其他人在答案中指出的那样,您可以用来手动指定图例框的位置。

但是,通常的问题是图例框被裁剪,例如:

import matplotlib.pyplot as plt

# data 
all_x = [10,20,30]
all_y = [[1,3], [1.5,2.9],[3,2]]

# Plot
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(all_x, all_y)

# Add legend, title and axis labels
lgd = ax.legend( [ 'Lag ' + str(lag) for lag in all_x], loc='center right', bbox_to_anchor=(1.3, 0.5))
ax.set_title('Title')
ax.set_xlabel('x label')
ax.set_ylabel('y label')

fig.savefig('image_output.png', dpi=300, format='png')

在此处输入图片说明

为了防止图例框被裁剪,在保存图形时,可以使用参数bbox_extra_artistsbbox_inches要求savefig在保存的图像中包括裁剪的元素:

fig.savefig('image_output.png', bbox_extra_artists=(lgd,), bbox_inches='tight')

示例(我只更改了最后一行,向添加了2个参数fig.savefig()):

import matplotlib.pyplot as plt

# data 
all_x = [10,20,30]
all_y = [[1,3], [1.5,2.9],[3,2]]

# Plot
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(all_x, all_y)

# Add legend, title and axis labels
lgd = ax.legend( [ 'Lag ' + str(lag) for lag in all_x], loc='center right', bbox_to_anchor=(1.3, 0.5))
ax.set_title('Title')
ax.set_xlabel('x label')
ax.set_ylabel('y label')    

fig.savefig('image_output.png', dpi=300, format='png', bbox_extra_artists=(lgd,), bbox_inches='tight')

在此处输入图片说明

我希望matplotlib像Matlab一样本机地允许图例框位于外部位置:

figure
x = 0:.2:12;
plot(x,besselj(1,x),x,besselj(2,x),x,besselj(3,x));
hleg = legend('First','Second','Third',...
              'Location','NorthEastOutside')
% Make the text of the legend italic and color it brown
set(hleg,'FontAngle','italic','TextColor',[.3,.2,.1])

在此处输入图片说明


6
非常感谢!“ bbox_to_anchor”,“ bbox_extra_artist”和“ bbox_inches ='tight”参数正是我要使其正常运行所需要的。太棒了!
Demitrian 2014年

6
谢谢你,但实际上bbox_inches='tight'完美的作品对我来说,即使没有bbox_extra_artist
avtomaton

1
@avtomaton谢谢,很高兴知道,您使用的是哪个版本的matplotlib?
Franck Dernoncourt,2016年

1
@FranckDernoncourt python3,matplotlib版本1.5.3
avtomaton

68

除了此处所有出色的答案外,如果可能,较新版本的matplotlibpylab可以自动确定放置图例的位置而不会干扰绘图

pylab.legend(loc='best')

如果可能,这将自动使图例远离数据! 比较loc ='best'的使用

但是,如果没有地方放置图例而不重叠数据,那么您将要尝试其他答案之一。使用loc="best"绝不会将图例放在情节之外


2
感谢您指出这一点!几年前,我一直在寻找它,但没有找到它,这确实使我的生活更轻松。
Edgar H

4
这个选项是有帮助的,但是不能回答问题,所以我不满意。据我所知,最好永远不要把传说放在情节之外
Tommy

3
@Tommy:在OP的注释中(现在似乎已经消失了),明确阐明了OP希望图例不覆盖图形数据,他认为在情节之外是这样做的唯一方法。您可以在mefathy,Mateo Sanchez,Bastiaan和radtek的答案中看到这一点。该任择议定书要求X,但他想ÿ
dotancohen 2015年

1
其实并不是。他/她特别要求图例在情节之外。它以问题的名义;)“如何将图例从情节中剔除”。
durbachit '16

4
这不能保证图例不会掩盖数据。只是绘制一个非常密集的情节-没有放置传奇的地方。例如,尝试此操作...从numpy导入arange,sin,pi导入matplotlib.pyplot as plt t = arange(0.0,100.0,0.01)fig = plt.figure(1)ax1 = fig.add_subplot(211)ax1。 scatter(t,sin(2 * pi * t),label ='test')ax1.grid(True)#ax1.set_ylim((-2,2))ax1.set_ylabel('1 Hz')ax1.set_title( ax1.get_xticklabels()中标签的“一个正弦波或两个正弦波”:label.set_color('r')plt.legend(loc ='best')plt.show()
adam.r

56

简短答案:调用图例上的可拖动对象,并将其交互式移动到所需位置:

ax.legend().draggable()

长答案:如果您希望以交互/手动方式而不是通过编程方式放置图例,则可以切换图例的可拖动模式,以便将其拖到所需的位置。检查以下示例:

import matplotlib.pylab as plt
import numpy as np
#define the figure and get an axes instance
fig = plt.figure()
ax = fig.add_subplot(111)
#plot the data
x = np.arange(-5, 6)
ax.plot(x, x*x, label='y = x^2')
ax.plot(x, x*x*x, label='y = x^3')
ax.legend().draggable()
plt.show()

不确定我是否完全理解。如何将图例“拖动”到我想要的任何位置?我正在使用Python 3.6和Jupyter Notebook
sb2020

14

并非完全符合您的要求,但我发现它可以替代同一问题。使图例半透明,如下所示: 具有半透明图例和半透明文本框的matplotlib图

使用以下方法执行此操作:

fig = pylab.figure()
ax = fig.add_subplot(111)
ax.plot(x,y,label=label,color=color)
# Make the legend transparent:
ax.legend(loc=2,fontsize=10,fancybox=True).get_frame().set_alpha(0.5)
# Make a transparent text box
ax.text(0.02,0.02,yourstring, verticalalignment='bottom',
                     horizontalalignment='left',
                     fontsize=10,
                     bbox={'facecolor':'white', 'alpha':0.6, 'pad':10},
                     transform=self.ax.transAxes)

8

如前所述,您还可以将图例放置在图中,或者也可以略微移到边缘。这是一个使用IPython Notebook制作的Plotly Python API的示例。我在团队中。

首先,您需要安装必要的软件包:

import plotly
import math
import random
import numpy as np

然后,安装Plotly:

un='IPython.Demo'
k='1fw3zw2o13'
py = plotly.plotly(username=un, key=k)


def sin(x,n):
sine = 0
for i in range(n):
    sign = (-1)**i
    sine = sine + ((x**(2.0*i+1))/math.factorial(2*i+1))*sign
return sine

x = np.arange(-12,12,0.1)

anno = {
'text': '$\\sum_{k=0}^{\\infty} \\frac {(-1)^k x^{1+2k}}{(1 + 2k)!}$',
'x': 0.3, 'y': 0.6,'xref': "paper", 'yref': "paper",'showarrow': False,
'font':{'size':24}
}

l = {
'annotations': [anno], 
'title': 'Taylor series of sine',
'xaxis':{'ticks':'','linecolor':'white','showgrid':False,'zeroline':False},
'yaxis':{'ticks':'','linecolor':'white','showgrid':False,'zeroline':False},
'legend':{'font':{'size':16},'bordercolor':'white','bgcolor':'#fcfcfc'}
}

py.iplot([{'x':x, 'y':sin(x,1), 'line':{'color':'#e377c2'}, 'name':'$x\\\\$'},\
      {'x':x, 'y':sin(x,2), 'line':{'color':'#7f7f7f'},'name':'$ x-\\frac{x^3}{6}$'},\
      {'x':x, 'y':sin(x,3), 'line':{'color':'#bcbd22'},'name':'$ x-\\frac{x^3}{6}+\\frac{x^5}{120}$'},\
      {'x':x, 'y':sin(x,4), 'line':{'color':'#17becf'},'name':'$ x-\\frac{x^5}{120}$'}], layout=l)

这将创建您的图形,并使您有机会将图例保留在绘图中。如未设置,图例的默认设置是将其放置在绘图中,如下所示。

在此处输入图片说明

对于替代放置,可以使图形的边缘与图例的边界紧密对齐,并删除边界线以使其更紧密。

在此处输入图片说明

您可以使用代码或GUI移动图例和图形并重新设置其样式。要移动图例,您可以使用以下选项通过指定x和y值<= 1来将图例放置在图形中。例如:

  • {"x" : 0,"y" : 0} - 左下方
  • {"x" : 1, "y" : 0} -右下
  • {"x" : 1, "y" : 1} - 右上
  • {"x" : 0, "y" : 1} - 左上方
  • {"x" :.5, "y" : 0} -底部中心
  • {"x": .5, "y" : 1} -顶尖中心

在这种情况下,我们选择右上角的legendstyle = {"x" : 1, "y" : 1},也在文档中进行了描述

在此处输入图片说明


3

这些方针对我有用。从Joe的一些代码开始,此方法修改了窗口的宽度,以自动适应图右边的图例。

import matplotlib.pyplot as plt
import numpy as np

plt.ion()

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)

# Put a legend to the right of the current axis
leg = ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))

plt.draw()

# Get the ax dimensions.
box = ax.get_position()
xlocs = (box.x0,box.x1)
ylocs = (box.y0,box.y1)

# Get the figure size in inches and the dpi.
w, h = fig.get_size_inches()
dpi = fig.get_dpi()

# Get the legend size, calculate new window width and change the figure size.
legWidth = leg.get_window_extent().width
winWidthNew = w*dpi+legWidth
fig.set_size_inches(winWidthNew/dpi,h)

# Adjust the window size to fit the figure.
mgr = plt.get_current_fig_manager()
mgr.window.wm_geometry("%ix%i"%(winWidthNew,mgr.window.winfo_height()))

# Rescale the ax to keep its original size.
factor = w*dpi/winWidthNew
x0 = xlocs[0]*factor
x1 = xlocs[1]*factor
width = box.width*factor
ax.set_position([x0,ylocs[0],x1-x0,ylocs[1]-ylocs[0]])

plt.draw()

我发现这非常有用,并且对我有用。请注意,如果您位于wx后端(例如,使用Windows),则将mgr.window.wm_geometry(“%ix%i”%(winWidthNew,mgr.window.winfo_height()))替换为mgr.window.SetClientSizeWH(winWidthNew ,winHeightNew)之类的
Ezekiel Kruglick 2014年

如果您使用的Qt4Agg后端(这是我的Linux安装matplotlib的默认值),则更换线mgr.window.wm_geometry(...)mgr.window.setFixedWidth(winWidthNew)
Filip S.

而且,正如我刚刚发现的那样,如果您使用的是不显示任何窗口的后端,这意味着直接保存到文件(例如SVG和AGG后端),只需完全跳过窗口的大小调整即可。fig.set_size_inches(...)照顾您所需的调整大小。
Filip S.

3

值得刷新这个问题,因为较新版本的Matplotlib使得将图例放置在图外更加容易。我用Matplotlib版本制作了这个例子3.1.1

用户可以将2元组的坐标传递给loc参数,以将图例放置在边界框中的任何位置。唯一的难题是您需要运行plt.tight_layout()matplotlib来重新计算绘图尺寸,以便图例可见:

import matplotlib.pyplot as plt

plt.plot([0, 1], [0, 1], label="Label 1")
plt.plot([0, 1], [0, 2], label='Label 2')

plt.legend(loc=(1.05, 0.5))
plt.tight_layout()

这导致以下图:

与外面的传说密谋

参考文献:


2

您也可以尝试figlegend。可以创建独立于任何轴对象的图例。但是,您可能需要创建一些“虚拟”路径,以确保正确传递对象的格式。


1

这是来自matplotlib教程的示例,可在此处找到。这是更简单的示例之一,但是我为图例添加了透明度,并添加了plt.show(),因此您可以将其粘贴到交互式外壳中并获得结果:

import matplotlib.pyplot as plt
p1, = plt.plot([1, 2, 3])
p2, = plt.plot([3, 2, 1])
p3, = plt.plot([2, 3, 1])
plt.legend([p2, p1, p3], ["line 1", "line 2", "line 3"]).get_frame().set_alpha(0.5)
plt.show()

1

当我拥有传奇人物时,对我有用的解决方案是使用额外的空白图像布局。在下面的示例中,我制作了4行,在底部绘制了带有图例偏​​移(bbox_to_anchor)的图像,在顶部没有剪切。

f = plt.figure()
ax = f.add_subplot(414)
lgd = ax.legend(loc='upper left', bbox_to_anchor=(0, 4), mode="expand", borderaxespad=0.3)
ax.autoscale_view()
plt.savefig(fig_name, format='svg', dpi=1200, bbox_extra_artists=(lgd,), bbox_inches='tight')

1

这是另一种解决方案,类似于添加bbox_extra_artistsbbox_inches,您不必在savefig通话范围内增加额外的演出者。我想出了这个,因为我在函数中生成了大部分图。

无需将所有添加内容添加到边框中,就可以提前将其添加到Figure的艺术家中。使用类似于弗朗克·德农库尔(Franck Dernoncourt)的上述答案

import matplotlib.pyplot as plt

# data 
all_x = [10,20,30]
all_y = [[1,3], [1.5,2.9],[3,2]]

# plotting function
def gen_plot(x, y):
    fig = plt.figure(1)
    ax = fig.add_subplot(111)
    ax.plot(all_x, all_y)
    lgd = ax.legend( [ "Lag " + str(lag) for lag in all_x], loc="center right", bbox_to_anchor=(1.3, 0.5))
    fig.artists.append(lgd) # Here's the change
    ax.set_title("Title")
    ax.set_xlabel("x label")
    ax.set_ylabel("y label")
    return fig

# plotting
fig = gen_plot(all_x, all_y)

# No need for `bbox_extra_artists`
fig.savefig("image_output.png", dpi=300, format="png", bbox_inches="tight")

这是生成的图。


-1

不知道您是否已经解决了问题……可能是的,但是……我只是使用字符串“ outside”作为位置,例如在matlab中。我从matplotlib导入pylab。请参见以下代码:

from matplotlib as plt
from matplotlib.font_manager import FontProperties
...
...
t = A[:,0]
sensors = A[:,index_lst]

for i in range(sensors.shape[1]):
    plt.plot(t,sensors[:,i])

plt.xlabel('s')
plt.ylabel('°C')
lgd = plt.legend(b,loc='center left', bbox_to_anchor=(1, 0.5),fancybox = True, shadow = True)

点击查看剧情

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.