我想要在我的散点图中制作一个图例,这个图例不依赖于点的颜色。下面是一个简单的示例代码:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 创建一些虚拟数据
fake_data = np.array([[1,1],[1,2],[1,3],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3]])
fake_df = pd.DataFrame(fake_data, columns=['X', 'Y'])
groups = np.array(['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'])
fake_df['Group'] = groups
names = np.array(['bla', 'blu', 'ble', 'blam', 'blom', 'bluh', 'bom', 'bam', 'bem'])
fake_df['names'] = names
# 为每个组分配颜色代码
group_codes = {k:idx for idx, k in enumerate(fake_df.Group.unique())}
fake_df['colors'] = fake_df['Group'].apply(lambda x: group_codes[x])
# 绘制散点图
fig, ax = plt.subplots(figsize=(5,5))
scatter = ax.scatter(fake_data[:,0], fake_data[:,1], c=fake_df['colors'])
# 在每个点旁边标注序号(这并不是我最终想要的效果)
for num, name in enumerate(fake_df.index):
plt.text(fake_data[num,0], fake_data[num, 1], num)
# 目前生成图例的方式并不能达到我的需求
handles = scatter.legend_elements(num=[0,1,2,3])[0]
ax.legend(title='Group\nCodes', handles=handles, labels=group_codes.keys(), bbox_to_anchor=(1, 0.5), loc="upper left")
plt.show()
我的目标是保留这些颜色,因为它们代表了聚类分析的结果,但是我想让图例看起来像这样:
1 - 'bla'
2 - 'blu'
3 - 'ble' 等等。
当前的图表如下所示(这里假设有一个图表展示,但实际上无法直接展示图像,请参考实际运行结果)。而我的数据框结构如下:
X Y Group names colors
0 1 1 A bla 0
1 1 2 A blu 0
2 1 3 A ble 0
3 2 1 B blam 1
4 2 2 B blom 1
5 2 3 B bluh 1
6 3 1 C bom 2
7 3 2 C bam 2
8 3 3 C bem 2
目前我只是简单地对点进行了编号,但我的真正意图是将这些数字与对应的名字关联起来,并在图例中显示出来。