2

我想绘制 1000 多条曲线并用 gnuplot 显示它们的眼图。

使用 matlab 的眼图示例示例:http: //www.mathworks.fr/fr/help/comm/ref/commscope.eyediagram.html

我已经可以使用下面的脚本绘制曲线:

gnuplot> plot for [col=1:1000] 'input_dataset1.txt' using 0:col with lines linecolor rgb("#0000ff")

结果:output_image.png 我的问题是,当两条线相交时,相交处的颜色与线相同。眼图应以不同颜色显示具有许多交叉点的区域。

我没有犯过任何使用 gnuplot 制作的此类图表的示例。

玩线透明度不起作用:两条半透明线的交点与线的颜色相同。

有任何想法吗 ?

谢谢,

4

1 回答 1

1

我制定了一种仅限 gnuplot 的方法来执行此操作,它涉及一些工作,您可能必须针对您的特定问题微调细节。

作为示例,我生成了一个数据文件,其中包含函数的值exp(x)及其从零阶 ( T^(0)[exp(x)] = 1) 到 3阶 ( ) 的泰勒展开T^(3)[exp(x)] = 1 + x + x**2/2. + x**3/6.。这种数据适合这个问题,因为您将在原点周围拥有高数据密度,其中所有近似值都收敛到精确值,而远离它的数据密度较低。它可以用 gnuplot 像这样生成:

set xrange [0:1]
set table
set output "| grep -v '^$' > data"
plot exp(x), 1, 1+x, 1+x+x**2/2., 1+x+x**2/2.+x**3/6.
unset table ; unset output

注意我正在格式化输出,所以我的数据文件没有空行,否则 gnuplot 将由空行分隔的字段视为不同的数据块,这最终会弄乱下面的直方图。该数据如下所示(plot "data"):

在此处输入图像描述

现在,我用这些数据创建了一个 2D 直方图。如果 gnuplot 提供此功能将非常有帮助,但它没有提供,因此任务变得有点棘手。我要做的是创建几个一维直方图。有关如何生成后者的更多信息,请查看.

首先要计算出bin 的宽度,以及x,其中计算数据点的数量,也就是说,我们将数据空间划分为一个网格,其中每个元素测量并分配一个等于包含的数据点数。这些元素越小,您的图表的分辨率就越高,但您需要更多的数据点才能使其看起来更好。对于我上面的数据,这可能类似于yxwidthywidthxwidthywidth

xwidth = 0.02
ywidth = 0.05

现在我们声明一个函数来定义我们的一维箱(细节):

bin(x,width)=width*floor(x/width)+width/2.0

并定义沿每个方向的 bin 数量。因为xrange我的数据是[0:1]并且我的数据yrange是 [1:2.8],所以 bin 的数量将分别为 50 和 36。我可以使用Nx = xrange / xwidth,但这会导致浮点数Nx,我想要一个整数。为了安全起见,我这样做:

Nx = 50
Ny = 36

以相反的方式定义这些值可能更有意义:计算xwidthxrange / Nx,在这种情况下,整数/浮点数不应该有问题。

现在我生成一维直方图y,循环遍历x值:

set output "| grep -v 'u\\|^$' | sed 's/#/\\n#/g' > data2"
set table
plot for [i=0:(Nx-1)] "./data" using \
(bin($2,ywidth)):( i*xwidth <= $1 && (i+1.)*xwidth > $1 ? 1.0 : 0.0) \
smooth freq
unset table ; unset output

现在data2包含Nx数据块,每个数据块都是扫描y数据Ny点。这些数据点的值是原始data文件中数据条目的数量。实际上,它data2包含 2D 数据 ( y, color),我需要将其重新映射到 3D。该x值由数据块位置给出,可通过everygnuplot 中的选项访问。为了绘制这个 3 维我做:

set output "| grep -v 'u\\|^$' | sed 's/#/\\n#/g' > data3"
set table
splot for [i=0:(Nx-1)] "./data2" every :::i::i using \
((i+0.5)*xwidth):1:2
unset table ; unset output

现在data3可以将其绘制为彩色图:

plot "./data3" with image

看起来像这样:

在此处输入图像描述

如果我使用更高质量的数据(即分辨率更高),图表会更好看。沿每个方向使用 2 倍分辨率,如下所示:

在此处输入图像描述

于 2014-05-05T16:37:05.253 回答