我有一个系列的 20 个图(不是子图)要在一个数字中制作。我希望传奇是开箱即用的。同时,我不想改变轴,因为图形的大小会减小。
网友回答:
bbox_to_anchor
)图例位于轴的边界框内,参数为 。
例如,将图例放在边界框的右上角,默认情况下,边界框的范围从 to 到轴坐标(或边界框表示法)。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
参数手动指定应在其中放置图例的边界框。一个人可以限制自己只提供bbox的一部分。这将创建一个零跨度框,图例将沿参数给出的方向扩展。例如,(x0, y0)
loc
plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left")
将图例放置在轴外部,以使图例的左上角位于轴坐标中的位置。(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 元组参数解释为 ,如 中所述的详细信息,请参阅此问题。在 4 元组给出的边界框内水平扩展图例。有关垂直展开的图例,请参阅此问题。bbox_to_anchor
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 版本 2.1 或更高版本特别有用。matplotlib.figure.Figure.legend
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
loc
网友回答:
有很多方法可以做你想做的事。为了补充Christian Alis和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()
或者,缩小当前图的宽度,并将图例完全放在图形的轴之外(注意:如果使用 ,则省略:tight_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()
网友回答:
只需在通话后像这样打电话: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))
结果将如下所示:
模板简介:该模板名称为【将图例框保留在绘图区域之外,使图例框的大小变小?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。