我制定了一种仅限 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
,其中计算数据点的数量,也就是说,我们将数据空间划分为一个网格,其中每个元素测量并分配一个等于包含的数据点数。这些元素越小,您的图表的分辨率就越高,但您需要更多的数据点才能使其看起来更好。对于我上面的数据,这可能类似于y
xwidth
ywidth
xwidth
ywidth
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
以相反的方式定义这些值可能更有意义:计算xwidth
为xrange / 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
值由数据块位置给出,可通过every
gnuplot 中的选项访问。为了绘制这个 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 倍分辨率,如下所示:
