matplotlib 正在标记Axes3D图表的图例值

euoag5mw  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(130)

我有一个包含以下值的数据框,并希望创建一个3D图,显示按类别/忠诚度级别(青铜、银、黄金、白金)标记的最近、频率和货币值。相关数据如下所示:
RFMScores.head()

X1 M1 N1 X是与忠诚度级别相关联的数字分数
在制作图表时,我使用了

figrfm2 = plt.figure()
ax = Axes3D(figrfm2)

xs = RFMScores.Recency
ys = RFMScores.Frequency
zs = RFMScores.Monetary
scores = RFMScores.RFM_Catagory_Level

scatter = ax.scatter(xs, ys, zs,c=scores,cmap='tab20b')

ax.set_title("3D plot")
ax.set_xlabel('Recency')
ax.set_ylabel('Frequency')
ax.set_zlabel('Monetary')
ax.legend(*scatter.legend_elements())
plt.show()

但图例中显示的是数值,而不是实际的标签。

当我尝试使用RFM_Loyalty_Level时,如下所示:

figrfm2 = plt.figure()
ax = Axes3D(figrfm2)

xs = RFMScores.Recency
ys = RFMScores.Frequency
zs = RFMScores.Monetary

scatter = ax.scatter(xs, ys, zs,c=RFMScores.RFM_Loyalty_Level,cmap='tab20b')

ax.set_title("3D plot")
ax.set_xlabel('Recency')
ax.set_ylabel('Frequency')
ax.set_zlabel('Monetary')
ax.legend(*scatter.legend_elements())
plt.show()

图表为空,没有数据。如何解决此问题,使图表中的标签类别为“platinum,gold,银,bronze”,而不是图例中的数值?

siv3szwd

siv3szwd1#

我找到了解决方案here
关键(不是双关语)是创建一个两列的字典,然后将句柄和键传递到legend(handles=,labels=)参数中。解决方案如下,但请查看原始答案的链接,并给予适当的信任。

grouped_codes = dict(zip(RFMScores.RFM_Loyalty_Level, RFMScores.RFM_Catagory_Level))

figrfm2 = plt.figure()
ax = Axes3D(figrfm2)

xs = RFMScores.Recency
ys = RFMScores.Frequency
zs = RFMScores.Monetary
scores = RFMScores.RFM_Catagory_Level

scatter = ax.scatter(xs, ys, zs,c=scores,cmap='tab20b')
handles = scatter.legend_elements(num=[1,2,3,4])[0]

ax.set_title("3D plot")
ax.set_xlabel('Recency')
ax.set_ylabel('Frequency')
ax.set_zlabel('Monetary')
ax.legend(title="Binned RFM Scores",handles=handles,labels=grouped_codes.keys(),*scatter.legend_elements())
plt.show()

相关问题