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

带色条的断轴散点图绘制问题:色条与右侧轴冲突

解决断轴散点图色条与坐标轴冲突问题

问题根源是默认的色条会占据右侧整个垂直区域,和上下两个子图的右侧坐标轴产生重叠。以下是两种可行的解决方法:

方法1:使用make_axes_locatable创建独立色条轴

这种方法可以让色条高度匹配子图整体,避免重叠:

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

x = [1, 2]
y = [1, 2]
z = [0.1, 0.2]

fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(6, 8))
fig.subplots_adjust(hspace=0.05)

# 绘制散点图,用同一个scatter对象统一色条(z值一致,无需重复创建)
sc = ax1.scatter(x, y, c=z)
ax2.scatter(x, y, c=z)

# 为子图创建可分割的轴对象,专门放置色条
divider = make_axes_locatable(ax2)
cax = divider.append_axes("right", size="5%", pad=0.1)
# 若想让色条覆盖两个子图高度,也可以基于整个画布创建:
# cax = fig.add_axes([0.92, 0.1, 0.03, 0.8])

# 添加色条
fig.colorbar(sc, cax=cax)

# 设置坐标轴范围
ax1.set_ylim(35, 45)
ax2.set_ylim(10, 15)

# 隐藏中间边框
ax1.spines.bottom.set_visible(False)
ax2.spines.top.set_visible(False)
ax1.xaxis.tick_top()
ax1.tick_params(labeltop=False)
ax2.xaxis.tick_bottom()

# 添加断轴斜线标记
d = .5
kwargs = dict(marker=[(-1, -d), (1, d)], markersize=12,
              linestyle="none", color='k', mec='k', mew=1, clip_on=False)
ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs)
ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs)

plt.show()

方法2:调整子图布局,为色条预留空间

通过修改画布边距,给右侧留出足够空间放置色条:

import numpy as np
import matplotlib.pyplot as plt

x = [1, 2]
y = [1, 2]
z = [0.1, 0.2]

fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(6, 8))
# 调整右侧边距,预留色条空间
fig.subplots_adjust(hspace=0.05, right=0.85)

sc = ax1.scatter(x, y, c=z)
ax2.scatter(x, y, c=z)

# 指定色条位置和尺寸,关联两个子图
cbar = fig.colorbar(sc, ax=[ax1, ax2], fraction=0.05, pad=0.05)

# 坐标轴设置与斜线标记
ax1.set_ylim(35, 45)
ax2.set_ylim(10, 15)

ax1.spines.bottom.set_visible(False)
ax2.spines.top.set_visible(False)
ax1.xaxis.tick_top()
ax1.tick_params(labeltop=False)
ax2.xaxis.tick_bottom()

d = .5
kwargs = dict(marker=[(-1, -d), (1, d)], markersize=12,
              linestyle="none", color='k', mec='k', mew=1, clip_on=False)
ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs)
ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs)

plt.show()

关键说明

  • 两种方法均避免了色条与子图坐标轴的重叠,方法1灵活性更高,方法2操作更简洁。
  • 由于两个子图的z值完全一致,只需用一个散点对象创建色条即可,无需重复操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:18:36