我有一系列20幅图(不是子图)要在一个图中绘制。我希望图例在框外。同时,我不想改变轴,因为图形的大小会变小。

我希望图例框位于绘图区域之外(我希望图例位于绘图区域的右侧)。有没有办法减小图例框内文本的字体大小,使图例框的大小变小?


当前回答

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

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

有关详细信息,请参阅图例指南

其他回答

除了这里的所有优秀答案之外,如果可能的话,matplotlib和pylab的更新版本可以自动确定将图例放置在何处,而不干扰绘图。

pylab.legend(loc='best')

如果可能,这将自动将图例远离数据!

然而,如果没有任何地方可以在不重叠数据的情况下放置图例,那么您需要尝试其他答案之一;使用loc=“best”永远不会将图例置于情节之外。

更新版本的Matplotlib使图例更容易定位在绘图之外。我使用Matplotlib版本3.1.1生成了这个示例。

用户可以向loc参数传递2元组坐标,以将图例定位在边界框中的任何位置。唯一的问题是,您需要运行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()

这导致以下绘图:

参考文献:

matplotlib.pyplot.legend

我只使用字符串“左中”作为位置,就像在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(loc='center left', bbox_to_anchor=(1, 0.5), fancybox = True, shadow = True)

通过指定FontProperties的set_size,可以使图例文本变小。资源:图例指南matplotlib.legendmatplotlib.pyplot.legend字体管理器set_size(自身,大小)有效字体大小为xx小、x小、小、中、大、x大、xx大、大、小和无。Real Python:使用Matplotlib绘制Python(指南)

import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

fontP = FontProperties()
fontP.set_size('xx-small')

p1, = plt.plot([1, 2, 3], label='Line 1')
p2, = plt.plot([3, 2, 1], label='Line 2')
plt.legend(handles=[p1, p2], title='title', bbox_to_anchor=(1.05, 1), loc='upper left', prop=fontP)

fontsize='xx-small'也可以工作,无需导入FontProperties。

plt.legend(handles=[p1, p2], title='title', bbox_to_anchor=(1.05, 1), loc='upper left', fontsize='xx-small')

这不完全是你所要求的,但我发现这是解决同样问题的一个替代方案。

使图例半透明,如下所示:

使用以下工具执行此操作:

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)