带色条的断轴散点图绘制问题:色条与右侧轴冲突
解决断轴散点图色条与坐标轴冲突问题
问题根源是默认的色条会占据右侧整个垂直区域,和上下两个子图的右侧坐标轴产生重叠。以下是两种可行的解决方法:
方法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
相关产品推荐
相关产品推荐

