Gnuplot,如何在y轴上绘制带有文本的图形

3

我将尝试绘制一个具有以下数值列表的图表:

directory  file_sizes
dir1         200
dir1         150
dir2         200
dir3          40

理想情况下,y轴应该是文本(第一列)和数字(第二列),x轴应该是点图。我认为最好使用点绘图,因为我有很多dir(20-30个)和数百万个文件。
你有什么想法吗?

通常,您可以使用例如 plot 'file' using 2:0:ytic(1) 将文本放置在 y 轴上。但在您的情况下,dir1 出现了两次,这种情况下应该发生什么?以及您的文件在哪里?在示例中只有文件大小。 - Christoph
我认为他最好的选择是为每个目录分配一个编号(dir1 = 1,dir2 = 2等),然后使用set ytics(“dir1”1,“dir2”2)。可以通过一个简短的bash脚本生成一长串set ytics标签参数,然后显然需要更改输入文件以包含数字“1,2,3...”,而不是目录名。 - Miguel
@Miguel 这正是using ...:ytic(1)部分自动处理文件中的数据的功能。 - Christoph
@Christoph:实际上,在他的情况下并不相同,因为他有“dir1”的重复出现。您提出的方法将每个数据条目打印一个标签。在此示例中,它将在y = 1处打印“dir1”,然后在y = 2处再次打印“dir1”。我提出的方式将在1处打印“dir1”,然后在x = 200和x = 150处绘制两个数据点,均在y = 1处。 - Miguel
@Miguel 嗯,非常正确。在评论之前我应该多想一会儿 :) 或许楼主可以告诉我们这是否是他的意图。 - Christoph
显示剩余2条评论
1个回答

4
这是一个相当混乱的gnuplot脚本,它完全在gnuplot内部进行目录名过滤。我喜欢用不正规的gnuplot技巧 :)
不幸的是,如果目录名称包含空格,则此方法无效。如果需要更复杂的过滤,请使用外部工具进行预处理。
这是操作步骤:
首先创建一个变量 "list",其中包含到目前为止遇到的所有目录名称,以空格分隔。对于任何一行,函数 "add_dir" 检查当前名称是否已经在列表中,如果没有则添加。为了使其正常工作,必须使用一个标记来界定存储在 "list" 中的目录名称,该标记不会出现在名称本身中,我选择了 "|"。
绘图时,函数 "index" 使用 "words" 内置函数返回当前目录在 "list" 中的位置(这就是为什么目录名称不能有空格):
list = ''
index(w) = words(substr(list, 0, strstrt(list, w)-1))
add_dir(d) = (strstrt(list, d) == 0 ? list=list.' '.d : '')

set offset 1,1,1,1
plot 'file.txt' using (d='|'.strcol(1).'|', add_dir(d), $2):(index(d)):ytic(1) with points notitle

结果如下所示:

enter image description here


做得好。你能想出一个仅使用Gnuplot的解决方案很棒。 - Miguel

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