缩放绘图轴以在多个绘图中保持相同大小的单位向量

缩放绘图轴以在多个绘图中保持相同大小的单位向量

我有一组 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 轴上有一个对数刻度,并且轴范围(xminymin等)也明确指定。

答案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}

相关内容