Как получить единую цветовую полосу с общими осями X и Y для морских тепловых карт на подзаголовке?

Я хочу построить несколько матриц путаницы на одном графике с одной цветовой полосой и общими осями 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

Отвечает ли это на ваш вопрос? Одна цветная полоса для морских тепловых карт на подзаголовке

Parman M. Alizadeh 17.05.2024 07:21

@ParmanM.Alizadeh Я видел этот пост. Это простой график тепловой карты. Здесь сначала я вычисляю матрицы путаницы, а затем пытаюсь построить эти матрицы.

UseR10085 17.05.2024 07:49

@ UseR10085 UseR10085 Но это тепловые карты, так что это одно и то же.

jared 17.05.2024 08:36

@jared Пожалуйста, посмотрите, сможете ли вы ответить на мой вопрос, используя мой набор данных, с помощью этого ответа.

UseR10085 17.05.2024 08:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Следуя логике этого ответа, вы можете затем пройтись по подграфикам (с помощью 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?

UseR10085 17.05.2024 09:10

Вы должны использовать блокнот Jupyter. Убедитесь, что фигура создана в той же ячейке, что и остальная часть кода. И я не уверен, о чем вы спрашиваете в отношении названий. Вы хотите, чтобы над каждым сюжетом был заголовок?

jared 17.05.2024 09:14

Да заголовок над сюжетом. Я использую блокнот Jupyter.

UseR10085 17.05.2024 09:15

Затем просто добавьте ax.set_title в цикл.

jared 17.05.2024 09:16

Я добавил код заголовков, а также упростил цветовую панель, чтобы она была похожа на связанный ответ.

jared 17.05.2024 09:19

Заголовки зафиксированы в коде. Может ли он получить данные?

UseR10085 17.05.2024 09:33

@UseR10085 См. обновленный код в конце. (Предупреждение: я больше не за компьютером и написал это на телефоне, поэтому оно не проверено.)

jared 17.05.2024 09:43

Другие вопросы по теме