Python: 创建一个跨越两个子图的图例

21 浏览
0 Comments

Python: 创建一个跨越两个子图的图例

我想要的基本设计是将两个散点图并排放置在一起,然后在它们下方创建一个跨越两个子图的图例。这是一个粗略的草图:

[图片链接]

我能够轻松制作这些图,但是我很难让图例按照我想要的方式显示。以下是我制作这两个散点图的代码示例(我有更多的数据点,但为了节省空间,我只包含了几个):

[代码示例]

如何以与上图相同的方式显示图例?

0
0 Comments

Python: Making one legend that spans two subplots

问题的出现原因:

想要在两个子图中创建一个跨越两个子图的图例,但是不知道如何实现。

解决方法:

可以使用matplotlib中的figlegend函数来创建跨越两个子图的图例。

具体代码如下:

figlegend( (line1, line2, line3), ('label1', 'label2', 'label3'), 'upper right' )

同时,还可以参考stackoverflow上的一个问题的答案来了解如何定位和对齐matplotlib图例的方法。

具体链接如下:

How to position and align a matplotlib figure legend?

0
0 Comments

在这个问题中,主要是想要在两个子图中创建一个跨越两个子图的图例。首先,我们需要获取每个子图中图例的标签和句柄。然后,我们需要调整子图的大小,以便为图例留出空间。最后,我们使用获取到的标签和句柄创建图例,并将其放置在合适的位置。

解决方法如下:

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

通过以上步骤,我们可以在两个子图中创建一个跨越两个子图的图例。这样可以使得图例更加清晰,更好地说明图中的数据。

0