如何按自定义规则设置Seaborn散点图标记的颜色与大小
散点图数据点颜色与大小自定义问题解决思路
问题背景
需要为散点图中每个数据点按以下规则设置颜色和大小:
- 颜色:
Fracture <25为绿色,25≤Fracture<50为黄色,Fracture≥50为橙色 - 大小:每个颜色区间内,
Fracture值越小,标记越大;最小大小为10,最大为200
原代码存在数据对应错位、大小设置方式不符合seaborn规范的问题,导致大小规则未正确生效。
原代码问题分析
- 数据对应关系错误:
Y = df2['Force'].sort_values()和wp列表未同步排序,导致散点的位置与颜色、大小不匹配 - 大小设置方式不当:直接修改
ax.collections[0].set_sizes(),seaborn的set_sizes()接收的是缩放比例而非绝对像素大小,容易出现偏差 - 逻辑冗余:手动遍历计算颜色和大小,易出现索引错误,代码可维护性差
修正方案与代码
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使用:利用seaborn
scatterplot的color和size参数设置属性,配合sizes定义尺寸范围,避免直接修改底层collection导致的异常 - 逻辑清晰:用函数封装颜色和大小规则,代码更易读和维护
内容的提问来源于stack exchange,提问作者A.E
相关产品推荐
相关产品推荐

