数据文件中的Gnuplot 3D条形图

时间:2018-08-08 19:23:49

标签: gnuplot

我有一个gnuplot脚本,它生成如下条形图:

bar example

输入数据存在于具有许多列的文件中,每个列最终都构成了图表中的一个群集(示例中显示了2个群集)。每个文件在图表中都有一个条形图(示例中为9)。每个文件可能有很多行。

该脚本获取输入数据文件,并使用stats命令生成新文件,该文件在原始文件的每一列中包含一行。每行包含其源列的平均值,最小值和最大值。

这些新文件然后用于绘制带有误差线的条形图。每个文件代表一个条,每一行构成一个簇。绘图代码如下:

plot for [f in FILES] f.'.stats' using 2:3:4 title columnhead(1), \
     '' using (0):xticlabels(1) with lines

现在我有了第二组文件,它们产生了另一个类似的条形图。我想将这些图表合并到一个图表上,这样就会有两行3-D条形图,一排在另一行前面(以3-D样式呈现-新的“ z”轴代表了两个数据集(两组FILES)。

这是一个说明我所追求的外观的示例(显然不是用gnuplot制作的!):

enter image description here

我可以用Gunplot做到吗?

我已经阅读了用户手册和 Gnuplot In Action 书,但是没有发现任何可能的方法。

3 个答案:

答案 0 :(得分:2)

gnuplot 5.3版(开发部门)添加了3D条形图变体 3D boxes demo。但是,不幸的是,以3D渲染框取决于gnuplot早期版本中不存在的功能,因此我无法提供当前版本(5.2.4)的解决方法。新的3D变体也不会显示误差线,尽管我认为可以构造一个绘图命令来添加误差线。 enter image description here

答案 1 :(得分:0)

我使用开发5.3版本(git checkout)制作了3D条形图。这是我的splot命令:

splot for [c = 1:ncats] for [f = 1:nfiles] \
          word(cat_files[c],f).'.stats' \
          using (f+column(0)*(nfiles+2)):(scale_y(c)):2 \
          with boxes \
          title (c==1 ? columnhead(1) : '') 

输入数据位于问题中所述的一组“ 统计数据”文件中。为了绘制该图,我将输入FILES分为几类-数组ncats中保存了两套(cat_files)文件,每组包含相同数量的文件({{1} }。

类别相当于y轴上的位置(行),单个文件等于x轴上的位置(条)。每个文件中的行等于条形簇,并且每行中的值是条形高度,即Z轴。在2D模型中,Z轴为Y轴。讨厌的表达方式是将条形图分别定位在x和y轴上。

要使其正常工作我很困难,但我认为结果看起来不错:

enter image description here

我在下面介绍的问题是:

  • y轴图表“行”之间的匹配颜色
  • 条形尺寸-制作方形条形非常容易出错,因此是我的nfiles函数。
  • x轴标签方向
  • 密钥中的重复项,因此是scale_y的条件表达式。
  • 不支持聚类,因此定位表达式令人讨厌

我所拥有的都很脆弱-它可以在我的Linux系统上运行,但在很大程度上依赖于shell助手。但这有效。希望这些信息可以帮助其他人,或者可以作为反馈来改进gnuplot,使其更加出色!

颜色

要使每个数据集中的颜色对齐,我title并希望gnuplot定义足够的颜色。

执行此操作的原因是要重置文件集(y轴上的类别)之间的颜色分配,以使不同文件集中的同一条具有相同的颜色。通过将其明确设置为在已知数量的文件(图表栏)之后循环,我确保颜色匹配。

钢筋尺寸

钢筋尺寸(set linetype cycle nfilesboxwidth)是相对于轴范围的,因此很难使它们成为正方形。

如果条形图停留在y轴的最上端(下部或上部),则将其垂直切成两半(可见的框深度为已定义的boxdepth值的一半)。

我不得不缩放y轴,以便我的两个类别集彼此靠近显示。默认行为以0.2的步长显示从1到2的范围,并将两个图分别放在1和2处,使它们看起来相距很远。

我尝试boxdepth无效。我最终缩放了y值。

set ytics

所有数字都是忽悠因素。 scale(y) = 0.1 * y - 0.05 set yrange [0:1] set boxdepth (0.8 / clusters) 是簇的数量(文件中的行)。我的测试数据保持正方形外观(我的数据最多可以显示5个簇)。

我必须将x轴的起点设置为0.5,否则第一个小节会出现太远(如果x从0开始)或垂直半切(如果x从1开始)的情况。

clusters

轴标签

我用自定义标签替换了自动刻度线。在Y轴上:

set xrange [0.5:*]

与x轴类似。首先,在有1个群集的地方,我将每个类别标记为

 set ytics ()
 set for [c = 1:ncats] ytics add (word(CATS,c) scale_y(c) )

或者在有多个群集的地方,我将群集标记为:

 set xtics ()
 set for [f = 1:nfiles] xtics add (label(word(cat_files[1],f)) f) 

在这里, set xtics () set set for [c = 2:(clusters+1)] xtics add (cell(f,c,1) (nfiles/2)+2+((c-2)*nfiles)) 是一个shell辅助程序,它从文件cell的行f的位置1返回值。可怕的公式是将标签沿集群的中间。我还使用Shell帮助程序来获取集群数。我在gnuplot中找不到查询行和列的方法。请注意,以前(在进行2D绘制时)我会使用c来绘制包边的x轴。

我想旋转x标签使其垂直于轴,但这似乎是不可能的。我还想通过“正确”对齐来调整他们的位置,但也无法使之工作。

关键标签

为每个绘制的条形图添加一个条目到键中。由于在每个类别中重复这些操作,因此它们会在键中重复。我通过使用有条件的方式仅将它们添加一次,将其更改为

xticlabels(1)

title columnhead(1)

我仅在有多个集群时才显示密钥。

集群

二维图已聚类。我很难在3D模式下显示群集外观。如果我对聚类数据运行图,则它们会重叠(它们具有相同的Y值)。为了克服这个问题,我使用了一个公式来沿x轴移动后面的簇,并在它们之间添加一个间隙。因此,它不是x的简单值:

title (c==1 ? columnhead(1) : '')

我有一个公式:

... using (f):(scale_y(c)):2 ...

其中... using (f+column(0)*(nfiles+2)):(scale_y(c)):2 ... 是文件号(等于小节号),f是簇号,column(0)是文件数(例如小节数,或者簇大小),而2是分隔符间隔。

偶然地,在执行此操作时,我发现nfiles在gnuplot 5.3中不起作用,而您必须使用($0)column(0)在5.2.4中起作用)。

我使用Arch Linux AUR package进行了构建,这给了我一个$0软件包。

enter image description here

一个群集的示例图。

enter image description here

具有三个群集和一个关键图例的示例图。


可能有更好的方法来完成我在这里所做的事情。作为gnuplot的新手,我想以任何方式改进此解决方案。

答案 2 :(得分:0)

(我不知道如何在注释中设置文本格式,所以我将其作为单独的答案提供)

  • 匹配颜色:通过在使用规范的单独字段中提供颜色,可以更可靠地完成此操作。在帮助文本中:

    splot with boxes至少需要3列输入数据。额外  输入列可用于提供信息,例如框宽或  填充颜​​色。

      3 columns:  x  y  z
      4 columns:  x  y  z  [x_width or color]
      5 columns:  x  y  z  x_width  color
    

    仅当splot命令指定了颜色时,最后一列才用作颜色  可变色彩模式。例子

      splot 'blue_boxes.dat' using 1:2:3 fc "blue"
      splot 'rgb_boxes.dat' using 1:2:3:4 fc rgb variable
      splot 'category_boxes.dat' using 1:2:3:4:5 lc variable
    

    在第一个示例中,所有方框均为蓝色,并且具有先前设置的宽度  由set boxwidth。在第二个示例中,框的宽度仍取自  set boxwidth,因为第4列被解释为24位RGB颜色。  第三个示例命令从第4列读取框的宽度并解释  第5列中的值是从中导出颜色的整数线型。

  • 两端的半深度框:这是一个自动缩放错误(现已修复)