【问题标题】:Gnuplot histogram 3dGnuplot 直方图 3d
【发布时间】:2016-05-27 18:59:24
【问题描述】:

我正在寻找一种在 3d 中绘制直方图的方法,以生成类似于此图 http://www.gnuplot.info/demo/surface1.17.png 的东西,但每个系列都是直方图。

我正在使用https://stackoverflow.com/a/19596160http://www.gnuplotting.org/calculating-histograms/ 此处给出的过程来生成直方图,它在二维中完美运行。 基本上,我使用的命令是

hist = 'u (binwidth*(floor(($2-binstart)/binwidth)+0.5)+binstart):(1) smooth freq w boxes
plot 'data.txt' @hist

现在我只想在同一个图中添加多个直方图,但由于它们在 2d 中重叠,我想在 3d 图中将它们隔开。

我尝试执行以下命令(使用上述过程)

hist = 'u (1):(binwidth*(floor(($2-binstart)/binwidth)+0.5)+binstart):(1) smooth freq w boxes
splot 'data.txt' @hist

但 gnuplot 抱怨 z 值未定义。

我不明白为什么这不会在 x 轴上沿值 1 放置直方图,沿 y 轴放置 bin,并在 z 轴上绘制高度。

我的数据被简单地格式化为两列:

Index   angle
0       92.046      
1       91.331      
2       86.604      
3       88.446      
4       85.384      
5       85.975      
6       88.566      
7       90.575      

我有 10 个这样的文件,由于文件中的值彼此接近,如果我将它们全部绘制在一个二维直方图中,它们将完全重叠。因此,我想以一种 3d 透视图查看 10 个彼此背后的直方图。

【问题讨论】:

  • 请提供您数据文件中的一些示例数据。
  • 我已经添加了我正在使用的数据的格式。感谢您的链接,但我仍然看不到如何在我的情况下使用它(可能是由于缺乏理解)
  • 您可能需要在 gnuplot 之外进行一些格式化。问题是,要做到这一点,您需要框,它不能与 splot 一起使用(请参阅help boxes框样式仅与 2D 绘图相关)。您的链接有效,因为它正在绘制函数,它填充了所有点之间的内容。要绘制一个框,您需要按顺序(左下、左上、右上和右下)计算四个点。我可以强制 gnuplot 捕获命名数据块中左上角的值,但看不到如何创建其他点。

标签: plot gnuplot histogram


【解决方案1】:

第一个答案与我的第二个答案不同。这个答案解决了 OP 试图完成的任务,而第二个答案解决了 OP 试图克服的潜在问题。

Gnuplot 自己无法做到这一点,因为相关样式(boxeshistograms)仅适用于 2D。您必须使用外部程序来完成。

例如,使用您的数据和您的 2d 命令(您的第一个命令),我们得到(使用您的数据以及 binstart 和 binwidth 的 -100 和 4 的链接值)

要在 3d 网格上绘制这些框,我们需要使用线条样式并为每个框设置四个点:左下、左上、右上和右下。我们可以使用前面的命令并捕获到一个表,但这只会给出上中心点。但是,我们可以使用外部程序进行预处理。下面的 Python 程序 ma​​kehist.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

生产

【讨论】:

    【解决方案2】:

    第二个答案与我的第一个答案不同。第一个解决了 OP 试图完成的任务,而第二个提供了一种替代方法来解决 OP 试图克服的潜在问题。

    我发布了一个答案,解决了在 3d 中执行此操作的能力。但是,对于这样的多个直方图,这通常不是最好的方法。像这样的 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 将 boxwidth 设置为 2 个单位(您的 bin 是 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
    

    第二个绘图命令与第一个相同,除了binstart 之后的+1。这将使该框向右移动 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
    

    生产

    【讨论】:

    • 感谢您提供的两个示例,并且在查看两个答案时我同意这可能是我想要的。最初让我失望的是我的 x 轴是连续的(不像“美国”、“加拿大”、“墨西哥”,显然将它们分开是有意义的)。
    猜你喜欢
    • 2014-08-02
    • 2017-09-04
    • 1970-01-01
    • 2013-07-28
    • 2017-08-25
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多