Python: 创建一个跨越两个子图的图例
Python: Making one legend that spans two subplots
问题的出现原因:
想要在两个子图中创建一个跨越两个子图的图例,但是不知道如何实现。
解决方法:
可以使用matplotlib中的figlegend函数来创建跨越两个子图的图例。
具体代码如下:
figlegend( (line1, line2, line3), ('label1', 'label2', 'label3'), 'upper right' )
同时,还可以参考stackoverflow上的一个问题的答案来了解如何定位和对齐matplotlib图例的方法。
具体链接如下:
在这个问题中,主要是想要在两个子图中创建一个跨越两个子图的图例。首先,我们需要获取每个子图中图例的标签和句柄。然后,我们需要调整子图的大小,以便为图例留出空间。最后,我们使用获取到的标签和句柄创建图例,并将其放置在合适的位置。
解决方法如下:
1. 首先,我们需要获取每个子图的图例标签和句柄。通过以下代码获取:
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
2. 接下来,我们需要调整子图的位置,以便为图例留出空间。使用以下代码来调整子图的位置:
box = ax1.get_position()
ax1.set_position([box.x0, box.y0 + box.height * 0.1,
box.width, box.height * 0.9])
box = ax2.get_position()
ax2.set_position([box.x0, box.y0 + box.height * 0.1,
box.width, box.height * 0.9])
3. 最后,我们使用获取到的标签和句柄创建图例,并将其放置在合适的位置。使用以下代码创建图例:
ax1.legend(h1+h2, l1+l2, bbox_to_anchor=(0,-.05, 2.2,-0.15), loc=9,ncol=4)
以上是解决这个问题的方法,通过这些步骤我们可以在两个子图中创建一个跨越两个子图的图例。以下是完整的代码示例:
import matplotlib.pyplot as plt
plt.style.use('ggplot')
x = [5,10,20,30]
med1 = [9.35,15.525,26.1,48.275]
med2 = [8.75,14.025,23.95,41.025]
iqr1 = [13.5125,19.95,38.175,69.9]
iqr2 = [12.05,19.075,35.075,62.875]
ax1 = plt.subplot(121)
plt.scatter(x, med1, marker='^',color='black', alpha=0.5, label='Triangle!')
plt.scatter(x, med2, color='blue', alpha=0.5, label='Blue Dot')
plt.xlim([0,35])
plt.ylim([0,75])
plt.xlabel('Channel Area')
plt.ylabel('Median')
ax2 = plt.subplot(122)
plt.scatter(x, iqr1, color='red', alpha=0.5, label='Red Dot')
plt.scatter(x, iqr2, marker='D',color='blue', alpha=0.5, label = 'Diamonds')
plt.xlim([0,35])
plt.ylim([0,75])
plt.xlabel('Channel Area')
plt.ylabel('IQR')
plt.tight_layout()
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
box = ax1.get_position()
ax1.set_position([box.x0, box.y0 + box.height * 0.1,
box.width, box.height * 0.9])
box = ax2.get_position()
ax2.set_position([box.x0, box.y0 + box.height * 0.1,
box.width, box.height * 0.9])
ax1.legend(h1+h2, l1+l2, bbox_to_anchor=(0,-.05, 2.2,-0.15), loc=9,
ncol=4)
plt.show()
通过以上步骤,我们可以在两个子图中创建一个跨越两个子图的图例。这样可以使得图例更加清晰,更好地说明图中的数据。