График рассеяния Matplotlib не смог отобразить все легенды (некоторые отсутствуют) - PullRequest
1 голос
/ 09 июля 2020

По моим данным, всего 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 классов.

1 Ответ

2 голосов
/ 09 июля 2020

Вы можете установить параметр num в вызове handles=points.legend_elements()[0]:

ax.legend(handles=points.legend_elements(num=len(all_classes))[0],...)

enter image description here

You'll need to edit the sizes of course, say with a single axes of figsize = (7,7) you get:

enter image description here

See the документация здесь (которая предоставлена ​​как бы спрятана) . Я предполагаю, что по умолчанию для параметра установлено значение num="auto", что неопределенно c, но похоже, что он просто устанавливает отсечку, которая подходит для большинства наборов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...