在 foreach 循环中任意更改 pgfplots 中的轴属性

在 foreach 循环中任意更改 pgfplots 中的轴属性

我有一堆图,我想将它们作为子图插入到更大的图中。由于它们共享相同的 y 轴,我不想浪费空间为每个图重复相同的轴和刻度标签,因此只想将标签放在每行最左侧的图上(每行的图数可以是任意的),并在每行最右侧的图上添加图例(在不同的位置)

MWE 是:

\documentclass{article}
\usepackage{pgfplots}
\usepackage{geometry}
\usepackage{subfig}
\usepackage{adjustbox}
\usepackage{ifthen}
\begin{document}
\begin{figure}
\centering
\def\plotlist{3/2,2/3,-4/-2,-2/-4,-3/-4}
\def\fplotwidth{0.33}
\def\plotsepdist{-0.8cm}
\def\plotlinebreak{2}

\foreach \i/\j [count=\plotcount] in \plotlist{
    \subfloat[$f_1: \i{}x^2$, $f_2: \j{}x^2$]{
        \adjustbox{max width=\fplotwidth\linewidth}{
        \begin{tikzpicture}
        
        \begin{axis}[xlabel=xlabel text,
                     xlabel near ticks,
                     yticklabels={,,},
                     ymin=-10,
                     ymax=10,
                     xmin=-2,
                     xmax=2]
        
        % \ifthenelse{\plotcount=1 \or \plotcount=3}{INSERT Y TICK LABELS AND Y AXIS LABEL (near yticks)}
        % \ifthenelse{\plotcount=2}{\legend{$f_1$,$f_2$} (in bottom right}{}
        % \ifthenelse{\plotcount=5}{\legend{$f_1$,$f_2$} (in top right}{}
        
        \addplot[blue] {\i*x^2};
        \addplot[red] {\j*x^2};
        % Plot code
        \end{axis}
        \end{tikzpicture}
        }
    }
\ifthenelse{\plotcount=\plotlinebreak}{\\}{\hspace{\plotsepdist}}
}
\caption{The main caption}
\end{figure}
\end{document}

生产:

在此处输入图片描述

我想将ylabel=ylabel text和添加ylabel near ticks到轴属性中,并重新打开yticklabels(在本例中)\plotcount=1\plotcount=3。此外,我想添加\legend{$f_1$,$f_2$}\plotcount=2\plotcount=5并将其放置在图 2 的右下角和图 5 的右上角。在设置轴属性后,有没有办法更改它们?

答案1

您可以在环境\pgfplotsset内部使用axis将某些选项添加到已经存在的选项中。

如果只对某些图设置 y 刻度,图的缩放比例会有所不同。因此我添加了一行设置边界框的代码。

因此,你可以这样做:

\documentclass{article}
\usepackage{geometry}
\usepackage{pgfplots}
\usepackage{subfig}
\usepackage{adjustbox}
\usepackage{ifthen}

\begin{document}
\begin{figure}
\centering
\def\plotlist{3/2,2/3,-4/-2,-2/-4,-3/-4}
\def\fplotwidth{0.33}
\def\plotsepdist{-0.8cm}
\def\plotlinebreak{2}

\foreach \i/\j [count=\plotcount] in \plotlist{
    \subfloat[$f_1: \i{}x^2$, $f_2: \j{}x^2$]{
        \adjustbox{max width=\fplotwidth\linewidth}{
        \begin{tikzpicture}
        
        \begin{axis}[xlabel near ticks,
                     ylabel near ticks,
                     ymin=-10,
                     ymax=10,
                     xmin=-2,
                     xmax=2,
                     legend pos=north east]
        
        \ifthenelse{\not \plotcount=1 \and \not \plotcount=3}{
            \pgfplotsset{yticklabels={,,}}
        }{}
        \ifthenelse{\plotcount=2}{
            \pgfplotsset{legend pos=south east}
            \legend{$f_1$,$f_2$}
        }{}
        \ifthenelse{\plotcount=5}{
            \legend{$f_1$,$f_2$}
        }{}
        
        \addplot[blue] {\i*x^2};
        \addplot[red] {\j*x^2};
        % Plot code
        \end{axis}
        
        \pgfresetboundingbox
        \path ([shift={(-10pt,-10pt)}]current axis.south west)
        rectangle ([shift={(10pt,10pt)}]current axis.north east);
        
        \end{tikzpicture}
        }
    }
\ifthenelse{\plotcount=\plotlinebreak}{\\}{\hspace{\plotsepdist}}
}
\caption{The main caption}
\end{figure}
\end{document}

在此处输入图片描述

相关内容