如何基于带聚类标签的pandas DataFrame xyz坐标绘制3D plt.scatter散点图
3D聚类散点图实现方案
基础Matplotlib实现
直接用matplotlib内置的3D投影接口即可实现,代码如下:
- 导入依赖库
import pandas as pd import matplotlib.pyplot as plt
- 核心绘图逻辑,假设你的DataFrame变量名为
df
# 初始化3D画布 fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(projection='3d') # 绘制散点图,按label列自动分配聚类颜色 scatter = ax.scatter( df['x'], df['y'], df['z'], c=df['label'], cmap='viridis', # 可替换为你偏好的配色方案 s=10, # 点的大小 alpha=0.6 # 透明度,避免点堆叠导致分布看不清 ) # 补充图表信息 ax.set_xlabel('X坐标') ax.set_ylabel('Y坐标') ax.set_zlabel('Z坐标') plt.legend( handles=scatter.legend_elements()[0], labels=[f"聚类{i}" for i in set(df['label'].astype(int))], title="聚类结果" ) plt.show()
大数据量优化方案
针对你提到的数据集规模较大的场景,可以通过以下方式优化渲染效率:
- 缩小点的尺寸:将
s参数调整为1~3,减少单个点的渲染开销 - 降低透明度:将
alpha参数调整为0.3~0.5,优化堆叠点的显示效果 - 随机降采样:如果数据量超过10万条,可抽取部分样本绘制,不影响整体分布的前提下大幅提升速度,示例:
# 随机抽取10%的样本绘图,random_state固定保证结果可复现 sample_df = df.sample(frac=0.1, random_state=42) scatter = ax.scatter( sample_df['x'], sample_df['y'], sample_df['z'], c=sample_df['label'], cmap='viridis', s=2, alpha=0.4 )
- 采用交互式渲染:如果需要查看细节可改用plotly绘制,内置WebGL加速适合渲染大数据量3D图:
import plotly.express as px fig = px.scatter_3d(df, x='x', y='y', z='z', color='label') fig.update_traces(marker=dict(size=2, opacity=0.4)) fig.show() # 可导出为html文件离线打开查看 fig.write_html("3d聚类散点图.html")
内容的提问来源于stack exchange,提问作者Saad el harchi
相关产品推荐
相关产品推荐

