向 \DTLplot (dataplot 包) 添加条件

向 \DTLplot (dataplot 包) 添加条件

我已经使用该软件包datatool一段时间了,我想制作我创建的数据库的图表。但我不想绘制数据库中的所有行,所以我想使用条件。这是从 -package 手册中摘录的datatool

\DTLplot[<condition>]{<db list>}{<settings>}

此命令创建一个图(在 tikzpicture 环境中),其中包含 中列出的数据库中给出的所有数据<db list>,该数据库应为以逗号分隔的数据库名称列表。可选参数<condition>与 的参数相同\DTLforeach<settings>参数是逗号分隔的对列表 <setting>=<value>。有两个必须指定的设置xy。其他设置是可选的。

在下一部分中,我将向不熟悉该软件包的人解释 datatool 的工作原理。如果您已经知道它的工作原理,请跳到下一个标题。

datatool 简介

我来举个例子\DTLforeach。创建文件 score.txt,内容如下:

FirstName,Surname,StudentNo,Score
John,Smith,102689,68
Jane,Brown,102647,75
Andy,Brown,103569,42
Zoe,Adams,105987,52
Roger,Brady,106872,58
Clare,Verdon,104356,45

加载并打印数据库的代码:

\documentclass{article}
\usepackage{datatool}
\DTLloaddb{score}{score.txt}  % create the database score

\begin{document}
  \DTLdisplaydb{score}  % prints the database
\end{document}

粗体文本称为键、标题或标识符。它们可用于将数据分配给命令。我将使用命令来解释\DTLforeach

该命令\DTLforeach[<condition>]{<db name>}{<assign list>}{<text>}遍历数据库的每一行,并在满足条件<text>时执行<condition>。例如,当我想计算有多少名学生的分数大于 60 时,我可以这样写:

\documentclass{article}
\usepackage{datatool}
\DTLloaddb{score}{score.txt}

\begin{document}
  \newcounter{nostudents}
  \DTLforeach[\DTLisgt{\Score}{60}]{score}{\Score=Score}{\stepcounter{nostudents}}
  A total of \arabic{nostudents}\ have a score higher than 60.
\end{document}

分配列表的工作方式如下:<cmd>=<key>,其中每行的列值Score存储在中\Score。该命令\DTLisgt只是检查参数 2 是否大于参数 1。

我的实际问题

我将使用与上一节相同的文件,现在我想制作一张(无用的)图表(在本例中),其中学生的分数大于 60 与其学生编号的对比。制作每个人的图表很简单:\DTLplot{score}{x=StudentNo, y=Score}可以完成这项工作。但有条件的话,我需要一个,<assign list>但似乎没有\DTLplot。所以写

\DTLplot[\DTLisgt{\Score}{60}]{score}{x=StudentNo, y=Score}

会导致错误,因为他不知道命令\Score。在最后一个参数中添加 \Score=Score 也会导致同样的错误。

如果您能告诉我您是否知道解决方案,那就太好了。如果我没有得到任何答复,我会联系软件包维护者。我不喜欢用糟糕的问题打扰他:)

答案1

这似乎是dataplot包中的一个错误。它调用

\@sDTLforeach[#1]{\dtl@thisdb}{\dtl@x=\dtl@xkey,%
  \dtl@y=\dtl@ykey}{...

因此,它传递了条件,但没有提供添加的机会assign list。我认为不可能从外部向内部 foreach 的这个赋值列表添加内容。请注意,该settings参数甚至不是为了提供这样的功能。

在这种特殊情况下,您可以使用以下miny设置:

\DTLplot{score}{x=StudentNo, y=Score, miny=60}  

当然,这并不能实现任意条件,而且不幸的是,它不会改变绘制的 x 值的范围。

无论如何,这种绘图类型可能不适合示例中给出的那种数据和关系。该databar包提供了一种创建条形图的方法,并允许使用条件。代码如下

\DTLbarchart[\DTLisgt{\Score}{60}]{
    barlabel=\StudentNo,
    upperbarlabel=\Score,
    variable=\Score}{score}
    {\Score=Score,\StudentNo=StudentNo}

无法\DTLplot使用 进行修补,因为它需要一个可选参数,而我不必解决这个问题。此外,还必须更改以下内容:etoolboxxpatch

\DTLcomputebounds[#1]{#2}{\dtl@xkey}{\dtl@ykey}
  {\DTLminX}{\DTLminY}{\DTLmaxX}{\DTLmaxY}%

如果您查看文档,您会发现\DTLcomputebounds没有可选参数,也没有办法传递assign list。但实现确实包含可选参数。换句话说,这看起来有点像一项正在进行的工作。

相关内容