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

如何正确显示带X/Y直方图和颜色条的Matplotlib散点图

解决带直方图散点图添加颜色条后轴对齐问题

问题根源

使用make_axes_locatable时,它会默认分割当前子图所在的布局空间,而带X/Y轴直方图的散点图通常依赖紧密的布局规划(比如gridspec或subplot2grid),这种分割操作会打乱原有布局的宽高比例,最终导致上方的ax_histx轴被拉伸错位。

调整ax_histx轴对齐的方法

1. 手动重置轴位置与尺寸

在创建完ax_histx后,直接获取主散点图的位置参数,强制同步ax_histx的宽度:

# 假设已创建主散点图ax_scatter和上方直方图ax_histx
scatter_pos = ax_scatter.get_position()
# 设置ax_histx的位置:x/y起始坐标与主图一致,宽度完全匹配,高度按需设置
ax_histx.set_position([scatter_pos.x0, scatter_pos.y1 + 0.01, scatter_pos.width, 0.15])

2. 用GridSpec统一管控所有子图布局

提前用GridSpec规划主散点图、X/Y直方图、颜色条的位置,从根源避免make_axes_locatable对布局的干扰:

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

# 创建画布并规划网格:3行4列,分配不同区域的宽高比例
fig = plt.figure(figsize=(8, 8))
gs = GridSpec(3, 4, width_ratios=[1, 1, 0.1, 0.05], height_ratios=[0.15, 1, 1])

# 分配子图位置
ax_scatter = fig.add_subplot(gs[1:3, 0:2])  # 主散点图占下方2行前2列
ax_histx = fig.add_subplot(gs[0, 0:2], sharex=ax_scatter)  # X直方图占第一行前2列
ax_histy = fig.add_subplot(gs[1:3, 2], sharey=ax_scatter)  # Y直方图占下方2行第3列
ax_cbar = fig.add_subplot(gs[1:3, 3])  # 颜色条占下方2行第4列

# 绘制内容
scatter = ax_scatter.scatter(x_data, y_data, c=z_data)  # 带颜色维度的散点图
ax_histx.hist(x_data, bins=20)
ax_histy.hist(y_data, bins=20, orientation='horizontal')

# 添加颜色条
plt.colorbar(scatter, cax=ax_cbar)

# 隐藏冗余轴标签,优化视觉效果
ax_histx.tick_params(axis='x', labelbottom=False)
ax_histy.tick_params(axis='y', labelleft=False)

plt.tight_layout()
plt.show()

更优的颜色条添加方案

1. 提前预留独立子图放颜色条

像上面的GridSpec示例一样,在布局规划阶段就给颜色条分配独立的子图空间,完全不会影响直方图和主图的布局对齐,这是最稳妥的方案。

2. 调整make_axes_locatable的pad参数减少挤压

如果一定要用make_axes_locatable,可以通过调整pad参数缩小颜色条与主图的间距,降低对主图宽度的挤压,再手动同步ax_histx的宽度:

from mpl_toolkits.axes_grid1 import make_axes_locatable

# 主散点图绘制完成后
divider = make_axes_locatable(ax_scatter)
# 调整size和pad参数,减少颜色条对主图的空间占用
ax_cbar = divider.append_axes("right", size="5%", pad=0.1)
plt.colorbar(scatter, cax=ax_cbar)

# 同步ax_histx与主图的宽度
scatter_pos = ax_scatter.get_position()
ax_histx.set_position([scatter_pos.x0, scatter_pos.y1 + 0.01, scatter_pos.width, 0.15])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:10:28