缩放和修剪 pgfplots 图片中的空白区域

缩放和修剪 pgfplots 图片中的空白区域

在回答如何使用两条导入的曲线创建组合图形并使用 Tikz 在其周围绘制?,我能够让我的图表填充两条水平线之间的空间,如图所示这里。然而,当我尝试导入dat文件时,遇到了困难。

我的第一个问题是扩展。我以为我可以使用键height来固定图像的高度。但它的表现并不像我想象的那样:

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\def\myimage#1{%%
    \begin{tikzpicture}%%[x=#1,y=#1]
      \begin{axis}[
        height=#1,
        hide axis,
        no markers,
      ]
      \addplot + table[x index=0, y index=1]{vp1.dat};
      \end{axis}
  \end{tikzpicture}}

\pagestyle{empty}
\begin{document}

\begin{tikzpicture}
  \draw (0,0) -- ++(6,0)
        (0,4) -- ++(6,0);
  \node[inner sep=0pt,draw,red] at (3,2) {\myimage{4cm}};
\end{tikzpicture}

\end{document}

在此处输入图片描述

我希望红色框的顶部和底部与黑色水平线齐平。

我的第二个问题正在删除所有空白。当我隐藏轴时,我希望图表的边界框尽可能紧密地贴合。换句话说,红色边框应该紧贴图表的蓝色。

这是我的vp1.dat文件:

1 3
2 4
3 -5
4 6

这是我的vp2.dat文件:

1 3
2 4
3 1
4 3

更新

我的问题有部分解决方案,但没有综合解决方案。

第一个问题的解决方案

关于第一个问题,我可以pgfplot通过组合使用来填充所需的效果

scale only axis
height=#2

梅威瑟:

\documentclass{article}
\usepackage[margin=0.5in]{geometry}
\usepackage{tikz}
\usepackage{pgfplots}
\def\myimage#1#2{%%
    \begin{tikzpicture}
      \begin{axis}[
        scale only axis,
        height=#2,
        hide axis,
        no markers,
      ]
      \addplot + table[x index=0, y index=1]{#1};
      \end{axis}
  \end{tikzpicture}}

\pagestyle{empty}
\begin{document}

\begin{tikzpicture}
  \draw (0,0) -- ++(6,0)
        (0,4) -- ++(6,0);
  \node[anchor=south] at (3,4) {\texttt{height=4cm} passed to \texttt{pgfplots}};
  \node[inner sep=0pt,draw,red] at (3,2) {\myimage{vp1.dat}{4cm}};
  \draw[<->] (6.25,0) -- ++(0,4) node [midway,right]{4cm};
\end{tikzpicture}

\end{document}

结果是:

在此处输入图片描述

第二个问题的解决方法

关于第二个问题,我可以pgfplot通过同时使用来修剪我不想要的多余空白

clip bounding box=upper bound
hide axis

梅威瑟:

\documentclass{article}
\usepackage[margin=0.5in]{geometry}
\usepackage{tikz}
\usepackage{pgfplots}
\def\myimage#1#2{%%
    \begin{tikzpicture}
      \begin{axis}[
        clip bounding box=upper bound,
        hide axis,
        no markers,
      ]
      \addplot + table[x index=0, y index=1]{#1};
      \end{axis}
  \end{tikzpicture}}

\pagestyle{empty}
\begin{document}

\begin{tikzpicture}
  \node[anchor=south] at (3,4.35) {graph fits snuggly in its bounding box};
  \node[inner sep=0pt,draw,red] at (3,2) {\myimage{vp1.dat}{4cm}};
\end{tikzpicture}

\end{document}

结果是:

在此处输入图片描述

无法采用综合方法

但是当我尝试结合这两种方法时,高度没有得到正确遵循,而且我无法弄清楚它是如何计算的。

\documentclass{article}
\usepackage[margin=0.5in]{geometry}
\usepackage{tikz}
\usepackage{pgfplots}
\def\myimage#1#2{%%
    \begin{tikzpicture}
      \begin{axis}[
        scale only axis,
        clip bounding box=upper bound,
        height=#2,
        hide axis,
        no markers,
      ]
      \addplot + table[x index=0, y index=1]{#1};
      \end{axis}
  \end{tikzpicture}}

