簡體   English   中英

Seaborn 單元格之間沒有線條的熱圖

[英]Seaborn Heatmap without lines between cells

我正在嘗試使用透明色圖創建 seaborn 的熱圖,因為圖像應該顯示在背景中。 到目前為止,熱圖創建工作正常,但是即使熱圖的線寬設置為 0.0,單元格之間的一些線仍然可見。

創建熱圖的代碼如下所示:

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

其中image是 64x64 numpy 數組。 生成的熱圖如下所示:圖(抱歉沒有足夠的聲譽來嵌入圖片)

問題是細胞之間的細線。 奇怪的是,它們並不在每一個邊緣。

任何人都知道如何擺脫這些線?

非常感謝


更新 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()

結果是這張熱圖:

這個熱圖

在這里你可以看到每一列之間都有細線,但第一行和第二行之間沒有任何線。

這些線是半透明貼片的重疊,不能在像素網格上完美對齊。

alpha混合

一個選項是不使用透明度,而是使用alpha混合創建不透明的顏色。

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()

在此輸入圖像描述

這方面的一個明顯優勢是顏色條與熱圖具有相同的顏色。

增加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)

在此輸入圖像描述

這當然對屏幕上顯示的數字沒有任何影響。

imshow

最后,考慮不在這里使用seaborn,而是使用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()

在此輸入圖像描述

我剛剛遇到這個問題。 我需要將 plot 上傳到背面,所以我不喜歡 dpi 解決方案。 這是我根據 OP 的解決方案得出的結論:

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.1)
colors = ax.collections[0].get_facecolors()
ax.collections[0].set_edgecolors(colors)
plt.imshow()

這個想法是用單元格的面色在每個單元格周圍創建一個細邊。 這會在不更改原始單元格 colors 的情況下刪除這些行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM