Matplotlib图例放在图形外部
参考:matplotlib legend outside figure
在Matplotlib中,图例是一个显示关于每个绘图元素的标签,通常放在图形内部。但是有时候,我们希望将图例放在图形的外部,使得图形更清晰。在本文中,我们将介绍如何使用Matplotlib将图例放在图形外部。
创建一个简单的图形并将图例放在图形外部
首先,让我们创建一个简单的散点图,并将图例放在图形外部。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.scatter(x, y, label='data points')
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1))
plt.show()
Output:
在上面的示例代码中,我们使用plt.scatter
创建了一个散点图,并使用plt.legend
将图例放在图形的右上角外部(loc='upper right'
指定了位置,bbox_to_anchor=(1.2, 1)
指定了图例的具体位置)。
设置图例的外部边框
有时候,我们希望给图例设置一个外部边框。下面的示例代码演示了如何给图例添加一个外部边框。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.scatter(x, y, label='data points')
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1), frameon=True)
plt.show()
Output:
上面的示例代码中,我们在plt.legend
中传入frameon=True
参数来显示图例的边框。
使用ncol参数设置图例的列数
如果图例中包含多个标签,可以使用ncol
参数来设置图例的列数。下面的示例代码演示了如何使用ncol
参数设置图例的列数为2。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]
plt.scatter(x, y1, label='data points 1')
plt.scatter(x, y2, label='data points 2')
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1), ncol=2)
plt.show()
Output:
在上面的示例代码中,我们使用ncol=2
参数将图例分成两列。
调整图例的大小
有时候,我们希望调整图例的大小,使得图例更易于阅读。下面的示例代码演示了如何使用fontsize
参数设置图例的字体大小为12。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.scatter(x, y, label='data points')
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1), fontsize=12)
plt.show()
Output:
在上面的示例代码中,我们在plt.legend
中传入fontsize=12
参数设置图例的字体大小为12。
水平放置图例
有时候,我们希望将图例水平放置在图形的底部。下面的示例代码演示了如何使用mode
参数将图例水平放置在底部。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.scatter(x, y, label='data points')
plt.legend(loc='lower center', bbox_to_anchor=(0.5, -0.2), mode='expand')
plt.show()
Output:
在上面的示例代码中,我们在plt.legend
中传入loc='lower center'
参数将图例放在底部居中,bbox_to_anchor=(0.5, -0.2)
指定了图例的位置,mode='expand'
将图例水平放置在底部。
给图例添加阴影
有时候,我们希望给图例添加一些装饰效果,如阴影。下面的示例代码演示了如何给图例添加阴影。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.scatter(x, y, label='data points')
legend = plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1))
legend.get_frame().set_linewidth(2)
legend.get_frame().set_edgecolor('black')
plt.show()
Output:
在上面的示例代码中,我们使用legend.get_frame().set_linewidth(2)
和legend.get_frame().set_edgecolor('black')
给图例添加了边框和阴影效果。
调整图例的间距
有时候,我们希望调整图例的间距,使得图例更美观。下面的示例代码演示了如何使用columnspacing
参数设置图例的列间距为0.8。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]
plt.scatter(x, y1, label='data points 1')
plt.scatter(x, y2, label='data points 2')
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1), columnspacing=0.8)
plt.show()
Output:
在上面的示例代码中,我们在plt.legend
中传入columnspacing=0.8
参数设置图例的列间距为0.8。
调整图例的边距
有时候,我们希望调整图例的边距,使得图例更美观。下面的示例代码演示了如何使用borderaxespad
参数设置图例距离坐标轴的边距为0.5。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.scatter(x, y, label='data points')
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1), borderaxespad=0.5)
plt.show()
Output:
在上面的示例代码中,我们在plt.legend
中传入borderaxespad=0.5
参数设置图例距离坐标轴的边距为0.5。
自定义图例的形状和大小
有时候,我们希望自定义图例的形状和大小,使得图例更加个性化。下面的示例代码演示了如何使用`handler_map参数设置图例的handler_map。
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.scatter(x, y, label='data points')
circle_patch = mpatches.Circle((0.5, 0.5), 0.1, edgecolor='black', facecolor='red')
plt.legend(handles=[circle_patch], handler_map={mpatches.Circle: plt.Line2D([0], [0], color='black', lw=2)})
plt.show()
在上面的示例代码中,我们使用mpatches.Circle
创建一个圆形图例,并通过handler_map
参数设置图例的handler_map
。
在多个子图中放置图例
有时候,我们希望在多个子图中放置一个共同的图例,使得图表更清晰。下面的示例代码演示了如何在多个子图中放置一个共同的图例。
import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, 2)
for i, ax in enumerate(axs.flat, start=1):
x = [1, 2, 3, 4, 5]
y = [2*i, 4*i, 6*i, 8*i, 10*i]
ax.scatter(x, y, label=f'data points {i}')
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1), ncol=2)
plt.show()
Output:
在上面的示例代码中,我们创建了一个包含4个子图的画布,并在每个子图中放置了不同的散点图。然后我们使用plt.legend
在整个画布中放置一个共同的图例。
将图例放置在子图的外部
有时候,我们希望将图例放置在子图的外部,使得子图更加清晰。下面的示例代码演示了如何在子图的外部放置一个共同的图例。
import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, 2)
for i, ax in enumerate(axs.flat, start=1):
x = [1, 2, 3, 4, 5]
y = [2*i, 4*i, 6*i, 8*i, 10*i]
ax.scatter(x, y, label=f'data points {i}')
ax.legend(loc='upper right', bbox_to_anchor=(1.2, 1))
plt.show()
Output:
在上面的示例代码中,我们在每个子图中使用ax.legend
将图例放置在子图的外部。