You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为sns.clustermap的row_colors/col_colors增加间距?多行列后过于密集

解决seaborn clustermap中row_colors/col_colors行间距过密的问题

我太懂你这种困扰了——当给sns.clustermap加了3行以上的row_colors(或col_colors)后,颜色条挤得密密麻麻,完全看不清区分度。下面分享两个实用的解决办法,帮你轻松拉开间距:

方法一:调整现有颜色条的布局(简单快捷)

这个方法基于clustermap生成的默认颜色条axes,直接修改它们的位置和高度,就能快速增加间距。

修改后的完整代码

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

# 生成示例数据
matrix = pd.DataFrame(np.random.randint(0, 1, size=(50, 4)))
labels = np.random.randint(0, 5, size=50)
lut = dict(zip(set(labels), sns.hls_palette(len(set(labels)), l=0.5, s=0.8)))
row_colors = pd.DataFrame(labels)[0].map(lut)

# 创建额外的颜色行
labels2 = np.random.randint(0, 1, size=50)
lut2 = dict(zip(set(labels2), sns.hls_palette(len(set(labels2)), l=0.5, s=0.8)))
row_colors2 = pd.DataFrame(labels2)[0].map(lut2)

# 拼接多行颜色
row_colors = pd.concat([row_colors, row_colors, row_colors2, row_colors2, row_colors2], axis=1)

# 绘制 clustermap
g = sns.clustermap(matrix, col_cluster=False, linewidths=0.1, cmap='coolwarm', row_colors=row_colors)

# 核心:调整row_colors的间距
# 获取所有颜色条的子axes
color_axes = g.ax_row_colors.get_children()[:-1]  # 排除最后一个空白axes
for idx, ax in enumerate(color_axes):
    pos = ax.get_position()
    # 减小每个颜色条的高度,并向下移动,留出间距
    # 你可以根据需求调整0.7(高度比例)和0.018(下移距离)的数值
    new_pos = [pos.x0, pos.y0 - (0.018 * idx), pos.width, pos.height * 0.7]
    ax.set_position(new_pos)

plt.show()

代码说明

  • 我们通过g.ax_row_colors.get_children()获取所有颜色条的axes对象,然后逐个调整它们的位置和高度:
    • pos.height * 0.7:把每个颜色条的高度缩小到原来的70%
    • pos.y0 - (0.018 * idx):让每个颜色条依次向下偏移,索引越大偏移越多,形成均匀的间距
  • 如果是调整col_colors,只需要把g.ax_row_colors换成g.ax_col_colors,然后调整宽度和左右位置即可。

方法二:手动添加颜色条(高度灵活)

如果想完全掌控颜色条的大小、间距甚至标签,这个方法更适合——我们先绘制不带颜色条的clustermap,然后手动在侧边添加自定义的颜色条axes。

完整代码示例

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

# 生成数据
matrix = pd.DataFrame(np.random.randint(0, 1, size=(50, 4)))
labels = np.random.randint(0, 5, size=50)
lut = dict(zip(set(labels), sns.hls_palette(len(set(labels)), l=0.5, s=0.8)))
row_colors = pd.DataFrame(labels)[0].map(lut)
labels2 = np.random.randint(0, 1, size=50)
lut2 = dict(zip(set(labels2), sns.hls_palette(len(set(labels2)), l=0.5, s=0.8)))
row_colors2 = pd.DataFrame(labels2)[0].map(lut2)
# 把所有颜色行存成列表
row_colors_list = [row_colors, row_colors, row_colors2, row_colors2, row_colors2]

# 先绘制不带row_colors的clustermap,留出左侧空间
g = sns.clustermap(matrix, col_cluster=False, linewidths=0.1, cmap='coolwarm')

# 获取主热图的位置参数
main_heatmap_pos = g.ax_heatmap.get_position()

# 自定义颜色条的宽度和间距
color_bar_width = 0.025
spacing = 0.02
current_x_pos = main_heatmap_pos.x0 - color_bar_width - spacing

# 逐个添加颜色条
for colors in row_colors_list:
    # 创建新的axes用于显示颜色条
    ax = g.figure.add_axes([current_x_pos, main_heatmap_pos.y0, color_bar_width, main_heatmap_pos.height])
    # 把颜色值转成二维数组,用imshow绘制
    ax.imshow(colors.values.reshape(-1, 1), aspect='auto')
    # 隐藏坐标轴,让界面更整洁
    ax.set_xticks([])
    ax.set_yticks([])
    # 为下一个颜色条调整x位置
    current_x_pos -= color_bar_width + spacing

plt.show()

代码说明

  • 我们先绘制基础的clustermap,然后通过g.figure.add_axes()手动创建每个颜色条的位置,完全控制宽度和间距;
  • 这种方法还能轻松给每个颜色条添加标签(比如用ax.set_title()),适合需要更复杂可视化的场景。

内容的提问来源于stack exchange,提问作者Timo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:19:32