python - 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()
解决方案
正如@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()
推荐阅读
- react-native - onNavigationStateChange 不适用于我在 Angular 中的 WebView URL
- c++ - 在函数中分配指向数组的指针
- java - Raspberry Pi 零 W 上的 JavaFX:慢速过渡效果(低 fps)
- xamarin - 触发 OnConfigurationChanged 时不触发 OnClick 事件
- hyperledger - 如何在超级账本锯齿中启动多个验证器?
- java - 日期和时区转换
- tensorflow - 在 TensorFlow 中使用 CIFAR-10 数据集训练 VGG16,无法获得良好的准确度
- python - 有人可以给我使用reportlab生成带有页眉(添加图像)、页脚(Y页X)和带有书签的目录的PDF报告吗?
- wcf - ws2007FederationHttpBinding 和 Windows 身份验证的 WCF 服务器配置
- c++ - 具有私有左右子树的镜像二叉树