Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在gnuplot中声明两个数组,并绘制它们之间的关系_Arrays_Plot_Gnuplot - Fatal编程技术网

Arrays 在gnuplot中声明两个数组,并绘制它们之间的关系

Arrays 在gnuplot中声明两个数组,并绘制它们之间的关系,arrays,plot,gnuplot,Arrays,Plot,Gnuplot,Gnuplot版本5.2支持阵列。如前所述,可以声明1D数组并绘制它们 array A[100] do for [i=1:100] { A[i] = sin(2*pi*i/100.) + 0.1*rand(0) } plot A 这将使用索引i绘制矩阵A 是否有一种方法可以拥有两个1D数组(例如:x和y),并将它们绘制成y与x 或 声明一个2D数组a并绘制a的第二列,与a的第一列相对应。诀窍是让gnuplot生成一组要绘制的样本。您可以提供字符串“+”以沿一维生成一组样本,或“++”以沿二维生

Gnuplot版本5.2支持阵列。如前所述,可以声明1D数组并绘制它们

array A[100]
do for [i=1:100] { A[i] = sin(2*pi*i/100.) + 0.1*rand(0) }
plot A
这将使用索引
i
绘制矩阵
A

是否有一种方法可以拥有两个1D数组(例如:
x
y
),并将它们绘制成
y与x


声明一个2D数组
a
并绘制
a
的第二列,与
a
的第一列相对应。

诀窍是让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
关键字“sample”保证方括号中的术语不会被错误解释为设置绘图的水平范围(“set xrange”)

文件条目

  • 帮助+
  • 帮助特殊文件名
  • 帮助取样
  • 回答#2 如果保证两个阵列A和B具有相同的大小,则可以使用更简单的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命令的“using”说明符中的每个字段都可以包含裸列编号或括号中的表达式。在表达式中,可以通过在$sign前面加前缀或使用函数column(i)来引用列的值

    考虑到这一点,下面的命令将根据数组A的值绘制数组B的值

    plot A using (A[$1]):(B[$1])
    
    回答#3 您询问是否有其他方法来制作二维数组。不完全是这样,但请记住,在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
    

    是否有任何特殊原因使您希望首先将数据放入数组

    当您用函数值填充数组时,您还可以将两个函数(或者如您所说的二维数组的两列)直接相对地绘制,而无需首先在
    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
    

    虽然您的代码可能作为答案正确,但详细说明代码的作用,它可以提高答案的质量。签出文章:@Ethan:有没有办法不使用
    +
    符号而只画线。我甚至试过其他符号,比如
    *
    -
    x
    。没有一个奏效。似乎只有
    +
    符号有效。@Asarkar,上面的
    '+'
    与绘图中使用的符号无关。将
    用于行
    而不是
    用于行点
    。查看有关如何更改线条、点、颜色、线宽、点大小等的帮助。@theozh,谢谢。但是
    +
    符号做什么呢?在gnuplot中,我还尝试使用
    帮助绘制样本。很抱歉,“绘图样本”没有帮助。
    。因此,对
    示例
    关键字和
    +
    符号稍作解释会有所帮助。感谢您的回答。我想我更喜欢答案1,因为它简单。目前我正在编写一个fortran模块来调用gnuplot进行实时绘图。我最初认为传递x和y数组会有所帮助。但是,当replot命令用于新的输入数据时,这会产生问题。因此,我必须将数据保存到文件并绘制它们。