我正在寻找一种在3d中绘制直方图的方法,以生成类似于此图http://www.gnuplot.info/demo/surface1.17.png的内容,但每个系列都是直方图。
我使用此处给出的程序https://stackoverflow.com/a/19596160和http://www.gnuplotting.org/calculating-histograms/来生成直方图,并且它在2d中完美运行。 基本上,我使用的命令是
{name=Sam, tags=[Dev, Java]}
{name=Bob, tags=[PM]}
现在我想在同一个图中添加多个直方图,但由于它们在2d中重叠,我想在3d图中将它们分开。
我尝试过以下命令(使用上述程序)
hist = 'u (binwidth*(floor(($2-binstart)/binwidth)+0.5)+binstart):(1) smooth freq w boxes
plot 'data.txt' @hist
但是gnuplot抱怨z值未定义。
我不明白为什么这不会沿x轴的值1沿着y轴放置直方图,并在z轴上绘制高度。
我的数据格式只有两列:
hist = 'u (1):(binwidth*(floor(($2-binstart)/binwidth)+0.5)+binstart):(1) smooth freq w boxes
splot 'data.txt' @hist
我有10个这样的文件,由于文件中的值彼此接近,如果我将它们全部绘制在一个2d直方图中,它们将完全重叠。因此,我想在一个三维透视图中看到10个直方图。
答案 0 :(得分:0)
第一个答案与我的第二个答案截然不同。这个答案解决了OP试图完成的问题,而第二个问题解决了OP试图克服的根本问题。
由于相关的样式( box 和 histograms )仅适用于Gnuplot,因此它无法在其上执行此操作2D。你必须使用外部程序来完成它。
例如,使用您的数据和您的2d命令(您的第一个命令),我们得到(使用您的数据以及-100和4的链接值,用于binstart和binwidth)
要在3d网格上绘制这些框,我们需要使用线条样式并且每个都有四个点:左下角,左上角,右上角和右下角。我们可以使用上一个命令捕获到一个表,但这只会给出上面的中心点。但是,我们可以使用外部程序进行预处理。以下python程序 makehist.py 就是这样做的。
from sys import argv
import re
from math import floor
pat = re.compile("\s+")
fname = argv[1]
binstart = float(argv[2])
binwidth = float(argv[3])
data = [tuple(map(float,pat.split(x.strip()))) for x in open(fname,"r").readlines()[1:]]
counts = {}
for x in data:
bn = binwidth*(floor((x[-1]-binstart)/binwidth)+0.5)+binstart
if not bn in counts: counts[bn] = 0
counts[bn]+=1
for x in sorted(counts.keys()):
count = counts[x]
print(x-binwidth/2,0)
print(x-binwidth/2,count)
print(x+binwidth/2,count)
print(x+binwidth/2,0)
print(max(counts.keys())+binwidth/2,0)
print(min(counts.keys())-binwidth/2,0)
本质上,这个程序与smooth frequency
选项的作用相同,但不是获取每个框的上部中心,而是获得前面提到的四个点以及两个点以沿底部绘制一条线所有的盒子。
运行以下命令,
plot "< makehist.py data.txt -100 4" u 1:2 with lines
产生
看起来与原始图非常相似。我们可以在3d图中使用它
splot "< makehist.py data.txt -100 4" u (1):1:2 with lines
产生
这并不是那么漂亮,但确实将直方图放在3d图上。可以使用相同的技术将多个数据文件添加到其上。例如,附加数据
Index Angle
0 85.0804
1 92.2482
2 90.0384
3 99.2974
4 87.729
5 94.6049
6 86.703
7 97.9413
我们可以使用
splot "< makehist.py data.txt -100 4" u (1):1:2 with lines, \
"< makehist.py data2.txt -100 4" u (2):1:2 with lines
生产
答案 1 :(得分:0)
第二个答案与我的第一个答案截然不同。虽然第一个解决了OP试图实现的目标,但第二个提供了另一种解决OP试图克服的潜在问题的方法。
我已经发布了一个答案,解决了在3d中执行此操作的能力。但是,这通常不是使用此类多个直方图执行此操作的最佳方法。这样的三维图形很难比较。
我们可以通过停滞盒子的位置来解决2D中的重叠问题。使用默认设置时,框将展开以触摸。我们可以将其关闭并调整框的位置以允许在图表上使用超过1个直方图。请记住,您提供的坐标是方框的中心。
假设我拥有您提供的数据和此附加数据集
Index Angle
0 85.0804
1 92.2482
2 90.0384
3 99.2974
4 87.729
5 94.6049
6 86.703
7 97.9413
我们可以使用set boxwidth 2
将您的盒子宽度设置为2个单位(您的容器宽度为4个单位)。此外,我们将使用set style fill solid border lc black
打开包装盒。
然后我可以发出
plot datafile1 u (binwidth*(floor(($2-binstart)/binwidth)+0.5)+binstart):(1) smooth freq w boxes, \
datafile2 u (binwidth*(floor(($2-binstart)/binwidth)+0.5)+binstart+1):(1) smooth freq w boxes
第二个绘图命令与第一个绘图命令相同,但+1
之后的binstart
除外。这会将此框1单元向右移动。这会产生
这里,两个系列都很清楚。由于重叠,跟踪哪个框与每个框相关联很容易,但仅仅掩盖其他系列是不够的。
我们甚至可以通过从第一个绘图命令中减去1来将它们彼此相邻,没有重叠:
plot datafile1 u (binwidth*(floor(($2-binstart)/binwidth)+0.5)+binstart-1):(1) smooth freq w boxes, \
datafile2 u (binwidth*(floor(($2-binstart)/binwidth)+0.5)+binstart+1):(1) smooth freq w boxes
制造