Python散点图绘制:如何处理X轴重复值对应多Y值的情况
多类别DataFrame散点图:隐藏X轴+颜色区分方案
针对你提到的Column A含大量重复类别(100+)、Column B对应多组数值的散点图需求,无需转列表/字典,直接用pandas结合matplotlib或seaborn就能实现,核心思路是用颜色映射每个类别,隐藏X轴并配合图例展示。
先构造模拟数据
先生成符合你场景的测试DataFrame:
import pandas as pd import numpy as np # 生成120个唯一类别,500条数据 categories = [f'Category_{i}' for i in range(120)] df = pd.DataFrame({ 'Column A': np.random.choice(categories, size=500), 'Column B': np.random.normal(loc=50, scale=10, size=500) })
方案1:Matplotlib原生实现
手动给每个类别分配颜色,固定X轴位置,隐藏X轴元素:
import matplotlib.pyplot as plt from matplotlib import cm # 获取所有唯一类别 unique_cats = df['Column A'].unique() # 从colormap中生成对应数量的均匀颜色 colors = cm.viridis(np.linspace(0, 1, len(unique_cats))) plt.figure(figsize=(10, 6)) # 循环绘制每个类别的散点 for cat, color in zip(unique_cats, colors): y_vals = df[df['Column A'] == cat]['Column B'] # X轴用固定值0,因为要隐藏X轴,位置不影响 plt.scatter([0]*len(y_vals), y_vals, color=color, label=cat, alpha=0.6) # 完全隐藏X轴的刻度和标签 plt.xticks([]) plt.xlabel('') # 把图例放在图外,避免遮挡(分2栏节省空间) plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', ncol=2) plt.ylabel('Column B 数值') plt.title('按类别分组散点图(隐藏X轴)') plt.tight_layout() plt.show()
方案2:Seaborn简洁实现
用seaborn的stripplot直接通过hue参数绑定类别,一行搞定分组:
import seaborn as sns plt.figure(figsize=(10, 6)) # 用stripplot,hue区分Column A的类别,X轴固定为0 sns.stripplot( data=df, x=[0]*len(df), y='Column B', hue='Column A', alpha=0.6, jitter=True # 给散点加抖动,避免重叠 ) # 隐藏X轴 plt.xticks([]) plt.xlabel('') # 调整图例位置 plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', ncol=2) plt.ylabel('Column B 数值') plt.title('按类别分组散点图(隐藏X轴)') plt.tight_layout() plt.show()
额外优化建议
- 颜色自定义:如果不想用渐变colormap,可改用离散色板(如
cm.tab20c)或手动指定颜色列表 - 图例优化:类别过多时,可增加
ncol参数分更多栏,或缩小图例字体(plt.legend(..., fontsize=8)) - 灵活调整X轴:若想保留X轴位置但隐藏标签,可将X轴设为类别索引,再执行
plt.xticks([], [])隐藏标签
内容的提问来源于stack exchange,提问作者pythonmd661
相关产品推荐
相关产品推荐

