Python绘图:如何为不同聚类的两类数据设置不同颜色
解决Seaborn散点图无法按类别显示不同颜色的问题
问题分析
- 分类逻辑错误:你当前的颜色判断条件
(df["x1"] <=7) & (df["x1"]>0)覆盖了所有样本(从你提供的数据集看,所有x1都在0-7区间内),导致所有点都被设置为紫色#9b59b8,这是颜色单一的核心原因。 - Seaborn API使用不当:
sns.regplot更适合带回归线的绘图场景,通过scatter_kws传递颜色的方式不够直观,改用scatterplot结合hue参数更适配按类别着色的需求。
修正方案
方案1:根据数据集的y列(聚类标签)着色
如果y列是聚类的类别标签,直接用它区分颜色是最准确的:
# import libraries from matplotlib import pyplot as plt import seaborn as sns import pandas as pd # function for plotting data def plot_data(data): # 定义类别-颜色映射,根据y的实际取值调整键值 color_map = {1.0: "#9b59b8", 0.0: "#3498db"} # 使用scatterplot按y列分类着色 sns.scatterplot(data=data, x="x1", y="x2", hue="y", palette=color_map, s=50) plt.title("Datasets for Neural network") plt.xlabel("X_1") plt.ylabel("X_2") plt.legend().remove() # 不需要图例可删除此行 plt.show() data = pd.read_csv('./assets/data/data0/data.csv') plot_data(data)
方案2:根据x1的正确阈值分类
如果确实需要按x1的分界值区分(比如期望图中左侧为紫色、右侧为蓝色),请调整符合数据分布的阈值,例如假设分界值为8:
# import libraries from matplotlib import pyplot as plt import numpy as np import seaborn as sns import pandas as pd # function for plotting data def plot_data(data): df = data.copy() # 调整分类阈值,生成类别列 df['category'] = np.where(df["x1"] <= 8, "left", "right") # 定义类别-颜色映射 color_map = {"left": "#9b59b8", "right": "#3498db"} sns.scatterplot(data=df, x="x1", y="x2", hue="category", palette=color_map, s=50) plt.title("Datasets for Neural network") plt.xlabel("X_1") plt.ylabel("X_2") plt.legend().remove() plt.show() data = pd.read_csv('./assets/data/data0/data.csv') plot_data(data)
关键改动说明
- 替换
regplot为scatterplot:更专注于散点图绘制,支持直接通过hue参数按列分类着色。 - 修正分类逻辑:要么使用数据集自带的聚类标签
y,要么设置符合数据分布的x1阈值。 - 使用
palette参数传递自定义颜色:比手动设置facecolors更符合Seaborn的设计逻辑,避免参数冲突。
内容的提问来源于stack exchange,提问作者F.C. Akhi
相关产品推荐
相关产品推荐

