在gnuplot标题中显示下划线而不是下标

31

简短问题: 如何在gnuplot中从变量名中显示一个下划线字符_(underscore)

详细信息: 我有类似以下代码的东西:

items = "foo_abc foo_bcd bar_def"
do for [item in items] {
  set title item
  set output item.eps
  plot item."-input.txt" using 1:2 title item with linespoints
}

这在gnuplot中可以正常工作,除了标题会从foo_abc变成fooabc。我不知道是否应该使用转义字符,因为我不想将其放入文件名中。我尝试过一些单引号与双引号的不同选项,但还没有找到我需要的。


在您的情况下,字符串名称中的下划线是否总是在同一位置?也就是说,len('foo')==len('bar')吗?如果是这样,我可能有一个部分解决方案。 - andyras
仅返回翻译后的文本:没有那些只是我给出的示例中的东西。 - Gabriel Southern
1
好的。你尝试过在PostScript终端中使用noenhanced选项吗? - andyras
我刚试了一下,现在似乎可以工作,尽管我不知道enhance和noenhanced之间的区别,或者以后是否需要这些功能。无论如何,你的答案解释了正在发生的事情,如果需要,我可以使用其他技术来获取带有和不带转义字符的名称。谢谢。 - Gabriel Southern
5个回答

31

不要写 foo_abc,写成 foo\\\_abc


2
最佳答案! - Hitanshu Sachania

26

大多数生成标签的gnuplot命令接受一个noenhanced关键字,这将防止gnuplot仅为该字符串使用增强文本。在这种情况下,只需要执行以下操作:

set title item noenhanced

另一种方法是创建一个函数,在将字符串传递给 set output 时从中删除不需要的文本:

remove(x,s)=(i0=strstrt(s,x),i0 ? remove(x,s[:i0-1].s[i0+strlen(x):]):s)
# Makes me wish gnuplot syntax was more pythonic :-p
#TODO:  Write a `replace` function :-).  These just might go into my ".gnuplot" file...

我使用内联函数来查找字符串s中第一个出现的x的索引。然后通过字符串连接和切片删除该出现并递归调用函数以删除下一个出现。如果没有找到索引(strstrt返回0),则只需返回输入的字符串即可。现在你可以这样做:

set output remove('\',item)
set title item

1
非常好的回答!我不知道单个标签的noenhanced标志。我想做一个像你的递归函数一样的东西,但不知何故我错过了strstrt函数。 - andyras
@andyras -- 我对 remove 函数感到非常自豪 -- 因此我在评论中提到了将其放入我的 ~/.gnuplot 文件中的可能性 :) - mgilson

19

下划线的用法源于将标题视为“强调文本”。使用以下代码关闭该功能:

set key noenhanced


完美:直截了当,不笨拙地在其他地方删除增强功能,当OP只谈论标题时。 - underscore_d

17
如果你正在使用增强型eps终端,这就是你需要首先转义下划线的原因。今天有另一个相关问题解释了这个问题。当你设置终端时,请尝试:
set terminal postscript noenhanced <whatever else here...>

对我来说没问题(Arch linux,gnuplot 4.7.0)。如果增强终端是必要的,下面是我找到的部分解决方案。假设下划线总是出现在字符串的相同位置。

set terminal postscript enhanced
items = 'foo\_abc foo\_bcd bar\_def'
do for [item in items] {
  set output item[1:3].item[5:*].'.eps'
  set title item
  plot sin(x)
}

这样你就可以避免下划线并且不会在文件名中出现 \ 。注意在 'items' 字符串中使用单引号;有关详细信息,请参见先前链接的问题。


1
您可以使用内联递归函数解除在相同位置上具有 \ 的限制。 (内联部分也可以放松...但不重复评估 strstrt 函数有所帮助:)。虽然回答很好,但感谢您为我提供进一步思路。+1 - mgilson
当您的CSV文件在第一行提供绘图键时,使用set key autotitle columnhead noenhanced也可以起作用。 - remcycles

0

我也遇到了标题中下划线的问题:例如,我需要写4_3子帧并且需要增强后的PostScript。最简单的方法是从相邻的帖子中找到的:“如果您正在使用增强的eps终端,则这就是您需要首先转义下划线的原因。今天还有另一个相关的问题解释了这个问题。”- 如何在gnuplot中生成@? 所以,我按照他们的建议做了,这起作用了:

plot 'LC.stats' u 3:4 ti "{/=15 1350 stars in C18 4\_3 subframe}" - 在下划线之前加上双重转义字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接