0

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

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

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

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

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

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

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

使用外部实用程序 根本不起作用,产生了失败消息

如果我将输出存储在变量中, 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

我该怎么做才能从上面的数据文件中创建所需的输出?我在许多不同的组合中尝试了上述要点。建议 1建议 2建议 3是进一步解决问题的与主题相关的想法,但我没有得到这些工作。可以请任何人帮我找到解决方案吗?任何提示将不胜感激!!!

提前致谢!!!

迈克尔

编辑:我发现三年前已经有人问过这个问题:轴标签和列标题...今天可能有解决方案吗?还有:

4

1 回答 1

1

我可以看到两种方法来做到这一点。第一个是更自动的,但缺点是不能做颜色。

方法一

每列仅使用一个数据点(正如您的评论所暗示的那样),我们几乎可以使用 columnstacked histogram 样式完成此操作。在这一点上,我不确定如何获得不同的颜色,因为 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 命令添加标签,然后执行标准绘图命令来做到这一点。

要设置 tic 标记,我们可以这样做

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 行。当我们读取它时,我们将列标题存储在一个变量a中。我们只返回一个 1 来让 stats 命令进行实际分析。我们实际上并不关心这个命令的结果,我们只需要它来读取列标题。最后,我们使用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 范围,并且可以在绘图命令中使用线型命令来设置颜色。


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

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

于 2016-04-08T21:51:49.637 回答