![](/img/trans.png)
[英]Remove lines separating cells in seaborn heatmap when saved as pdf
[英]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混合創建不透明的顏色。
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。
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)
這當然對屏幕上顯示的數字沒有任何影響。
最后,考慮不在這里使用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.