如何使用 x-axis 上数据文件中的列标题(字符串)作为带框绘图的 xiticlabel? (Gnuplot)

How do I use the columnhead (string) in a data file on the x-axis as a xiticlabel of a plot with boxes? (Gnuplot)

我是新来的,这是我的第一个问题,希望我的问题能根据我们这里的规则得到正确描述...

我有一个数据文件 (datafile.dat),用于创建多个图(见下文):

temp name1  name2
10   1000   1200
22   800    750
50   250    200
100  80     82
107  5      3

我想要做的是创建一个图,其中第二列和第三列中的值用方框绘制。在 x-axis 上,应显示这些值引用的名称。此外,还可以为每个盒子赋予特定的颜色。另一个优点是该解决方案也可以在循环中使用(因为原始数据文件包含更多列......)。 最后我希望图表看起来像这样: Desired Layout of the plot.

为了得到这个,我尝试了在互联网上搜索时发现的不同东西(见下文)。我在 Windows 上 运行 gnuplot 5 使用以下命令文件:

xticlabels 如果我尝试这个,例如对于第 2 列,这不起作用:

plot 'datafile.dat' u 2:xticlabels(columnhead(2))

Using an external utility 根本没有用,产生了失败信息

Stats 如果我将输出存储在变量中,这看起来是一个很好的解决方案。但我无法让我的代码正常工作(见下文):

reset
set terminal postscript eps size 15 cm, 15 cm colour enhanced dashed "Times, 22"
set output "test.pdf"
stats 'datafile.dat' using 2
b = STATS_sum
plot 'datafile.dat' u 2:xticlabels(b) every ::1     
reset

如何从上面的数据文件创建所需的输出?我在许多不同的组合中尝试了上面提到的要点。 Suggestion 1, Suggestion 2, Suggestion 3 是进一步 Topic-related 解决问题的想法,但我得到了 none 这些工作。可以请任何人帮助我找到解决方案吗?任何提示将不胜感激!!!

提前致谢!!!

迈克尔

编辑:我发现这个问题已经在三年前被其他人问过:Axis label and column header ...Is there maybe a solution today? Also:

我可以看到执行此操作的两种方法。第一个更自动化,但缺点是不能做颜色。

方法一

每一列仅使用一个数据点(正如您的评论所暗示的那样),我们几乎可以使用 columnstacked 直方图样式来完成此操作。在这一点上,我不确定如何获得不同的颜色,因为 columnstacked 样式将颜色应用于堆栈的各个部分。

使用您的示例数据和第一行数据,我们可以做到

set style data histogram            # we could do w histograms in the plot command instead
set style histogram columnstacked
set boxwidth 0.9                    # so the boxes don't touch
set style fill solid
set key autotitle columnhead        # first row contains series name

plot for[i=2:3] "datafile.dat" every ::0::0 u i 

其中 every ::0::0 表示仅使用第 0(第一)行数据

这会产生

例如,要绘制第 2 至 50 列,只需将 for[i=2:3] 更改为 for[i=2:50]

方法二

我们可以通过使用 stats 命令添加标签,然后执行标准绘图命令来做到这一点。

要设置刻度线,我们可以这样做

set xtics 1,1 format ""
do for[i=2:3] {
    stats "datafile.dat" every ::0::0 u (a=strcol(i),1) nooutput
    set xtics add (a i-1)
}

此处的第一个命令将 xtics 设置为从 1 开始每 1 个单位发生一次,但会抑制标签(我们将设置自己的标签)。

然后我们遍历每一列,使用 stats 命令读取数据文件中的第 0 行。当我们读取它时,我们将列 header 存储在变量 a 中。我们只是 return 一个 1 供 stats 命令实际分析。我们其实并不关心这个命令的结果,我们只需要它读取列headers。最后,我们使用 set xtics add 将此标签添加为 xtic。

接下来,我们可以做一些必要的设置命令

set style fill solid
set boxwidth 0.9      # so the boxes don't touch
unset key
set yrange[0:*]       # by default, the smallest boxes may be cut off

最后,我们可以用

作图
plot for[i=2:3] "datafile.dat" every ::1::1 u (i-1):i w boxes

结果是

同样,for 循环可以更改为使用任意数量的列。 X-ranges 可以根据需要进行调整,并且可以在 plot 命令中使用线型命令来设置颜色。


我们使用 every ::0::0 是因为 set key autotitle 命令导致第一行带有 headers 列被忽略(在 plot 命令之前处理)。因此第一(第0)行是实际数据的第一行。

注意这里我们使用every ::1::1因为第0行是第header行。如果没有 set key autotitle 命令,第一行不会被自动忽略。