【问题标题】:GNUPlot - Arbitrary number of columns in stacked lineGNUPlot - 堆叠行中的任意列数
【发布时间】:2025-12-01 10:20:07
【问题描述】:

我正在编写一个脚本,该脚本会为给定的 x 值生成具有任意数量 y 值的 csv。 csv 的第一行包含数据集的名称。 x 值是一个 unix 时间戳。我想使用 gnuplot 将此数据绘制为堆积线图,其中值显示为该行总数的分数。我该怎么做?

我查看了以下解决方案,并尝试将它们集成,但我无法弄清楚我做错了什么。

它会说没有足够的列或列数不匹配。

对于给定的时间索引,最多有 N 列数据。我正在查看的总数是给定时间索引的。

--

我的数据示例:

KEY,CSS,JavaScript,Perl,Python,Shell
1428852630,0,0,0,0,406
1428852721,0,0,0,0,406
1428852793,0,0,0,0,406
1428853776,0,0,0,0,781
1429889154,0,0,0,0,1200
1429891056,0,0,0,0,1648
1429891182,0,0,0,0,1648
1429891642,0,0,0,0,1648
1430176065,0,0,0,0,2056

但是,可能有大量列,我想要一个在运行时设置列数的列。


http://gnuplot.sourceforge.net/demo/histograms.html - 修改为具有任意数量的列似乎存在问题。

plot 'immigration.dat' using (100.*$2/$24):xtic(1) t column(2), \
    for [i=3:23] '' using (100.*column(i)/column(24)) title column(i)

https://newspaint.wordpress.com/2013/09/11/creating-a-filled-stack-graph-in-gnuplot/

【问题讨论】:

  • 有一个矛盾:“值显示为总数的分数”和“我不知道 yrange”?代码看起来不错,请解释您遇到的问题。每行是否有 24 列,例如?
  • @Joce 我刚刚添加了有关列的信息,并删除了未知的 yrange。
  • 在空列中添加零怎么样?您还可以定义将在文件中使用的“缺失数据”符号,例如set datafile missing "?"。您应该包含一个带有小数据样本的最小示例以获得准确的答案。
  • @joce 我添加了我的数据示例。
  • 好的,所以文件的列数没有变化,但是您想要一个适应给定文件的列数的脚本?并且需要即时计算每行的总数。这是可行的,尽快回答。

标签: csv gnuplot data-visualization reusability


【解决方案1】:

This answer 显示如何计算列数,稍作修改:

file="file.dat"
get_number_of_cols = "awk -F, 'NR == 1 { print NF; exit }' ".file
nc=system(get_number_of_cols)

那么你需要将列 2 和 nc 相加,让我们用递归来做吧:

sum(c,C)=((c!=C)?column(c)+sum(c+1,C):column(c))

现在你可以绘图了:

set key outside
set datafile separator ","
plot for [i=nc:2:-1] file using 0:(100*sum(2,i)/sum(2,nc)):xtic(1) title columnhead(i) with filledcurve y=0

【讨论】: