在gnuplot中声明两个数组,并将它们相对于另一个绘制

时间:2019-01-21 06:21:03

标签: arrays plot gnuplot

Gnuplot 5.2版支持数组。根据{{​​3}}的定义,您可以声明一维数组并将其绘制

array A[100]
do for [i=1:100] { A[i] = sin(2*pi*i/100.) + 0.1*rand(0) }
plot A

这将绘制索引为A的矩阵i

有没有办法拥有两个一维数组(例如:xy)并绘制它们y vs x

OR

声明2D数组A并相对于A的第一列绘制A的第二列?

4 个答案:

答案 0 :(得分:1)

诀窍是让gnuplot生成一组要绘制的样本。除了提供文件名,您还可以提供字符串“ +”以沿一个维度生成一组样本,或者提供“ ++”以沿两个维度生成一组样本。 Gnuplot称这些为“特殊文件名”。对于您的情况,您想生成100个样本(整数从1到100),并将每个样本用作数组的索引。

array A[100]
array B[100]
do for [i=1:100] {
    A[i] = something
    B[i] = something else
}

plot sample [i=1:100] '+' using (A[i]):(B[i]) with linespoints

关键字“样本”保证了方括号中的术语不会被误解为设置绘图的水平范围(“ set xrange”)。

文档条目

  • 帮助+
  • 帮助特殊文件名
  • 帮助采样

答案 1 :(得分:1)

答案2 如果保证两个数组A和B具有相同的大小,则可以使用更简单的plot命令。首先,请注意以下所有plot命令都是等效的。

plot A
plot A using 1:2
plot A using (column(1)):(column(2))
plot A using ($1):($2)
plot A using ($1):(A[$1])

这是因为出于绘制数组A的目的,它被视为提供两列信息,即索引i(列1)和值A [i](列2)。按照标准的gnuplot语法,plot命令的“使用”说明符中的每个字段都可以包含裸列编号或括号中的表达式。在表达式内部,可以通过在$前面加上$符号或使用函数column(i)来引用列的值。

请牢记,下面的命令将相对于数组A的值绘制数组B的值。

plot A using (A[$1]):(B[$1])

答案 2 :(得分:1)

答案3 您问是否存在使A成为二维数组的替代方法。不完全是,但是请记住,在gnuplot中,浮点数实际上是复数值。因此,您可以使用每个A [i]的实部和虚部将其放置在x / y平面中:

array A[36]
set angle degree
i = {0,1}       # i = sqrt(-1) as a complex value
do for [n=1:36] {
    A[n] = cos(real(10.*n)) + i * sin(real(10.*n))
}
plot A using (real(A[$1])):(imag(A[$1])) with lp

enter image description here

答案 3 :(得分:1)

您是否有任何特殊原因想要首先在数组中包含数据?

在用函数值填充数组时,也可以直接将两个函数(或者说2D数组的两列)直接相对绘制,而不必先在do for循环中定义数组。 只需定义一些功能并将它们相互绘制即可。 使用set samples定义点数,并使用plot sample []设置范围。我想这比设置数组大小,执行循环并使用索引i和范围和/或偏移量“混乱”要容易得多。

### plot one function vs. another function
reset session

f(x) = sin(x) + 0.1*rand(0)
g(x) = cos(x) + 0.1*rand(0)

set samples 100
plot sample [0:2*pi] '+' u (f($1)):(g($1)) w lp pt 7 lc rgb "red"
### end of code

enter image description here