如何叠加Seaborn relplot并匹配分组颜色?附示例代码
解决relplot叠加与颜色匹配问题
你需要的是把多个散点绘制在同一个坐标轴上,而不是生成多个独立的relplot(因为relplot会创建新的FacetGrid对象,无法直接叠加)。同时要保证ground点的颜色和分组颜色一致,我们可以通过以下步骤实现:
核心思路
- 使用
matplotlib的单轴对象承载所有散点,替代多次调用relplot - 利用seaborn自动分配的调色板,提取分组A/B对应的颜色,用于绘制ground点
- 用
scatterplot(relplot的底层函数)在同一轴上依次绘制所有元素
完整代码实现
from io import StringIO import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt data1 = """index x y group ground_x_A ground_y_A ground_x_B ground_y_B 0 27 26 A 20 15 40 45 1 26 27 A 20 15 40 45 2 28 22 A 20 15 40 45 3 25 24 A 20 15 40 45 4 29 31 A 20 15 40 45 5 46 29 B 20 15 40 45 6 39 37 B 20 15 40 45 7 38 41 B 20 15 40 45 8 44 46 B 20 15 40 45 9 46 38 B 20 15 40 45 10 37 33 B 20 15 40 45""" df = pd.read_csv(StringIO(data1), index_col=[0], sep=" ", skipinitialspace=True) sns.set_style("whitegrid") # 创建画布和轴对象 fig, ax = plt.subplots(figsize=(8,6)) # 第一步:绘制主数据点,获取分组颜色 sns.scatterplot(data=df, x='x', y='y', hue='group', s=25, ax=ax) # 获取分组对应的颜色:seaborn会按group的唯一值顺序分配颜色 # 这里group的唯一值是['A','B'],所以调色板的第一个颜色对应A,第二个对应B palette = sns.color_palette() color_A = palette[0] color_B = palette[1] # 第二步:绘制ground_A的点,用A的颜色,放大并改用不同标记区分 sns.scatterplot(data=df, x='ground_x_A', y='ground_y_A', s=100, color=color_A, marker='X', label='Ground A', ax=ax) # 第三步:绘制ground_B的点,用B的颜色,同样放大并标记区分 sns.scatterplot(data=df, x='ground_x_B', y='ground_y_B', s=100, color=color_B, marker='X', label='Ground B', ax=ax) # 调整图例位置和标题 ax.legend(title='Category', bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
代码细节说明
- 我们直接创建
matplotlib的ax轴对象,所有绘图都在这个轴上完成,实现叠加效果 - 通过
sns.color_palette()获取当前样式下的调色板,由于group的唯一值是A、B,所以第一个颜色对应A,第二个对应B(如果你的group顺序不同,可以通过df['group'].unique()确认顺序) - 给ground点使用不同的标记(比如
'X'),可以和主数据的圆形点区分开,同时保持颜色一致 - 最后调整图例位置,避免遮挡数据
这样就能得到一个合并后的图,所有元素颜色匹配,而且在同一个画布中展示。
内容的提问来源于stack exchange,提问作者Ivo
相关产品推荐
相关产品推荐

