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

如何为Matplotlib Axes3D 3D散点图设置忠诚度等级分类图例

解决方案

问题分析

  1. 使用数值型字段RFM_Catagory_Level时,图例默认显示数值而非分类标签,需手动替换标签映射。
  2. 直接传入分类型字段RFM_Loyalty_Level会导致图表无数据,因为scatter的c参数仅支持数值型输入,需先将分类转为数值编码。

方法一:基于数值型字段替换图例标签

利用已有的RFM_Catagory_Level数值,建立数值与分类标签的映射,替换图例文本:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

figrfm2 = plt.figure(figsize=(10, 8))
# 新版本matplotlib需手动添加3D轴
ax = Axes3D(figrfm2, auto_add_to_figure=False)
figrfm2.add_axes(ax)

# 提取数据
xs = RFMScores.Recency
ys = RFMScores.Frequency
zs = RFMScores.Monetary
scores = RFMScores.RFM_Catagory_Level

# 建立数值到分类标签的映射(根据你的实际数值对应关系调整)
level_map = {1: 'bronze', 2: 'silver', 3: 'gold', 4: 'platinum'}
unique_scores = sorted(scores.unique())
category_labels = [level_map[score] for score in unique_scores]

# 绘制3D散点图
scatter = ax.scatter(xs, ys, zs, c=scores, cmap='tab20b')

# 替换图例标签
handles, _ = scatter.legend_elements(prop="colors")
ax.legend(handles, category_labels, title="Loyalty Level")

# 设置图表属性
ax.set_title("RFM 3D散点图")
ax.set_xlabel('Recency')
ax.set_ylabel('Frequency')
ax.set_zlabel('Monetary')
plt.show()

方法二:直接处理分类型字段

先将RFM_Loyalty_Level转为数值编码,再绘制图表并设置对应图例:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import pandas as pd

figrfm2 = plt.figure(figsize=(10, 8))
ax = Axes3D(figrfm2, auto_add_to_figure=False)
figrfm2.add_axes(ax)

# 提取数据
xs = RFMScores.Recency
ys = RFMScores.Frequency
zs = RFMScores.Monetary

# 将分类字段转为有序数值编码
level_codes = pd.Categorical(
    RFMScores.RFM_Loyalty_Level,
    categories=['bronze', 'silver', 'gold', 'platinum'],
    ordered=True
).codes

# 绘制3D散点图
scatter = ax.scatter(xs, ys, zs, c=level_codes, cmap='tab20b')

# 设置图例标签
category_labels = ['bronze', 'silver', 'gold', 'platinum']
handles, _ = scatter.legend_elements(prop="colors")
ax.legend(handles, category_labels, title="Loyalty Level")

# 设置图表属性
ax.set_title("RFM 3D散点图")
ax.set_xlabel('Recency')
ax.set_ylabel('Frequency')
ax.set_zlabel('Monetary')
plt.show()

关键说明

  • 确保level_map中的数值与RFM_Catagory_Level的实际取值对应,若你的数值映射不同(比如0=bronze),需自行调整。
  • 使用pd.Categorical时,categories参数的顺序决定了颜色的映射顺序,可根据需求调整。

内容的提问来源于stack exchange,提问作者JLuu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:35:19