簡體   English   中英

如何從seaborn的clustermap中的空顏色條/ cbar中刪除大的空白?

[英]How to remove large whitespace from empty colorbar/cbar in seaborn's clustermap?

加載包、顯示版本和獲取數據以實現可重復性:

import seaborn as sns; print("Seaborn:", sns.__version__)
import matplotlib as mpl; import matplotlib.pyplot as plt; print("Matplotlib:", mpl.__version__)
import pandas as pd; print("Pandas:", pd.__version__)
# Seaborn: 0.11.0
# Matplotlib: 3.3.1
# Pandas: 1.0.5
    
df = pd.read_csv("https://pastebin.com/raw/w53mAAXN", sep="\t", index_col=0)
vmax = df.abs().values.ravel().max()

figsize = (40,13)

使用cbar=False嘗試clustermapcbar=False留下一個巨大的空白和一個空的ax對象:

with plt.style.context("seaborn-white"):
#     _, ax_null = plt.subplots(figsize=(0.1,0.1))
    g = sns.clustermap(df, 
                       cbar=False,
#                        cbar_ax=None, 
                       dendrogram_ratio=0.382, 
                       method="ward", 
                       row_cluster=False, 
                       metric="euclidean",  
                       mask=df == 0, 
                       figsize=figsize, 
                       cmap=plt.cm.seismic, 
                       edgecolor="white", 
                       linewidth=1, 
                       xticklabels=True,
                       vmax=vmax,
                       vmin=-vmax,
      )
    g.ax_heatmap.set_facecolor("gray")

圖片

嘗試clustermap具有非常小的自定義cax cbar_ax=None時會發生同樣的事情:

with plt.style.context("seaborn-white"):
    _, ax_null = plt.subplots(figsize=(0.1,0.1))
    g = sns.clustermap(df, 
#                        cbar=False,
                       cbar_ax=ax_null, 
                       dendrogram_ratio=0.382, 
                       method="ward", 
                       row_cluster=False, 
                       metric="euclidean",  
                       mask=df == 0, 
                       figsize=figsize, 
                       cmap=plt.cm.seismic, 
                       edgecolor="white", 
                       linewidth=1, 
                       xticklabels=True,
                       vmax=vmax,
                       vmin=-vmax,
      )
    g.ax_heatmap.set_facecolor("gray")

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-86-f7a221f170c3> in <module>
     12 with plt.style.context("seaborn-white"):
     13     _, ax_null = plt.subplots(figsize=(0.1,0.1))
---> 14     g = sns.clustermap(df, 
     15 #                        cbar=False,
     16                        cbar_ax=ax_null,

~/anaconda3/envs/soothsayer5_env/lib/python3.8/site-packages/seaborn/_decorators.py in inner_f(*args, **kwargs)
     44             )
     45         kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
---> 46         return f(**kwargs)
     47     return inner_f
     48 

~/anaconda3/envs/soothsayer5_env/lib/python3.8/site-packages/seaborn/matrix.py in clustermap(data, pivot_kws, method, metric, z_score, standard_scale, figsize, cbar_kws, row_cluster, col_cluster, row_linkage, col_linkage, row_colors, col_colors, mask, dendrogram_ratio, colors_ratio, cbar_pos, tree_kws, **kwargs)
   1400                           colors_ratio=colors_ratio, cbar_pos=cbar_pos)
   1401 
-> 1402     return plotter.plot(metric=metric, method=method,
   1403                         colorbar_kws=cbar_kws,
   1404                         row_cluster=row_cluster, col_cluster=col_cluster,

~/anaconda3/envs/soothsayer5_env/lib/python3.8/site-packages/seaborn/matrix.py in plot(self, metric, method, colorbar_kws, row_cluster, col_cluster, row_linkage, col_linkage, tree_kws, **kws)
   1231 
   1232         self.plot_colors(xind, yind, **kws)
-> 1233         self.plot_matrix(colorbar_kws, xind, yind, **kws)
   1234         return self
   1235 

~/anaconda3/envs/soothsayer5_env/lib/python3.8/site-packages/seaborn/matrix.py in plot_matrix(self, colorbar_kws, xind, yind, **kws)
   1182         # Setting ax_cbar=None in clustermap call implies no colorbar
   1183         kws.setdefault("cbar", self.ax_cbar is not None)
-> 1184         heatmap(self.data2d, ax=self.ax_heatmap, cbar_ax=self.ax_cbar,
   1185                 cbar_kws=colorbar_kws, mask=self.mask,
   1186                 xticklabels=xtl, yticklabels=ytl, annot=annot, **kws)

TypeError: heatmap() got multiple values for keyword argument 'cbar_ax'

禁用g.cax.set_visible(False)時產生大量空白:

with plt.style.context("seaborn-white"):
#     _, ax_null = plt.subplots(figsize=(0.1,0.1))
    g = sns.clustermap(df, 
#                        cbar=False,
#                        cbar_ax=None, 
                       dendrogram_ratio=0.382, 
                       method="ward", 
                       row_cluster=False, 
                       metric="euclidean",  
                       mask=df == 0, 
                       figsize=figsize, 
                       cmap=plt.cm.seismic, 
                       edgecolor="white", 
                       linewidth=1, 
                       xticklabels=True,
                       vmax=vmax,
                       vmin=-vmax,
      )
    g.ax_heatmap.set_facecolor("gray")
    g.cax.set_visible(False)

圖片

您設置的一些比率(通過 figsize 和 dendrogram_ratio)會影響盒子的大小。 我暫時將它們排除在外,但如果您想根據自己的喜好優化這些比率,您將獲得所需的顏色條大小。 我還添加了tight_layout這也有幫助。

df = pd.read_csv("https://pastebin.com/raw/w53mAAXN", sep="\t", index_col=0)
vmax = df.abs().values.ravel().max()

# figsize = (40, 13)

with plt.style.context("seaborn-white"):
#     _, ax_null = plt.subplots(figsize=(0.1,0.1))
#     cbar_ax = plt.gcf().add_axes([.91, .3, .03, .4])
    g = sns.clustermap(df,
                       cbar=True,
                       # cbar_kws = dict(use_gridspec=False,location="top"),
                       # dendrogram_ratio=0.382,
                       method="ward",
                       row_cluster=False,
                       metric="euclidean",
                       mask=df == 0,
                       # figsize=figsize,
                       cmap=plt.cm.seismic,
                       edgecolor="white",
                       linewidth=1,
                       xticklabels=True,
                       vmax=vmax,
                       vmin=-vmax,
      )
    plt.setp(g.ax_heatmap.get_xticklabels(), rotation=90)
    plt.subplots_adjust(bottom=0.5)
    g.ax_heatmap.set_facecolor("gray")


plt.tight_layout()
plt.show()

結果: 結果圖像

刪除樹狀圖軸:

with plt.style.context("seaborn-white"):
#     _, ax_null = plt.subplots(figsize=(0.1,0.1))
    g = sns.clustermap(df, 
#                        cbar=False,
#                        cbar_ax=None, 
                       dendrogram_ratio=(0,0.382), # This line 
                       method="ward", 
                       row_cluster=False, 
                       metric="euclidean",  
                       mask=df == 0, 
                       figsize=figsize, 
                       cmap=plt.cm.seismic, 
                       edgecolor="white", 
                       linewidth=1, 
                       xticklabels=True,
                       vmax=vmax,
                       vmin=-vmax,
      )
    g.ax_heatmap.set_facecolor("gray")
    g.cax.set_visible(False)

暫無
暫無

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

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