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

CERN ROOT零间距多面板绘图:如何统一直方图标签尺寸?

CERN ROOT零间距多面板绘图:轴标签统一与尺寸对齐方案

你遇到的问题是ROOT中用Divide(2,2,0,0)做零间距分栏时,仅左列、底行的直方图显示轴标签,且手动调整效率低。下面是无需反复手动修改的自动化解决方案:

核心思路

通过按Pad位置自动设置边距+控制轴显示,让所有直方图的绘图区域(排除标签占用空间)完全一致,同时仅在最外层(左列、底行)显示轴标签,内部Pad隐藏冗余标签。

完整实现代码

int rows = 2;
int cols = 2;
double outer_margin = 0.15; // 外层标签占用的边距

TCanvas *c = new TCanvas("c", "Multi-panel plot", 800, 800);
c->Divide(cols, rows, 0, 0); // 零间距分栏

for(int i=0; i<rows*cols; i++){
    int pad_idx = i + 1;
    TPad *pad = (TPad*)c->GetPad(pad_idx);
    
    // 计算当前Pad所在的行和列(行从0开始,顶部为0,底部为rows-1)
    int row = i / cols;
    int col = i % cols;
    
    // 设置边距:仅左列留左margin,仅底行留底margin,其余边距设为0
    pad->SetLeftMargin(col == 0 ? outer_margin : 0);
    pad->SetBottomMargin(row == rows-1 ? outer_margin : 0);
    pad->SetRightMargin(0);
    pad->SetTopMargin(0);
    
    pad->cd();
    histogram[i]->Draw("HIST"); // 用HIST确保绘图样式统一
    
    // 控制轴显示:非左列隐藏Y轴标签/标题,非底行隐藏X轴标签/标题
    TH1 *h = histogram[i];
    if(col != 0){
        h->GetYaxis()->SetLabelSize(0);
        h->GetYaxis()->SetTitleSize(0);
        h->GetYaxis()->SetTickLength(0); // 可选:隐藏Y轴刻度
    }
    if(row != rows-1){
        h->GetXaxis()->SetLabelSize(0);
        h->GetXaxis()->SetTitleSize(0);
        h->GetXaxis()->SetTickLength(0); // 可选:隐藏X轴刻度
    }
    
    // 统一所有轴的范围(如果需要)
    // h->SetXRangeUser(x_min, x_max);
    // h->SetYRangeUser(y_min, y_max);
}

c->Update();

关键说明

  1. 自动适配分栏数:修改rows和cols的值,代码会自动调整所有Pad的边距和轴显示,无需手动修改每个Pad的参数。
  2. 绘图区域对齐:通过精准设置每个Pad的边距,保证所有直方图的有效绘图区域尺寸完全一致,不会因为标签占用空间导致大小差异。
  3. 冗余标签隐藏:仅保留最外层的轴标签,避免重复显示,让整体布局更整洁。

如果需要统一所有直方图的轴范围,直接在循环中添加SetXRangeUser/SetYRangeUser即可,进一步提升一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:06:12