You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Seaborn实现基于分组与重复实验的双维度色调设置

Hey there! Let's tackle your visualization problem step by step. I'll walk you through both requested solutions and address your custom palette question clearly.


Solution 1: Group-specific color palettes (Figure B style)

Your goal here is to assign distinct color families to each group, with different replicates within the same group using varying shades of that family. Seaborn doesn't natively accept nested palettes like your my_palette dictionary, so we'll first convert it into a flat mapping for each (group, replicate) pair.

Here's the code implementation:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

# Define your base group palettes
gray = sns.dark_palette("gray", n_colors=5)
red = sns.dark_palette("red", n_colors=5)
blue = sns.dark_palette("blue", n_colors=5)
my_palette = {"GROUP_A": gray, "GROUP_B": red, "GROUP_C": blue}

# Create a flat color map for every (group, replicate) combination
full_color_map = {}
for group, color_shades in my_palette.items():
    # Get unique replicates for the current group
    group_replicates = data[data["group"] == group]["replicate"].unique()
    # Map each replicate to a shade from the group's palette
    for rep, shade in zip(group_replicates, color_shades[:len(group_replicates)]):
        full_color_map[f"{group}_{rep}"] = shade

# Add a combined group-replicate column to both DataFrames
data["group_rep"] = data["group"] + "_" + data["replicate"].astype(str)
avgs["group_rep"] = avgs["group"] + "_" + avgs["replicate"].astype(str)

# Plotting
plt.figure(figsize=(10, 6))
# Plot single-cell data with group-specific replicate shades
sns.swarmplot(x="group", y="value", data=data, hue="group_rep", palette=full_color_map)
# Plot average data with larger, outlined points using the same palette
sns.swarmplot(x="group", y="value", data=avgs, size=8, hue="group_rep", 
              palette=full_color_map, edgecolor="k", linewidth=2)

# Clean up the legend (optional: group replicates by their parent group)
handles, labels = plt.gca().get_legend_handles_labels()
sorted_handles = []
sorted_labels = []
for group in my_palette.keys():
    for label in labels:
        if group in label:
            idx = labels.index(label)
            sorted_handles.append(handles[idx])
            sorted_labels.append(label)
plt.legend(handles=sorted_handles, labels=sorted_labels, title="Group + Replicate")
plt.show()

Solution 2: Gray single-cell points with colored averages (Figure C style)

For this approach, we'll render all single-cell data in gray, then use your group-specific palettes only for the average replicate points.

Here's the code:

import matplotlib.pyplot as plt
import seaborn as sns

# Reuse your custom group palettes
gray = sns.dark_palette("gray", n_colors=5)
red = sns.dark_palette("red", n_colors=5)
blue = sns.dark_palette("blue", n_colors=5)
my_palette = {"GROUP_A": gray, "GROUP_B": red, "GROUP_C": blue}

# Create color map for average replicates
avg_color_map = {}
for group, color_shades in my_palette.items():
    group_replicates = avgs[avgs["group"] == group]["replicate"].unique()
    for rep, shade in zip(group_replicates, color_shades[:len(group_replicates)]):
        avg_color_map[f"{group}_{rep}"] = shade

# Add combined group-replicate column to averages DataFrame
avgs["group_rep"] = avgs["group"] + "_" + avgs["replicate"].astype(str)

# Plotting
plt.figure(figsize=(10, 6))
# Plot single-cell data in solid gray (alpha adds subtle transparency)
sns.swarmplot(x="group", y="value", data=data, color="#888888", alpha=0.7)
# Plot average points with group-specific replicate shades
sns.swarmplot(x="group", y="value", data=avgs, size=8, hue="group_rep", 
              palette=avg_color_map, edgecolor="k", linewidth=2)

# Keep only the average points in the legend
plt.legend(title="Group + Replicate")
plt.show()

Can I pass my nested my_palette dictionary directly to Seaborn/Matplotlib?

Short answer: No. Seaborn's palette parameter expects either:

  • A list of colors (for sequential hue values)
  • A flat dictionary mapping individual hue values (like single strings) to specific colors

Your nested dictionary maps groups to lists of shades, which Seaborn can't parse automatically. That's why we converted it to a flat map of group_rep strings to colors in both solutions above.


内容的提问来源于stack exchange,提问作者Luke Skywalker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 13:57:51