首页 > 解决方案 > Python matplotlib为网格规范设置图例的背景矩形大小

问题描述

如何在 matplotlib 中设置图例的背景框大小?


考虑pythons matplotlib中的左图行对齐(代码贴在最后)。图例已移至右侧,否则它涵盖了基本数据。它们垂直对齐。但我觉得传说中不同的水平宽度有点前卫。因此,我想将它们更改为都具有相同的背景框,如右图所示。

有没有办法做到这一点?

电流输出 想要的输出
图表的行对齐 所需的图例对齐

重现所示示例的代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

loc = "center left"
x = np.linspace(-2 * np.pi, 2 * np.pi, 100)

fig = plt.figure(figsize=(5, 5), constrained_layout=True)
gs = GridSpec(3, 1, figure=fig)

ax = fig.add_subplot(gs[0,:])
ax.plot(x, np.tan(x), label=r"$\tan(x) = \frac{\sin(x)}{\cos(x)}$")
ax.plot(x, np.tan(2*x), label=r"$\tan(2x)$")
ax.plot(x, np.tan(3*x), label=r"$\tan(3x)$")
ax.legend(loc=loc, bbox_to_anchor=(1.02, 0.5))

ax = fig.add_subplot(gs[1,:])
ax.plot(x, np.sin(x), label=r"$\sin(x)$")
ax.plot(x, np.sin(2*x), label=r"$\sin(2x)$")
ax.plot(x, np.sin(4*x), label=r"$\sin(4x)$")
ax.legend(loc=loc, bbox_to_anchor=(1.02, 0.5))

ax = fig.add_subplot(gs[2,:])
ax.plot(x, np.sin(x) * np.cos(x), label=r"$\sin(x) \times \cos(x)$")
ax.plot(x, np.sin(2*x) * np.cos(2*x), label=r"$\sin(2x) \times \cos(2x)$")
ax.plot(x, np.sin(3*x) * np.cos(3*x), label=r"$\sin(3x) \times \cos(3x)$")
ax.legend(loc=loc, bbox_to_anchor=(1.02, 0.5))

plt.show()

标签: pythonmatplotlibalignmentlegend

解决方案


正如@JohanC 和@tmdavision 的评论中所提到的,可以使用bbox_to_anchor=(x0, y0, width, height)withmode='expand'来创建所需的输出。以下代码显示了修改。

请注意,有必要更改网格规格,因为否则它不会正确调整大小。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

loc = "center left"
x = np.linspace(-2 * np.pi, 2 * np.pi, 100)

fig = plt.figure(figsize=(5, 5), constrained_layout=True)
gs = GridSpec(3, 5, figure=fig)

ax = fig.add_subplot(gs[0,:3])
ax.plot(x, np.tan(x), label=r"$\tan(x) = \frac{\sin(x)}{\cos(x)}$")
ax.plot(x, np.tan(2*x), label=r"$\tan(2x)$")
ax.plot(x, np.tan(3*x), label=r"$\tan(3x)$")
ax.legend(loc=loc, bbox_to_anchor=(1.02, 0.5, 0.7, 0.1), mode="expand")

ax = fig.add_subplot(gs[1,:3])
ax.plot(x, np.sin(x), label=r"$\sin(x)$")
ax.plot(x, np.sin(2*x), label=r"$\sin(2x)$")
ax.plot(x, np.sin(4*x), label=r"$\sin(4x)$")
ax.legend(loc=loc, bbox_to_anchor=(1.02, 0.5, 0.7, 0.1), mode="expand")

ax = fig.add_subplot(gs[2,:3])
ax.plot(x, np.sin(x) * np.cos(x), label=r"$\sin(x) \times \cos(x)$")
ax.plot(x, np.sin(2*x) * np.cos(2*x), label=r"$\sin(2x) \times \cos(2x)$")
ax.plot(x, np.sin(3*x) * np.cos(3*x), label=r"$\sin(3x) \times \cos(3x)$")
ax.legend(loc=loc, bbox_to_anchor=(1.02, 0.5, 0.7, 0.1), mode="expand")

plt.show()

推荐阅读