2
votes

Déclarer deux tableaux dans gnuplot et les tracer l'un par rapport à un autre

La version 5.2 de Gnuplot prend en charge les tableaux. Comme indiqué ici , on peut déclarer des tableaux 1D et les tracer

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


0 commentaires

4 Réponses :


2
votes

L'astuce consiste à demander à gnuplot de générer un ensemble d'échantillons à tracer. Au lieu d'un nom de fichier, vous pouvez fournir la chaîne «+» pour générer un ensemble d'échantillons sur une dimension ou «++» pour générer un ensemble d'échantillons sur deux dimensions. Gnuplot appelle ces "noms de fichiers spéciaux". Dans votre cas, vous souhaitez générer 100 échantillons (entiers de 1 à 100) et utiliser chaque échantillon comme index dans vos tableaux.

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

Le mot-clé "sample" garantit que le terme entre crochets ne sera pas mal interprété comme définissant la plage horizontale ("set xrange") du tracé.

Entrées de documentation

  • aide +
  • help noms de fichiers spéciaux
  • Aide à l'échantillonnage


5 commentaires

Bien que votre code puisse être corrigé comme réponse, mais en élaborant ce que fait votre code, cela peut améliorer la qualité de votre réponse. Consultez l'article: Comment rédiger une bonne réponse?


@Ethan: Est-il possible de ne pas utiliser le signe + et de ne dessiner que des lignes. J'ai même essayé d'autres symboles, tels que * , - et x . Aucun n'a fonctionné. Il semble que seul le symbole + fonctionne.


@Asarkar, ce '+' ci-dessus n'a rien à voir avec le symbole utilisé dans le tracé. Utilisez avec des lignes au lieu de avec des points de ligne . Consultez l ' aide pour savoir comment modifier les lignes, les points, les couleurs, la largeur de ligne, la taille des points, etc.


@theozh, merci. Mais que fait alors le signe + ?


Dans gnuplot, j'ai également essayé d'utiliser help plot sample . C'était Désolé, aucune aide pour 'plot sample' . Donc, une petite explication du mot clé sample et du signe + serait utile.



2
votes

Réponse n ° 2 Si les deux tableaux A et B sont garantis d'avoir la même taille, une commande de tracé plus simple est possible. Nous commençons par noter que toutes les commandes de tracé suivantes sont équivalentes.

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

En effet, aux fins du traçage d'un tableau A est traité comme fournissant deux colonnes d'informations, l'indice i (colonne 1 ) et la valeur A [i] (colonne 2). Suivant la syntaxe standard de gnuplot, chaque champ du spécificateur "using" d'une commande plot peut contenir soit un numéro de colonne nu, soit une expression entre parenthèses. Dans une expression, la valeur d'une colonne peut être référencée soit en préfixant un signe $ ou en utilisant la fonction colonne (i).

Dans cet esprit, il s'ensuit que la commande ci-dessous trace les valeurs de array B par rapport aux valeurs du tableau A.

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])


0 commentaires

2
votes

Réponse n ° 3 Vous demandez s'il existe une alternative pour faire de A un tableau à 2 dimensions. Pas exactement, mais rappelez-vous que dans gnuplot, les nombres à virgule flottante sont en fait des valeurs complexes. Vous pouvez donc utiliser les composants réels et imaginaires de chaque A [i] pour le placer dans le plan 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

 entrez la description de l'image ici p>


1 commentaires

Merci pour vos réponses. Je pense que je préfère la réponse 1 pour sa simplicité.



0
votes

Y a-t-il une raison particulière pour laquelle vous voulez d'abord avoir des données dans des tableaux?

Lorsque vous remplissez vos tableaux avec des valeurs de fonctions, vous pouvez également tracer deux fonctions (ou comme vous dites deux colonnes d'un tableau 2D) directement l'une contre l'autre sans définir au préalable les tableaux dans un do for code> boucle. Définissez simplement certaines fonctions et tracez-les les unes contre les autres. Utilisez set samples pour définir le nombre de points et utilisez plot sample [] pour définir la plage. Je suppose que ce serait plus facile que de définir la taille du tableau, de faire la boucle et de "déconner" avec l'index i et la plage et / ou les décalages.

### 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


1 commentaires

Actuellement, j'écris un module fortran pour appeler gnuplot pour le traçage en temps réel. J'ai d'abord pensé que passer des tableaux x et y serait utile. Cependant, cela crée un problème lorsque la commande replot est utilisée avec de nouvelles données d'entrée. Je dois donc enregistrer les données dans un fichier et les tracer.