gpt4 book ai didi

python - 如何在 Seaborn 图例中组合色调和样式组?

转载 作者:行者123 更新时间:2023-12-05 03:39:23 24 4
gpt4 key购买 nike

我正在为纵向数据绘制 Seaborn 线图,该数据使用 hue 按“Subscale”分组,使用 style 按“Item”分组。

这是我的代码(我希望即使没有数据也能理解):

ax = sns.lineplot(data = df, x = 'Week', y = 'Value', style = 'Item', hue = 'Subscale', palette = 'colorblind', markers = True)
plt.legend(bbox_to_anchor = (1.03, 1.02), fontsize = 10)

这让我想到了这个情节: enter image description here

我想要的是合并子图例,这样它只显示“Item”的图例,但项目根据“Subscale”着色,有点像这样: enter image description here

我没能创建这个,所以如果你们中的任何人能提供帮助,我将不胜感激!谢谢:)

最佳答案

如果我没理解错的话,某种类型的所有项目都具有相同的分量表。因此,您已经拥有(或可以创建)一个将项目类型映射到相应子量表的字典。

Seaborn 为图例创建以下标签:

  • 副标题的'Subscale'
  • 每个分量表
  • 第二副标题为“项目”
  • 每一项

每个标签都对应一个“句柄”,用于标识标记的外观。

以下代码:

  • 找到 'Item' 的索引,以便能够拆分标签和句柄数组
  • 提取“子尺度”的颜色
  • 将这些颜色应用于项目标记
  • 只使用图例的项目
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

# first create some random data similar to the description
np.random.seed(123)
items = ['01', '04', '05', '06', '07', '10', '11', '13']
N = len(items)
subscale_dict = {'01': 'A', '04': 'C', '05': 'C', '06': 'C', '07': 'A', '10': 'B', '11': 'B', '13': 'A'}

df = pd.DataFrame({'Week': np.tile(np.arange(7), N),
'Value': np.random.rand(7 * N),
'Item': np.repeat(items, 7)})
df['Subscale'] = df['Item'].apply(lambda i: subscale_dict[i])
df['Subscale'] = pd.Categorical(df['Subscale']) # creates a fixed order

# create the line plot as before
ax = sns.lineplot(data=df, x='Week', y='Value', style='Item', hue='Subscale', palette='colorblind', markers=True)

# create a dictionary mapping the subscales to their color
handles, labels = ax.get_legend_handles_labels()
index_item_title = labels.index('Item')
color_dict = {label: handle.get_color()
for handle, label in zip(handles[1:index_item_title], labels[1:index_item_title])}

# loop through the items, assign color via the subscale of the item idem
for handle, label in zip(handles[index_item_title + 1:], labels[index_item_title + 1:]):
handle.set_color(color_dict[subscale_dict[ label]])

# create a legend only using the items
ax.legend(handles[index_item_title + 1:], labels[index_item_title + 1:], title='Item',
bbox_to_anchor=(1.03, 1.02), fontsize=10)

plt.tight_layout()
plt.show()

sns.lineplot with custom legend

关于python - 如何在 Seaborn 图例中组合色调和样式组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68591271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com