将seaborn legend分成两个不同的盒子

xAp*_*ple 2 python matplotlib legend seaborn

我使用 Seaborn 生成多种类型的图表,但这里仅使用一个简单的示例来基于所包含的数据集进行说明:

import seaborn
tips = seaborn.load_dataset("tips")
axes = seaborn.scatterplot(x="day", y="tip", size="sex", hue="time", data=tips)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此结果中,单个图例框包含两个标题“时间”和“性别”,每个标题都有子元素。

我如何轻松地将图例分成两个框,每个框都有一个标题?即,一个用于指示颜色代码的图例框(可以放置在左侧),一个用于指示尺寸代码的图例框(可以放置在右侧)。

Diz*_*ahi 9

以下代码效果很好,因为时间类别与性别类别的数量相同。如果不一定是这种情况,则必须计算每个“标签”需要多少行图例

fig = plt.figure()
tips = seaborn.load_dataset("tips")
axes = seaborn.scatterplot(x="day", y="tip", size="sex", hue="time", data=tips)
h,l = axes.get_legend_handles_labels()
l1 = axes.legend(h[:int(len(h)/2)],l[:int(len(l)/2)], loc='upper left')
l2 = axes.legend(h[int(len(h)/2):],l[int(len(l)/2):], loc='upper right')
axes.add_artist(l1) # we need this because the 2nd call to legend() erases the first
Run Code Online (Sandbox Code Playgroud)

输出图