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

如何按自定义规则设置Seaborn散点图标记的颜色与大小

散点图数据点颜色与大小自定义问题解决思路

问题背景

需要为散点图中每个数据点按以下规则设置颜色和大小:

  • 颜色:Fracture <25 为绿色,25≤Fracture<50 为黄色,Fracture≥50 为橙色
  • 大小:每个颜色区间内,Fracture 值越小,标记越大;最小大小为10,最大为200

原代码存在数据对应错位、大小设置方式不符合seaborn规范的问题,导致大小规则未正确生效。

原代码问题分析

  1. 数据对应关系错误:Y = df2['Force'].sort_values() 和 wp 列表未同步排序,导致散点的位置与颜色、大小不匹配
  2. 大小设置方式不当:直接修改ax.collections[0].set_sizes(),seaborn的set_sizes()接收的是缩放比例而非绝对像素大小,容易出现偏差
  3. 逻辑冗余:手动遍历计算颜色和大小,易出现索引错误,代码可维护性差

修正方案与代码

import seaborn as sns
import matplotlib.pyplot as plt 
import pandas as pd 
import numpy as np 
%matplotlib inline 

# 1. 合并数据并按Force排序,保留所有关联信息
df1 = pd.DataFrame({'SN':['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7'], 
                    'Fracture': [6, 90, 35, 60, 48, 22, 6]})
df2 = pd.DataFrame({'SN':['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7'], 
                    'Force': [200, 140, 170, 150, 160, 210, 190]})
df_merged = pd.merge(df1, df2, on='SN')
# 按Force排序并重置索引,确保后续数据一一对应
df_sorted = df_merged.sort_values(by='Force').reset_index(drop=True)

# 2. 定义颜色规则,生成颜色列
def assign_color(fracture_val):
    if fracture_val < 25:
        return 'g'
    elif fracture_val < 50:
        return 'yellow'
    else:
        return 'orange'
df_sorted['point_color'] = df_sorted['Fracture'].apply(assign_color)

# 3. 定义大小规则,生成大小列
def assign_size(fracture_val, color):
    # 每个区间内计算比例,值越小比例越接近1,对应更大的点
    if color == 'g':
        ratio = 1 - (fracture_val / 25) * 0.99
    elif color == 'yellow':
        ratio = 1 - (fracture_val / 50) * 0.99
    else:
        ratio = 1 - (fracture_val / 100) * 0.99
    # 限制最小比例为0.05,对应最小大小10,最大比例1对应200
    return max(ratio, 0.05) * 200
df_sorted['point_size'] = df_sorted.apply(lambda row: assign_size(row['Fracture'], row['point_color']), axis=1)

# 4. 映射wp值到排序后的数据集,确保位置与其他属性匹配
wp_mapping = {'A1':0.1, 'A2':0.25, 'A3':0.35, 'A4':0.45, 'A5':0.55, 'A6':0.72, 'A7':0.9}
df_sorted['wp'] = df_sorted['SN'].map(wp_mapping)

# 5. 使用seaborn原生参数绘制散点图
fig, ax = plt.subplots() 
# 直接传入颜色和大小参数,sizes指定最小/最大尺寸范围
sns.scatterplot(
    data=df_sorted,
    x='Force',
    y='wp',
    color=df_sorted['point_color'],
    size=df_sorted['point_size'],
    sizes=(df_sorted['point_size'].min(), df_sorted['point_size'].max())
)

# 可选:移除自动生成的大小图例(如果不需要)
ax.get_legend().remove()
plt.show()

关键优化点

  • 数据同步:通过排序后的数据框统一管理所有属性,确保每个散点的x、y、颜色、大小完全对应
  • 规范API使用:利用seabornscatterplot的color和size参数设置属性,配合sizes定义尺寸范围,避免直接修改底层collection导致的异常
  • 逻辑清晰:用函数封装颜色和大小规则,代码更易读和维护

内容的提问来源于stack exchange,提问作者A.E

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:23:23