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

Matplotlib带图例3D散点图:如何为每行数据设置不同颜色或标记

解决方案

你可以通过逐行遍历数据集、为每个细菌样本单独配置样式和标签的方式解决这两个问题,具体实现代码和说明如下:

完整实现代码

import matplotlib.pyplot as plt
import numpy as np

# 预定义颜色池和标记样式池,满足16个样本的区分需求
color_pool = plt.cm.tab20(np.linspace(0, 1, 16))  # 用tab20 colormap生成20种差异明显的颜色,取前16种
marker_pool = ['o', 'v', '^', '<', '>', 's', 'p', '*', 'h', 'H', '+', 'x', 'D', 'd', 'P', 'X']

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(projection='3d')

# 逐行遍历数据集,逐个绘制散点
for idx, (bacteria_name, row) in enumerate(data.iterrows()):
    x = row['Penicilin']
    y = row['Streptomycin']
    z = row['Neomycin']
    # 每个点单独指定颜色、标记、标签
    ax.scatter(x, y, z, 
               color=color_pool[idx], 
               marker=marker_pool[idx], 
               s=80,  # 调大散点尺寸更醒目
               label=bacteria_name)

ax.set_xlabel('Penicilin')
ax.set_ylabel('Streptomycin')
ax.set_zlabel('Neomycin')

# 优化图例显示:放到图外侧,分2列展示避免拥挤
ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left', ncol=2, fontsize=9)

# 可选:开启交互模式下的悬浮标签提示,不需要可以删掉
try:
    import mplcursors
    mplcursors.cursor(hover=True).connect(
        "add", lambda sel: sel.annotation.set_text(sel.artist.get_label())
    )
except ImportError:
    pass

plt.tight_layout()  # 自动调整布局避免图例被截断
plt.show()

优化点说明

  • 每个细菌样本对应唯一的颜色+标记组合,视觉上很容易区分不同样本
  • 每个点单独设置标签,图例和数据点完全一一对应,不会出现混乱
  • 图例移到画布外侧分多列展示,不会遮挡3D图的展示区域
  • 可选的悬浮提示功能,鼠标放在点上就会自动显示对应细菌名称,不需要反复对照图例

内容的提问来源于stack exchange,提问作者Shahriar.M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:24:03