我有一组 PGFplots 分组图,有点类似于以下 MWE。图的顶行范围比底行大。有没有办法自动计算顶行的高度,使得两行的垂直比例(每像素的绘图坐标)相同?
对于以下示例,顶行的范围是 -5 到 15(让我忽略enlarge limits
这一点),底行的范围是 -5 到 5。因此,我希望顶行的高度是底行的两倍,但我不想明确地对其进行编码。如果我将顶行的限制更改为 (-5,10),那么顶行的高度应该自动变为底行的 1.5 倍。如果我将顶行的限制更改为 (-5,0),那么顶行的高度应该自动变为底行的 0.5 倍。
\documentclass{article}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=1.10}
\begin{document}
\begin{tikzpicture}
\begin{groupplot}[
width=0.5\textwidth,
group style={
group size=2 by 2,
x descriptions at=edge bottom,y descriptions at=edge left,
horizontal sep=0pt,vertical sep=0pt
}
]
\nextgroupplot
\addplot {2*x+5};
\nextgroupplot
\addplot {2*x+5};
\nextgroupplot
\addplot {x};
\nextgroupplot
\addplot {x};
\end{groupplot}
\end{tikzpicture}
\end{document}
以下是对上述示例进行编译的结果:
以下是我希望它看起来的样子(或类似这样):
事实上,第二幅图像中的刻度每 2 个单位出现一次,而不是每 5 个单位出现一次,这有点不理想,但我可以处理这个问题。
我需要考虑的其他一些因素思考是无关的(因此我将它们排除在 MWE 之外):在实际情况下,该图在 y 轴上有一个对数刻度,并且轴范围(xmin
,ymin
等)也明确指定。
答案1
您可以使用y post scale
。虽然这是一种手动方法,因为您必须指定值,但它会生成您想要的精确图。
\documentclass{article}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=1.10}
\begin{document}
\begin{tikzpicture}
\begin{groupplot}[
width=0.5\textwidth,
group style={
group size=2 by 2,
x descriptions at=edge bottom,y descriptions at=edge left,
horizontal sep=0pt,vertical sep=0pt
}
]
\nextgroupplot[y post scale=3]
\addplot {2*x+5};
\nextgroupplot[y post scale=3]
\addplot {2*x+5};
\nextgroupplot
\addplot {x};
\nextgroupplot
\addplot {x};
\end{groupplot}
\end{tikzpicture}
\end{document}
我们y post scale=2
得到
答案2
我从 Kumar 那里偷来了 y 后尺度方法,但添加了根据数据计算尺度所需的代码。
\documentclass{article}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=1.10}
\newsavebox{\tempbox}
\newlength{\topscl}
\newlength{\bottomscl}
\newcommand{\computescale}[4]% #1 = macro to store answer, #2 = width used (or \axisdefaultwidth),
% #3 = \addplots for top row, #4 = \addplots for bottom row
{\savebox{\tempbox}{% get y scale for top row
\begin{tikzpicture}
\begin{axis}[width=#2,xtick=\empty]
#3
\coordinate (A) at (axis cs:0,0);
\coordinate (B) at (axis cs:0,1);
\end{axis};
\pgfextracty{\topscl}{\pgfpointdiff{\pgfpointanchor{A}{center}}{\pgfpointanchor{B}{center}}}
\global\topscl=\topscl
\end{tikzpicture}}
\savebox{\tempbox}{% get y scale for bottom row
\begin{tikzpicture}
\begin{axis}[width=#2]
#4
\coordinate (A) at (axis cs:0,0);
\coordinate (B) at (axis cs:0,1);
\end{axis};
\pgfextracty{\bottomscl}{\pgfpointdiff{\pgfpointanchor{A}{center}}{\pgfpointanchor{B}{center}}}
\global\bottomscl=\bottomscl
\end{tikzpicture}}
\pgfmathparse{\bottomscl/\topscl}%
\let#1=\pgfmathresult}
\begin{document}
\computescale{\scale}{0.5\textwidth}{\addplot {2*x+5};}{\addplot {x};}
scale = \scale
\begin{tikzpicture}
\begin{groupplot}[
width=0.5\textwidth,
group style={
group size=2 by 2,
x descriptions at=edge bottom,y descriptions at=edge left,
horizontal sep=0pt,vertical sep=0pt
}
]
\nextgroupplot[y post scale=\scale]
\addplot {2*x+5};
\nextgroupplot[y post scale=\scale]
\addplot {2*x+5};
\nextgroupplot
\addplot {x};
\nextgroupplot
\addplot {x};
\end{groupplot}
\end{tikzpicture}
\end{document}