如何将x轴上的数据文件中的列头(字符串)用作带框的绘图的xiticlabel? (gnuplot的)

时间:2016-04-08 13:50:46

标签: gnuplot columnheader

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

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

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

我想要做的是创建一个绘图,其中第二和第三列中的值用方框绘制。在x轴上,应显示这些值所指的名称。另外,应该可以给每个盒子一个特定的颜色。另一个优点是该解决方案也可以在循环中使用(因为原始数据文件包含更多列......)。 最后我希望图形看起来像这样: 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 1Suggestion 2Suggestion 3是解决问题的进一步主题相关的想法,但我没有做到这些。可以请任何人帮助我找到解决方案吗?任何提示都将受到高度赞赏!!!

提前致谢!!!

迈克尔

编辑:我发现三年前这个问题已经被其他人问过了:Axis label and column header ...今天是否有解决方案?另外:Question

1 个答案:

答案 0 :(得分:0)

我可以看到两种方法。第一种是更自动化,但缺点是无法做到颜色。

方法1

每列仅使用一个数据点(正如您的评论建议您将要做的那样),我们几乎可以使用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行(第一行)数据

这会产生

enter image description here

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

方法2

我们可以使用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行。当我们阅读它时,我们将columnheader存储在变量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

结果是

enter image description here

同样,for循环可以更改为使用任意数量的列。如果需要,可以调整X范围,并且可以在plot命令中使用linetype命令来设置颜色。

<小时/> 我们使用every ::0::0,因为set key autotitle命令会导致第一行包含列标题(在绘图命令之前处理)。因此,第一行(第0行)是实际数据的第一行。

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