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
相关产品推荐
相关产品推荐

