在我的数据中,总共有23个班级。
all_classes = ['E6Tle4', 'E2Rasgrf2', 'InV', 'E4Thsd7a', 'E3Rmst', 'E3Rorb','E5Galnt14', 'Clau', 'E4Il1rapl2', 'E5Parm1', 'OPC', 'Mis', 'E5Sulf1', 'Ast', 'OliM', 'E5Tshz2', 'InS', 'InN', 'InP', 'OliI', 'Endo', 'Mic', 'Peri']
我想用这些类作为标签绘制点的散点图。但是,传说只显示了9个班级。 这是一个再现错误的玩具示例。
a = np.random.rand(23)/23
size= 2000
df = pd.DataFrame(
{'x': np.random.rand(size),
'y': np.random.rand(size),
'classes': np.random.choice(all_classes, size, p=a/sum(a))
})
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df["label"] = le.fit_transform(df["classes"])
fig, axes = plt.subplots(1, 3, figsize=(10,3))
fig.suptitle("true label")
ax1 = axes[0]
vis(ax1, df, df["label"], df["classes"], title="RNA")
fig.tight_layout()
fig.subplots_adjust(top=0.85)
def vis(ax, df, label_num, label_name, alpha=0.7, s=10, title="visualization", vis=False):
points = ax.scatter(df.iloc[:, 0], df.iloc[:, 1], c=label_num, label=label_name, edgecolor='none',alpha=0.7, s=s)
ax.spines["top"].set_visible(vis)
ax.spines["right"].set_visible(vis)
ax.set_title(title)
ax.legend(handles=points.legend_elements()[0], labels=list(np.unique(label_name)),
title="Classes", loc='center left', bbox_to_anchor=(1, 0.5))
使用以下代码,我们可以确认列类包含23个类。
len(df["classes"].unique()) # return 23
但是,您可以看到图例中仅显示9个类。
答案 0 :(得分:2)
您可以在num
调用中设置handles=points.legend_elements()[0]
参数:
ax.legend(handles=points.legend_elements(num=len(all_classes))[0],...)
您需要编辑课程的大小,例如,使用figsize = (7,7)
的单轴即可获得:
请参见documentation here(授予的内容被藏起来了)。我猜默认情况下该参数设置为num="auto"
,这几乎是自动的,但似乎只是设置了一个对大多数数据集都适用的截止值。