PGF groupplots - 循环遍历文件名,然后拆分文件名以用于绘图

PGF groupplots - 循环遍历文件名,然后拆分文件名以用于绘图

我正在使用 PGFgroupplots库创建包含许多图像的图像网格。我正在使用 for 循环\pgfplotsforeachungrouped

每个文件名的结构如下:preamble_title_percent.jpg。我想通过拆分文件名来提取标题和百分比值。因此,我可以使用标题和百分比作为中的值\nextgroupplot。我该怎么做?

\foreach与PGF 中的普通函数不同,\pgfplotsforeachungrouped它仅使用两个参数。因此,我猜,它是在 中动态提取标题和百分比的唯一方法\edef

伪代码:

\pgfplotsforeachungrouped \filename in {
 preamble_title_percent.jpg
}
{
    \edef\temp{
            # How can I split the filename here?
            \def\title{???}
            \def\percent{???}
            \noexpand\nextgroupplot[
            title=\title,
            scale only axis,            
            enlargelimits=false,
            axis on top,
            xticklabels={},
            yticklabels={},
            colormap={blackwhite}{[1pt]
            rgb255(0 pt)=(0, 63, 92);
            rgb255(\percent pt)=(0, 63, 92);
            rgb255(16 pt)=(166,188,198);
            rgb255(20pt)=(166,188,198)
            },
            colorbar,
            point meta min = 0,
            point meta max = 20,
            colorbar style = {
            at={(0.9,0.65)},anchor=north west,
            height = 3cm,
            width = 0.3cm,
            yticklabel pos=left,
            yticklabel style = {
            text width = 2em,
            align = right,
            /pgf/number format/.cd,
                fixed,
                fixed zerofill,
                precision = 0,
            /tikz/.cd
        }
    }
    ]
    \noexpand\addplot[thick]
    graphics [
        xmin=0,
        ymin=0, 
        xmax=600,
        ymax=450
    ]{\noexpand\root /\filename}; % 
    }
    \temp
}

答案1

使用xparse(现在大多数 TeX 发行版都内置了它),您可以使用它\SplitArgument来将参数拆分为某个字符,包括特殊字符。如果我们\splitAtUnder为下划线和\splitAtPeriod句点定义一个宏,我们就可以从文件名称中提取标题和百分比值。

\documentclass{standalone}
%\usepackage{xparse} % uncomment if you have an older TeX distribution
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=1.18}

\NewDocumentCommand\splitAtUnder {>{\SplitArgument{2}{_}} m}{\assignValues#1}
\NewDocumentCommand\splitAtPeriod{>{\SplitArgument{1}{.}} m}{\assignPercent#1}

\def\assignValues#1#2#3{
  \gdef\subplotTitle{#2}
  \splitAtPeriod{#3}
}
\def\assignPercent#1#2{
  \gdef\percent{#1}
}

\begin{document}

\begin{tikzpicture}
\begin{groupplot}[group style={{group size=2 by 2},vertical sep=2cm}]
\pgfplotsforeachungrouped \filename in {
  example_cat_10.jpg,
  example_dog_20.jpg,
  example_duck_30.jpg,
  example_penguin_40.jpg
}
{
  \edef\splitAtUnderAxis{
    \splitAtUnder{\filename}
  }
  \splitAtUnderAxis
  \edef\setAxis{
    \noexpand\nextgroupplot[
      title=\noexpand\bfseries\subplotTitle,
      colormap={blackwhite}{[1pt]
        rgb255(0pt)         = (  0, 63, 92);
        rgb255(\percent pt) = (  0, 63, 92);
        rgb255(50pt)        = (166,188,198);
        rgb255(60pt)        = (166,188,198);
      },
    ]
    \noexpand\addplot[thick] graphics[xmin=0,ymin=0,xmax=600,ymax=450]{\filename};
  }
  \setAxis
}
\end{groupplot}
\end{tikzpicture}

\end{document}

让我们看看这段代码实际上产生了什么。给定四张具有以下文件名的图像,

example_cat_10.jpg
example_dog_20.jpg
example_duck_30.jpg
example_penguin_40.jpg

然后 PGFPlots 将自动用图像文件名中间部分的名称为每个图添加标题:

一组四个故事情节,两两排列。按阅读顺序,故事情节分别是猫、狗、鸭子和企鹅。每个故事情节都有一个与所描绘的动物相匹配的标题。

(四张图片均来自 Pixabay。)

相关内容