Я хочу построить несколько матриц путаницы на одном графике с одной цветовой полосой и общими осями X и Y. Вот мой код, который я пробовал до сих пор
#Calculate the onfusion matrices
predicted_mod1 = df_binary["Model1"]
actual_class = df_binary["Observed"]
out_df_mod1 = pd.DataFrame(np.vstack([predicted_mod1, actual_class]).T,columns=['predicted_class','actual_class'])
CF_mod1 = pd.crosstab(out_df_mod1['actual_class'], out_df_mod1['predicted_class'], rownames=['Actual'], colnames=['Predicted'])
predicted_mod2 = df_binary["Model2"]
out_df_mod2 = pd.DataFrame(np.vstack([predicted_mod2, actual_class]).T,columns=['predicted_class','actual_class'])
CF_mod2 = pd.crosstab(out_df_mod2['actual_class'], out_df_mod2['predicted_class'], rownames=['Actual'], colnames=['Predicted'])
predicted_mod4 = df_binary["Model4"]
out_df_mod4 = pd.DataFrame(np.vstack([predicted_mod4, actual_class]).T,columns=['predicted_class','actual_class'])
CF_mod4 = pd.crosstab(out_df_mod4['actual_class'], out_df_mod4['predicted_class'], rownames=['Actual'], colnames=['Predicted'])
predicted_mod5 = df_binary["Model5"]
out_df_mod5 = pd.DataFrame(np.vstack([predicted_mod5, actual_class]).T,columns=['predicted_class','actual_class'])
CF_mod5 = pd.crosstab(out_df_mod5['actual_class'], out_df_mod5['predicted_class'], rownames=['Actual'], colnames=['Predicted'])
predicted_mod6 = df_binary["Model6"]
out_df_mod6 = pd.DataFrame(np.vstack([predicted_mod6, actual_class]).T,columns=['predicted_class','actual_class'])
CF_mod6 = pd.crosstab(out_df_mod6['actual_class'], out_df_mod6['predicted_class'], rownames=['Actual'], colnames=['Predicted'])
Теперь я построил эти матрицы, используя следующий код
fig = plt.figure(figsize=(6, 3), dpi=300)
fig.subplots_adjust(hspace=0.8, wspace=0.6)
ax = fig.add_subplot(2, 3, 1)
sns.heatmap(CF_mod1, cmap='Blues', annot=True, fmt='d')
ax = fig.add_subplot(2, 3, 2)
sns.heatmap(CF_mod2, cmap='Blues', annot=True, fmt='d')
ax = fig.add_subplot(2, 3, 3)
sns.heatmap(CF_mod3, cmap='Blues', annot=True, fmt='d')
ax = fig.add_subplot(2, 3, 4)
sns.heatmap(CF_mod4, cmap='Blues', annot=True, fmt='d')
ax = fig.add_subplot(2, 3, 5)
sns.heatmap(CF_mod5, cmap='Blues', annot=True, fmt='d')
ax = fig.add_subplot(2, 3, 6)
sns.heatmap(CF_mod6, cmap='Blues', annot=True, fmt='d')
plt.show()
Мой ожидаемый результат выглядит примерно так: Теперь, как я могу иметь только одну цветовую полосу с общей осью X и Y?
Данные
Model1,Model2,Model3,Model4,Model5,Model6,Observed
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
No,No,No,No,No,No,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,No,Yes,No,Yes,Yes
No,Yes,No,No,No,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,No,No,No,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,No,Yes,Yes,Yes,No,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,No,Yes,Yes,Yes,No,Yes
Yes,No,Yes,Yes,Yes,No,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
Yes,Yes,Yes,Yes,Yes,Yes,Yes
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
Yes,Yes,Yes,Yes,Yes,Yes,No
No,No,No,No,No,No,No
No,Yes,No,No,No,Yes,No
No,Yes,No,No,No,Yes,No
Yes,Yes,Yes,Yes,Yes,Yes,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,Yes,No,Yes,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
Yes,Yes,Yes,Yes,Yes,Yes,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
No,No,No,No,No,No,No
@ParmanM.Alizadeh Я видел этот пост. Это простой график тепловой карты. Здесь сначала я вычисляю матрицы путаницы, а затем пытаюсь построить эти матрицы.
@ UseR10085 UseR10085 Но это тепловые карты, так что это одно и то же.
@jared Пожалуйста, посмотрите, сможете ли вы ответить на мой вопрос, используя мой набор данных, с помощью этого ответа.






