【问题标题】:Is there a way of using wildcards in gnuplot?有没有办法在 gnuplot 中使用通配符?
【发布时间】:2015-01-26 05:50:20
【问题描述】:

我有多个文件命名如下:blast_sample1_454LargeContigs.fna.fas_vs_NC_016593_filter.txt

变化的部分是“sample#”(样品)和“NC_#”(参考),用粗体表示。 每个参考有 35 个样本。 我编写了以下命令,使用 35 个样本的数据为参考 NC_016593 生成图:

filename(n) = sprintf("blast_sample%d_454LargeContigs.fna.fas_vs_NC_016593_filter.txt", n)
plot for [i=01:35] filename(i) using 9:3:($10-$9):($3-$3) with vectors nohead

对于每一个参考我都想做一个情节,因此为此我想写一个使用通配符的通用命令。有没有办法直接在gnuplot中做到这一点?是否可以使用通配符仅修改“NC_#”部分(如 shell 脚本中的 *,类似 NC_*)?

谢谢。

【问题讨论】:

标签: regex gnuplot wildcard


【解决方案1】:

这在 gnuplot 中是无法直接实现的。但是,您可以使用系统调用来获取要绘制的文件列表:

filelist=system("ls *.csv")
plot for [filename in filelist] filename using 1:2

因此,这里有一个示例,它为每个样本编号创建一个带有所有引用的图:

do for [i=1:35] { 
    cmd = sprintf("ls blast_sample%d_454LargeContigs.fna.fas_vs_NC_*_filter.txt", i)
    filelist=system(cmd)
    plot for [filename in filelist] filename using ...
}

如果您希望每个参考一个包含所有样本的图,如果参考编号不是一个简单的系列,则变得更加困难。如果您想将所有内容都绘制在一个大图中,可以使用

ls blast_sample*_454LargeContigs.fna.fas_vs_NC_*_filter.txt

(这是 Linux。对于 Windows,您需要 dir \B ...


编辑: 这个问答快三年了,直到最近的评论出现,我才注意到评论中的附加问题。

不清楚您所说的输出名称是什么意思。文件名?每条曲线的标签?剧情标题?

一般情况下是可以的

set terminal pdfcairo
do for [i=1:35] { 
    cmd = sprintf("ls blast_sample%d_454LargeContigs.fna.fas_vs_NC_*_filter.txt", i)
    filelist=system(cmd)
    set output sprintf("Sample_%d.pdf", i)

    title= sprintf("This is the title for plot %d", i)
    plot for [filename in filelist] filename using ... title sprintf("This data comes from %s", filename)
}
unset output

任何返回字符串的函数都可以用来构建你的字符串。

虽然样本编号被称为数字,但如果您想使用它,提取参考编号(在“NC”之后)有点棘手。 Gnuplot 有一些rudimentary string functions,这可能允许这样做。

如果参考编号始终具有相同的长度,我将使用 substr(filename,strlen(filename)-a,strlen(filename)-b)ab 的正确值来提取此编号。

如果没有,我会使用substr获取一个从参考号开始的字符串(位置可以计算),然后使用strstrt搜索_的第一次出现,然后剪掉串到这个位置。将此任务传递给外部命令行程序可能更容易。 Linux 的cut 可以轻松完成这项工作。

【讨论】:

  • 输出名称呢?我希望他们有参考名称。
  • @Fernando 只需附加 [title filename] (不带括号)即可用各自的名称标记图形。请注意,我遇到了名称中包含 _ 下划线的问题。他们会打印出不正确的字符,连字符 - 工作正常。 "filelist=system("ls *.csv") 使用 1:2 标题文件名绘制 [文件列表中的文件名] 文件名"
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 2021-04-20
相关资源
最近更新 更多