2017-07-30 3 views
1

J'ai un fichier de données contenant des colonnes de différents ordres de grandeur. Je voudrais tracer collectivement toutes les colonnes ayant un ordre de grandeur similaire dans la même toile. Je le fais en testant le maximum de chaque colonne en utilisant la commande stats.Gnuplot: Basculer entre les canevas de tracé

J'ai essayé jusqu'à présent

set key autotitle columnheader 
set terminal pdfcairo 
set out 'test.pdf' 

do for [col=5:125] { 
    stats 'datafile' using col nooutput 
    if(STATS_max < 1e-7) { 
    #draw to canvas 1 
    plot 'datafile' using 1:col with lines 
    } else { 
    if(STATS_max < 1e-6) { 
     #draw to canvas 2 
     plot 'datafile' using 1:col with lines 
    } else { 
     #draw to canvas 3 
     plot 'datafile' using 1:col with lines 
    } 
    } 
} 

mais n'a pas pu résoudre le problème encore pour basculer entre la toile.

Le fichier ressemble (1ère rangée sont les titres):

time 5.000/5.000 5.000/4.000 ... 
1e-5 7.6e-23  3.057e-17  ... 
0.002 3.4e-17  5.2e-13  ... 
.  .    .   . 
.  .    .    . 
.  .    .    . 

est-il un moyen d'obtenir ce comportement, et si oui, comment? Merci d'avance.

Répondre

0

Vous pouvez d'abord assembler les numéros de colonnes correspondants en variables séparées, puis tout représenter à la toute fin du script. Par exemple, avec test.dat comme:

1 10 11 100 101 1000 1001 
2 20 21 200 201 2000 2001 
3 30 31 300 301 3000 3001 
4 40 41 400 401 4000 4001 
5 50 51 500 501 5000 5001 

le script ci-dessous parcelles seulement le "premier groupe", à savoir, les colonnes 2 et 3:

fName = 'test.dat' 

set terminal pngcairo 
set out 'fig.png' 

#max. column number in the datafile 
N = 5 

#inspired by https://stackoverflow.com/a/35729052/5351549 
_group_1 = "" 
_group_2 = "" 
_group_3 = "" 

groupAppend(idx, col) = sprintf("_group_%d = _group_%d . \" %d\";", idx, idx, col) 

do for [col=2:N] { 
    stats fName using col nooutput 
    if(STATS_max < 1e2) { 
     eval groupAppend(1, col) 
    } else { 
     if(STATS_max < 1e3) { 
      eval groupAppend(2, col) 
     } else { 
      eval groupAppend(3, col) 
     } 
    } 
} 

plot for [i in _group_1] fName u 1:int(i) w l t sprintf("column %s", i) 

Avec les nouvelles versions de Gnuplot, on pourrait alors utiliser des tableaux pour conserver les index de colonne au lieu de cette approche indirecte de les stocker dans un espace délimité comme une chaîne.

+0

Fonctionne parfaitement. Merci! – camelCase