\pagestyle{empty}
\begin{document}

\begin{tikzpicture}
  \draw (0,0) -- ++(6,0)
        (0,4) -- ++(6,0);
  \node[anchor=south] at (3,4) {combining \texttt{clipping} and \texttt{height}};
  \node[inner sep=0pt,draw,red] at (3,2) {\myimage{vp1.dat}{4cm}};
  \draw[<->] (6.25,0) -- ++(0,4) node [midway,right]{4cm};
\end{tikzpicture}
\end{document}

结果是:

在此处输入图片描述

答案1

您想与和enlargelimits=false结合。默认在图周围添加一些空白,然后将其删除。scale only axisheightpgfplotsenlargelimits=false

在此处输入图片描述

\documentclass{article}
\usepackage[margin=0.5in]{geometry}
\usepackage{tikz}
\usepackage{pgfplots}
\def\myimage#1#2{%%
    \begin{tikzpicture}
      \begin{axis}[
        scale only axis,
        height=#2,
        hide axis,
        no markers,
        enlargelimits=false
      ]
      \addplot + table[x index=0, y index=1]{#1};
      \end{axis}
  \end{tikzpicture}}

\pagestyle{empty}
\begin{document}

\begin{tikzpicture}
  \draw (0,0) -- ++(6,0)
        (0,4) -- ++(6,0);
  \node[anchor=south] at (3,4) {\texttt{enlargelimits}, \texttt{scale only axis} and \texttt{height}};
  \node[inner sep=0pt,draw,red] at (3,2) {\myimage{vp1.dat}{4cm}};
  \draw[<->] (6.25,0) -- ++(0,4) node [midway,right]{4cm};
\end{tikzpicture}
\end{document}

答案2

我希望有人能够给出一个完全符合tikzpgfplots指令的答案。

这是一个解决方案,可以让我两个都剪掉多余的空白将盒子设置为所需的高度。

我的方法是使用pgfplots通过以下方式剪切额外空白的功能

hide axis
clip bounding box=upper bound

然后我将图形保存到一个框中(或者,我可以将其放在自己的standalone文件中)。然后我根据保存的框的大小进行缩放。

\documentclass{article}
\usepackage[margin=0.5in]{geometry}
\usepackage{tikz}
\usepackage{pgfplots}

\def\myimageSnug#1{%%
    \begin{tikzpicture}
      \begin{axis}[
        clip bounding box=upper bound,
        hide axis,
        hide axis,
        no markers,
      ]
      \addplot + table[x index=0, y index=1]{#1};
      \end{axis}
  \end{tikzpicture}}

\pagestyle{empty}
\begin{document}

\newsavebox{\myimagebox} 
\savebox{\myimagebox}{\myimageSnug{vp1.dat}}
\begin{tikzpicture}
  \draw (0,0) -- ++(6,0)
        (0,4) -- ++(6,0);
  \node[anchor=south] at (3,4.35) {\footnotesize graph fits snuggly in its bounding box \textbf{and} it's the correct height};

  \node[inner sep=0pt,draw,red,scale=4cm/\ht\myimagebox] at (3,2) {\usebox{\myimagebox}};
\end{tikzpicture}%%

\end{document}

导致

在此处输入图片描述

或者,我可以使用standalone名为的文件graph_01

\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}

\begin{tikzpicture}
  \begin{axis}[
    clip bounding box=upper bound,
    hide axis,
    hide axis,
    no markers,
  ]
  \addplot + table[x index=0, y index=1]{vp1.dat};
  \end{axis}
\end{tikzpicture}

\end{document}

然后导入它:

\documentclass{article}
\usepackage{graphicx}
\usepackage[margin=0.5in]{geometry}
\usepackage{tikz}
\usepackage{pgfplots}
\pagestyle{empty}
\begin{document}

\begin{tikzpicture}
  \draw (0,0) -- ++(6,0)
        (0,4) -- ++(6,0);
  \node[anchor=south] at (3,4.35) {\footnotesize graph fits snuggly in its bounding box \textbf{and} it's the correct height};

  \node[inner sep=0pt,draw,red] at (3,2) {\includegraphics[height=4cm]{graph_01}};
\end{tikzpicture}%%

\end{document}

相关内容