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()
如何在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()