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();
关键说明
- 自动适配分栏数:修改
rows和cols的值,代码会自动调整所有Pad的边距和轴显示,无需手动修改每个Pad的参数。 - 绘图区域对齐:通过精准设置每个Pad的边距,保证所有直方图的有效绘图区域尺寸完全一致,不会因为标签占用空间导致大小差异。
- 冗余标签隐藏:仅保留最外层的轴标签,避免重复显示,让整体布局更整洁。
如果需要统一所有直方图的轴范围,直接在循环中添加SetXRangeUser/SetYRangeUser即可,进一步提升一致性。
内容的提问来源于stack exchange,提问作者smallest quanta
相关产品推荐
相关产品推荐

