我是新来的,这是我的第一个问题,希望根据我们在这里的规则正确描述我的问题......
我有一个数据文件(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 1,Suggestion 2,Suggestion 3是解决问题的进一步主题相关的想法,但我没有做到这些。可以请任何人帮助我找到解决方案吗?任何提示都将受到高度赞赏!!!
提前致谢!!!
迈克尔
编辑:我发现三年前这个问题已经被其他人问过了:Axis label and column header ...今天是否有解决方案?另外:Question答案 0 :(得分:0)
我可以看到两种方法。第一种是更自动化,但缺点是无法做到颜色。
每列仅使用一个数据点(正如您的评论建议您将要做的那样),我们几乎可以使用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行。当我们阅读它时,我们将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
结果是
同样,for循环可以更改为使用任意数量的列。如果需要,可以调整X范围,并且可以在plot命令中使用linetype命令来设置颜色。
<小时/> † 我们使用
every ::0::0
,因为set key autotitle
命令会导致第一行包含列标题(在绘图命令之前处理)。因此,第一行(第0行)是实际数据的第一行。
‡ 请注意,我们在这里使用every ::1::1
,因为第0行是列标题行。如果没有set key autotitle
命令,则不会自动忽略第一行。