Seaborn Heatmap без линий между клетками - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь создать тепловую карту с морской волной с прозрачной цветовой картой, поскольку изображение должно отображаться в фоновом режиме.Пока что создание тепловой карты работает нормально, однако некоторые линии между ячейками все еще видны, даже если ширина линии тепловой карты установлена ​​на 0,0.

Код для создания тепловой карты выглядит следующим образом:

ax = sns.heatmap(image, cmap="rocket_r", linewidths=0.0)
ax.collections[0].set_alpha(0.5)

Где image - массив пустых 64x64.Полученная тепловая карта выглядит следующим образом: Тепловая карта (извините, недостаточно репутации для встраивания изображений)

Проблема заключается в тонких линиях между ячейками.Как ни странно, они не на каждом краю.

Кто-нибудь знает, как избавиться от этих строк?

Большое спасибо


Обновление 1 (полный рабочий пример):

image = np.array([[1, 1, 2, 2], [3, 3, 3, 3], [4, 5, 4, 5], [6, 6, 6, 6]])
ax = sns.heatmap(image, cmap="rocket_r", linewidths=0.0)
ax.collections[0].set_alpha(0.5)
plt.show()

Результатом является тепловая карта:

this heatmap

Здесь вы можете видеть, что между каждым столбцом есть тонкие линии, но между ними нет никакой линии.первый и второй ряд.

1 Ответ

0 голосов
/ 11 декабря 2018

Линии - это перекрытие полупрозрачных пятен, которые нельзя точно выровнять на сетке пикселей.

альфа-смешение

Возможность не использовать прозрачность, а создавать непрозрачные цвета с альфа-смешением.

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np
import seaborn as sns

def get_alpha_blend_cmap(cmap, alpha):
    cls = plt.get_cmap(cmap)(np.linspace(0,1,256))
    cls = (1-alpha) + alpha*cls
    return ListedColormap(cls)

image = np.array([[1, 1, 2, 2], [3, 3, 3, 3], [4, 5, 4, 5], [6, 6, 6, 6]])
ax = sns.heatmap(image, cmap=get_alpha_blend_cmap("rocket_r", 0.5), linewidths=0.0)

plt.show()

enter image description here

Очевидным преимуществом этого является то, что цветовая полоса имеет те же цвета, что и тепловая карта.

увеличение dpi

Если вышеупомянутое не подходит, вы можете увеличить dpi при сохранении.

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

image = np.array([[1, 1, 2, 2], [3, 3, 3, 3], [4, 5, 4, 5], [6, 6, 6, 6]])
ax = sns.heatmap(image, cmap="rocket_r", linewidths=0.0, edgecolor="none", alpha=0.5)
plt.savefig("test.png", dpi=1000)

enter image description here

Это, конечно, никак не влияет на показанную на экране цифру.

imshow

Наконец, рассмотрите не использование морского происхождения здесь, а вместо этого сюжет matplotlib imshow.

import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use("seaborn-dark")
plt.rcParams["axes.facecolor"] = "white"
import numpy as np

image = np.array([[1, 1, 2, 2], [3, 3, 3, 3], [4, 5, 4, 5], [6, 6, 6, 6]])
im = plt.imshow(image, cmap="rocket_r", alpha=0.5)
plt.colorbar(im)
plt.gca().set(xticks=(range(image.shape[1])),yticks=(range(image.shape[0])))
plt.show()

enter image description here

...