Python matplotlib 设置网格规范图例的背景矩形大小

Python matplotlib set background rectangluar size of legend for grid spec

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


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

有什么办法可以实现吗?

Current output Wanted output

重现所示示例的代码:

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

如@JohanC 和@tmdavision 的评论中所述,可以将 bbox_to_anchor=(x0, y0, width, height)mode='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()