如何使用 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
命令,第一行不会被自动忽略。
我是新来的,这是我的第一个问题,希望我的问题能根据我们这里的规则得到正确描述...
我有一个数据文件 (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
命令,第一行不会被自动忽略。