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

添加颜色条后Seaborn jointplot坐标轴网格不匹配问题求助

解决Seaborn jointplot(hist类型)添加颜色条后网格对齐问题

问题说明

使用Seaborn创建kind='hist'的jointplot时,添加颜色条会导致中心联合直方图与边缘的单个直方图网格错位,原因为添加颜色条的方式改变了中心轴尺寸,但边缘轴未同步调整。

修复方案

通过手动调整边缘直方图轴的位置,使其与修改后的中心轴尺寸匹配,即可解决对齐问题。以下是修复后的完整代码:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable

# 生成采样权重的函数
def generate_weights(n_bins:int, data:np.ndarray)->np.ndarray:
    hist_data, bin_edges = np.histogram(data, bins=n_bins)
    indices = np.digitize(data, bin_edges[:-1])-1
    weights = 1.0/hist_data[indices]
    return weights

# 生成测试数据
dataset_1 = np.random.normal(0, 50, size=1000)
dataset_2 = np.random.normal(9, 55, size=1000)

# 生成权重
weights_1 = generate_weights(50, dataset_1)

# 计算数据范围和分箱
min_val = min(np.min(dataset_1), np.min(dataset_2))
max_val = max(np.max(dataset_1), np.max(dataset_2))
bins_2d = (np.linspace(min_val, max_val, 100), np.linspace(min_val, max_val, 100))

# 创建jointplot,预留边缘空间
sns.set_style('darkgrid')
jointplot_hist = sns.jointplot(
    x=dataset_1,
    y=dataset_2,
    kind='hist',
    cmap='viridis',
    bins=bins_2d,
    weights=weights_1,
    space=0.1  # 避免边缘图与中心图重叠
)

# 设置轴标签和范围
jointplot_hist.set_axis_labels('dataset 1', 'dataset_2')
jointplot_hist.ax_joint.set_xlim([min_val, max_val])
jointplot_hist.ax_joint.set_ylim([min_val, max_val])

# 绘制对角线
jointplot_hist.ax_joint.plot([min_val, max_val], [min_val, max_val], color='red', linestyle='-', linewidth=0.5)

# 添加颜色条
divider = make_axes_locatable(jointplot_hist.ax_joint)
cax = divider.append_axes('right', size='5%', pad=0.05)
mappable = jointplot_hist.ax_joint.collections[0]
plt.colorbar(mappable, cax=cax)

# 关键:调整边缘直方图的位置,与中心轴对齐
pos_joint = jointplot_hist.ax_joint.get_position()
# 调整顶部x方向直方图
jointplot_hist.ax_marg_x.set_position([
    pos_joint.x0, 
    pos_joint.y1 + jointplot_hist.space, 
    pos_joint.width, 
    jointplot_hist.ax_marg_x.get_position().height
])
# 调整右侧y方向直方图
jointplot_hist.ax_marg_y.set_position([
    pos_joint.x1 + jointplot_hist.space, 
    pos_joint.y0, 
    jointplot_hist.ax_marg_y.get_position().width, 
    pos_joint.height
])

plt.show()

原理说明

  • 原代码中make_axes_locatable会压缩中心轴宽度以容纳颜色条,但边缘直方图轴仍保留原始布局的尺寸,导致错位。
  • 修复时先获取调整后的中心轴位置参数,再手动修改边缘轴的位置,让其宽度/高度与中心轴完全匹配,同时通过space参数预留空间避免布局重叠。

替代方案:使用JointGrid更灵活控制

如果需要更细粒度的布局控制,可直接使用JointGrid(jointplot的底层封装):

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable

def generate_weights(n_bins:int, data:np.ndarray)->np.ndarray:
    hist_data, bin_edges = np.histogram(data, bins=n_bins)
    indices = np.digitize(data, bin_edges[:-1])-1
    weights = 1.0/hist_data[indices]
    return weights

dataset_1 = np.random.normal(0, 50, size=1000)
dataset_2 = np.random.normal(9, 55, size=1000)
weights_1 = generate_weights(50, dataset_1)

min_val = min(np.min(dataset_1), np.min(dataset_2))
max_val = max(np.max(dataset_1), np.max(dataset_2))
bins_2d = (np.linspace(min_val, max_val, 100), np.linspace(min_val, max_val, 100))
bins_marginal = np.linspace(min_val, max_val, 100)

sns.set_style('darkgrid')
g = sns.JointGrid(x=dataset_1, y=dataset_2, space=0.1)
# 绘制联合直方图和边缘直方图
g.plot_joint(sns.histplot, bins=bins_2d, cmap='viridis', weights=weights_1)
g.plot_marginals(sns.histplot, bins=bins_marginal)

# 设置轴标签和范围
g.set_axis_labels('dataset 1', 'dataset_2')
g.ax_joint.set_xlim(min_val, max_val)
g.ax_joint.set_ylim(min_val, max_val)
g.ax_joint.plot([min_val, max_val], [min_val, max_val], color='red', linestyle='-', linewidth=0.5)

# 添加颜色条并调整边缘轴位置
divider = make_axes_locatable(g.ax_joint)
cax = divider.append_axes('right', size='5%', pad=0.05)
plt.colorbar(g.ax_joint.collections[0], cax=cax)

pos_joint = g.ax_joint.get_position()
g.ax_marg_x.set_position([pos_joint.x0, pos_joint.y1 + g.space, pos_joint.width, g.ax_marg_x.get_position().height])
g.ax_marg_y.set_position([pos_joint.x1 + g.space, pos_joint.y0, g.ax_marg_y.get_position().width, pos_joint.height])

plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 16:34:56