我有一个gnuplot脚本,它生成如下条形图:
输入数据存在于具有许多列的文件中,每个列最终都构成了图表中的一个群集(示例中显示了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制作的!):
我可以用Gunplot做到吗?
我已经阅读了用户手册和 Gnuplot In Action 书,但是没有发现任何可能的方法。
答案 0 :(得分:2)
gnuplot 5.3版(开发部门)添加了3D条形图变体 3D boxes demo。但是,不幸的是,以3D渲染框取决于gnuplot早期版本中不存在的功能,因此我无法提供当前版本(5.2.4)的解决方法。新的3D变体也不会显示误差线,尽管我认为可以构造一个绘图命令来添加误差线。
答案 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轴上。
要使其正常工作我很困难,但我认为结果看起来不错:
我在下面介绍的问题是:
nfiles
函数。scale_y
的条件表达式。我所拥有的都很脆弱-它可以在我的Linux系统上运行,但在很大程度上依赖于shell助手。但这有效。希望这些信息可以帮助其他人,或者可以作为反馈来改进gnuplot,使其更加出色!
要使每个数据集中的颜色对齐,我title
并希望gnuplot定义足够的颜色。
执行此操作的原因是要重置文件集(y轴上的类别)之间的颜色分配,以使不同文件集中的同一条具有相同的颜色。通过将其明确设置为在已知数量的文件(图表栏)之后循环,我确保颜色匹配。
钢筋尺寸(set linetype cycle nfiles
和boxwidth
)是相对于轴范围的,因此很难使它们成为正方形。
如果条形图停留在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
软件包。
一个群集的示例图。
具有三个群集和一个关键图例的示例图。
可能有更好的方法来完成我在这里所做的事情。作为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列中的值是从中导出颜色的整数线型。
两端的半深度框:这是一个自动缩放错误(现已修复)