Следуя логике этого ответа, вы можете затем пройтись по подграфикам (с помощью sharex=True и sharey=True, чтобы удалить галочки с графиков не по краям), построить график данных и удалить ylabel, если его нет в первом столбце и /или xlabel, если его нет в последней строке. Чтобы обеспечить правильную цветовую шкалу, перед циклом вычисляются глобальные vmin и vmax.
nrows = 2
ncols = 3
fig, axes = plt.subplots(nrows, ncols, sharex=True, sharey=True)
cbar_ax = fig.add_axes([0.91, 0.3, 0.03, 0.4])
data = [CF_mod1, CF_mod2, CF_mod3, CF_mod4, CF_mod5, CF_mod6]
# get global min and max to enforce the same colorscale in all plots
vmin = min([d.min().min() for d in data])
vmax = max([d.max().max() for d in data])
for i, (ax, d) in enumerate(zip(axes.flat, data)):
p = sns.heatmap(d, ax=ax, annot=True,
vmin=vmin, vmax=vmax,
cmap = "Blues", cbar=(i==0), cbar_ax=None if i else cbar_ax)
# remove ylabel if not in the first column
if i%ncols:
ax.set_ylabel("")
# remove xlabel if not in the last row
if i//ncols + 1 != nrows:
ax.set_xlabel("")
fig.show()
Результат:
Для меток осей вы также можете использовать дополнительные метки и удалять отдельные метки осей.
for i, (ax, d) in enumerate(zip(axes.flat, data)):
p = sns.heatmap(d, ax=ax, annot=True,
vmin=vmin, vmax=vmax,
cmap = "Blues", cbar=False)
ax.set_xlabel("")
ax.set_ylabel("")
fig.supxlabel("Predicted")
fig.supylabel("Actual")
Результат:
Обновлено: чтобы поместить заголовок над каждым графиком, просто добавьте ax.set_title в цикл.
for i, (ax, d) in enumerate(zip(axes.flat, data)):
p = sns.heatmap(d, ax=ax, annot=True,
vmin=vmin, vmax=vmax,
cmap = "Blues", cbar=(i==0), cbar_ax=None if i else cbar_ax)
ax.set_xlabel("")
ax.set_ylabel("")
ax.set_title(f"Model {i+1}")
Результат:
Изменить. Чтобы автоматизировать заголовки, используйте столбцы данных.
for i, (ax, d, title) in enumerate(zip(axes.flat, data, df_binary.columns)):
...
ax.set_title(title)
Вторая часть не возвращает никакого сюжета. Меня это возвращает Text(0.02, 0.5, 'Actual'). Как мне сделать такие заголовки тепловых карт, как Model 1, Model 2, Model 3?
Вы должны использовать блокнот Jupyter. Убедитесь, что фигура создана в той же ячейке, что и остальная часть кода. И я не уверен, о чем вы спрашиваете в отношении названий. Вы хотите, чтобы над каждым сюжетом был заголовок?
Да заголовок над сюжетом. Я использую блокнот Jupyter.
Затем просто добавьте ax.set_title в цикл.
Я добавил код заголовков, а также упростил цветовую панель, чтобы она была похожа на связанный ответ.
Заголовки зафиксированы в коде. Может ли он получить данные?
@UseR10085 См. обновленный код в конце. (Предупреждение: я больше не за компьютером и написал это на телефоне, поэтому оно не проверено.)
Отвечает ли это на ваш вопрос? Одна цветная полоса для морских тепловых карт на подзаголовке