如何在Matplotlib散点直方图绘图中新增右下角自定义坐标轴
如何为散点边缘直方图新增右下角对齐坐标轴
问题描述
基于matplotlib axes_grid1 模块实现的散点+边缘直方图案例,原始运行效果如下:
原始实现代码如下:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable # 固定随机种子保证可复现 np.random.seed(19680801) # 生成随机测试数据 x = np.random.randn(1000) y = np.random.randn(1000) fig, axScatter = plt.subplots(figsize=(5.5, 5.5)) # 绘制主散点图 axScatter.scatter(x, y) axScatter.set_aspect(1.) # 在当前坐标轴的顶部、右侧创建新坐标轴放置直方图 # new_vertical/new_horizontal 方法的第一个参数为待创建坐标轴的英寸高度/宽度 divider = make_axes_locatable(axScatter) axHistx = divider.append_axes("top", 1.2, pad=0.1, sharex=axScatter) axHisty = divider.append_axes("right", 1.2, pad=0.1, sharey=axScatter) # 隐藏共享轴多余的刻度标签 axHistx.xaxis.set_tick_params(labelbottom=False) axHisty.yaxis.set_tick_params(labelleft=False) # 手动计算直方图分箱边界 binwidth = 0.25 xymax = max(np.max(np.abs(x)), np.max(np.abs(y))) lim = (int(xymax/binwidth) + 1)*binwidth bins = np.arange(-lim, lim + binwidth, binwidth) axHistx.hist(x, bins=bins) axHisty.hist(y, bins=bins, orientation='horizontal') # 设置直方图刻度 axHistx.set_yticks([0, 50, 100]) axHisty.set_xticks([0, 50, 100]) plt.draw() plt.show()
目标是在布局右下角新增坐标轴,实现对齐效果如下:
直接使用ax_cnr = divider.append_axes("right", 1.2, pad=0.1)会在现有右侧直方图的外侧追加新轴,无法落到右下角空位。
解决方法
不要基于主散点轴的分割器追加同方向的新轴,转而基于已经创建好的右侧直方图的分割器,向底部追加尺寸匹配的坐标轴,即可自动对齐到右下角空位。
在原始代码创建完axHisty的代码行之后,插入如下代码即可:
# 基于右侧直方图的布局分割器,向底部追加坐标轴 corner_divider = make_axes_locatable(axHisty) ax_corner = corner_divider.append_axes("bottom", 1.2, pad=0.1) # 隐藏角落轴的刻度标签,和整体布局风格匹配 ax_corner.tick_params(labelbottom=False, labelleft=False) # 如果不需要在角落轴显示内容,可直接关闭坐标轴显示 ax_corner.axis('off')
关键参数说明
- 追加轴的高度设置为
1.2,和顶部直方图的高度完全一致,保证纵向对齐 - 边距
pad=0.1和其他轴的边距保持一致,不会出现布局错位 - 追加的轴宽度自动和右侧直方图保持一致,不需要手动设置尺寸
如果需要在右下角轴放置自定义内容(比如统计指标、图例、注释),去掉ax_corner.axis('off')这行,正常调用绘图API即可。
内容的提问来源于stack exchange,提问作者Wind Circulation
相关产品推荐
相关产品推荐

