如何为Matplotlib Axes3D 3D散点图设置忠诚度等级分类图例
解决方案
问题分析
- 使用数值型字段
RFM_Catagory_Level时,图例默认显示数值而非分类标签,需手动替换标签映射。 - 直接传入分类型字段
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
相关产品推荐
相关产品推荐

