Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/03/2022, à 13:38

BenjiBoy

Gnuplot - ou bien - Python, y=ligne, non pas colonne...

Bonjour tous,

EDIT : initialement j'ai écris ce topic pour Gnuplot mais je suis en train de chercher du côté de python, a priori plus simple et flexible, mais n'étant pas très bon ça me prend du temps, toutes suggestions bienvenues.

ça fait une heure que je ponce google, sans succès, et pourtant je suis à peu près sûr que c'est tout bête.

Soit un fichier type

- | A | B | C | D |
1 | 2 | 5 | 7 | 9 |
2 | 1 | 9 | 2 | 7 |
3 | 1 | 8 | 4 | 8 |
4 | 3 | 8 | 2 | 9 |
5 | 1 | 6 | 8 | 4 |

Je veux que gnuplot interprète ce fichier en faisant un plot par ligne avec des séries type :

y1 = 2, 5, 7, 9
y2 = 1, 9, 2, 7
etc.
Avec des labels sur l'axe X qui seraient A, B, C, D.

Précision : Je souhaite qu'il trace les courbes sur un même plot.
Après j'ai 250 lignes et je regrouperai les plots mais ça, je vais y arriver.
C'est vraiment cette première partie sur laquelle je bloque sévère, et je suis coincé, ça me rend nerveux ^^.

a+

Dernière modification par BenjiBoy (Le 29/03/2022, à 06:43)

Hors ligne

#2 Le 30/03/2022, à 08:14

kholo

Re : Gnuplot - ou bien - Python, y=ligne, non pas colonne...

salut...
... il faudra voir avec les besoins en dépendance et ta compréhension...
j'ai utilisé python et Gnuplot

apt search python3-gnuplot
En train de trier... Fait
Recherche en texte intégral... Fait
python3-gnuplot/focal,focal,now 1.8-8 all  [installé]
  Python interface to the gnuplot plotting program
...

pour l'installer :

sudo apt install python3-gnuplot

dans mon code, je lui ai fait un peu à l'envers ! wink

j'ai créé un fichier pour les valeurs :
coordonnees.txt

- | A | B | C | D |
1 | 2 | 5 | 7 | 9 |
2 | 1 | 9 | 2 | 7 |
3 | 1 | 8 | 4 | 8 |
4 | 3 | 8 | 2 | 9 |
5 | 1 | 6 | 8 | 4 |

et un dossier dat pour y mettre les fichiers pour gnuplot
niveau écriture sur disque, c'est pas super mais comme ça tu auras tout le déroulement

je te met du code et on verra ce que tu peux en faire :

#!/usr/bin/env python3
# -*- coding: UTF8 -*-


import sys

fichier_plot = "coordonnees.txt"

## ETAPE 1
def lire_fichier_plot (fichier) :
    """ ouvre le fichier et renvoie une liste des lignes brutes """
    lignes = []
    ## ouverture du fichier
    with open(fichier, 'r') as f:
        lignes = f.read()
        print(lignes)
    return [ x for x in lignes.split('\n') if len (x) > 0 ][1:] ## pas la première ligne

print("## ETAPE 0")
toutes_les_lignes = lire_fichier_plot (fichier_plot)
print("## ETAPE 1")
for une_ligne in toutes_les_lignes:
    print ( "=>", une_ligne )
# sys.exit(0)


## ETAPE 2
def parser_les_lignes (lignes) :
    """ chaque ligne est coupée avec le | en séparateur 
    renvoie une liste"""
    lignes_parsees = []
    for ligne in lignes :
        ligne_splittee_brute = [ x for x in ligne.split("|") ]
        ligne_splittee = ligne_splittee_brute[1:-1] ## pas les premières ni dernières valeur
        lignes_parsees.append( [ int(x) for x in ligne_splittee ] )
        # lignes_parsees.append( [ x.strip() for x in ligne_splittee ] )
    return lignes_parsees

print("## ETAPE 2")
lignes_parsees = parser_les_lignes (toutes_les_lignes)
for une_ligne in lignes_parsees:
    print ( une_ligne )

# sys.exit(0)

## ETAPE 3
def creer_dat (lignes) :
    """ on récupère les valeurs et on crée les lignes pour les tracer """
    datas = {}
    num = 0
    for une_ligne in lignes : 
        num += 1
        print ( 30 * '-' )
        print ( "NUMERO " + str(num) )

        les_x = une_ligne
        les_y = len (une_ligne) * ( str( num ) + ' ' )
        # data = [ [ x+1, une_ligne[x] ] for x in range( len(une_ligne) ) ]
        # print(data)
        data = ''.join( [ str( x+1 ) + ' ' + str( une_ligne[x] ) + '\n' for x in range( len( une_ligne ) ) ] )
        print ( data )
        datas[num] = data

    return datas

print("## ETAPE 3")
datas = creer_dat ( lignes_parsees )

## ETAPE 4
def enregistrer ( datas ) :
    fichiers = {}
    for num in sorted( datas ):
        data = datas[num]
        ## les valeurs telles que demandées
        nom = 'y' + str( num )
        # print ( nom + ' = ' + ' '.join( [ str(x) for x in une_ligne ] ) )
        # print (une_ligne)

        fichier = "./dat/" + str( num ) + '.dat'
        with open( fichier, 'w') as f :
            f.write( data )
        fichiers[num] = fichier
    return fichiers

liste_de_fichiers = enregistrer (datas)

## ETAPE 5
import Gnuplot


configuration = """
set title 'DEMONSTRATION'
set xtics (" " 0, "A" 1, "B" 2, "C" 3, "D" 4, " " 5)
set xlabel "lesX"
set ylabel "lesY"
# set grid
set xrange [0:5]
set yrange [0:10]

# unset key
set key at 1, 10
set style line 8 lt 2 lw 1
set key box linestyle 8

set style data linespoints
set pointsize 3

set style line 1 lw 2 lc rgb "blue"
set style line 2 lw 2 lc rgb "purple"
set style line 3 lw 2 lc rgb "orange"
set style line 4 lw 2 lc rgb "sea-green"
# set style increment user

"""

def lanceur (configuration, liste_de_fichiers) :
    g = Gnuplot.Gnuplot(debug=1)
    ## CHARGE LA CONFIGURATION
    for une_ligne in [ x for x in configuration.split('\n') if len(x) > 0 and x[0] != "#"] :
        print(une_ligne)
        g(une_ligne)

    ## CHARGE LES DONNEES
    plotteur = "plot "

    for num in sorted( liste_de_fichiers ) :
        print ("num", num)
        un_fichier = liste_de_fichiers[num]
        # plotteur += "'" + un_fichier + "' ls "+ str(num) + " title '" + str(num) + "', "
        plotteur += "'" + un_fichier + "' ls "+ str(num) + "with line title '" + str(num) + "', "

    print (plotteur)
    g(plotteur)

    # g.plot( )
    input ()

print("## ETAPE 5")
lanceur (configuration, liste_de_fichiers)

Hors ligne