IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Perl sélection dans une matrice


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 61
    Points : 30
    Points
    30
    Par défaut Perl sélection dans une matrice
    Bonjour,

    J'ai un fichier comme ceci :

    6
    clq       0.0   1.296   1.336   1.334   1.326   1.312   
    cla       1.296 0.0     1.308   1.29    1.297   1.305   
    cln       1.336 1.308   0.0     1.373   1.326   1.32    
    clm       1.334 1.29    1.373   0.0     1.323   1.315   
    clr       1.326 1.297   1.326   1.323   0.0     1.304   
    cll       1.312 1.305   1.32    1.315   1.304   0.0
    et un code perl comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    my $fichier = "gcont_".$taxoid.".dist";
    open (F1, "/home/gcadars/matrice/matrice2/$fichier") or die ("pb fichier: $fichier\n"); 
     
    #Récupération des informations du fichier dans un double hash
    my ($axex, $axey);
    my @z; 
    while (my $ligne=<F1>) {
    }
    Je souhaite compléter ce code pour sélectionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $axex = la première colonne sauf le 6
    $axey = la première colonne sauf le 6
    @z = 0.0   1.296   1.336   1.334   1.326   1.312   
           1.296 0.0     1.308   1.29    1.297   1.305   
          1.336 1.308   0.0     1.373   1.326   1.32    
           1.334 1.29    1.373   0.0     1.323   1.315   
           1.326 1.297   1.326   1.323   0.0     1.304   
           1.312 1.305   1.32    1.315   1.304   0.0
    $axex correspondra aux valeurs des abscisses d'une heatmap
    $axey correspondra aux valeurs des ordonnées de la heatmap
    @z correspondra aux valeurs de la heatmap

    Pouvez-vous m'aider mes premières tentatives ne marchant pas...

    Cordialement,

    Merci

  2. #2
    Membre habitué
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Points : 148
    Points
    148
    Par défaut
    Bonjour Amniote.

    Voici un exemple pour vous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    use strict;
    use warnings;
     
    # creation du fichier de donnée d'exemple
    my $data_file = <<EOF
    6
    clq 0.0 1.296 1.336 1.334 1.326 1.312
    cla 1.296 0.0 1.308 1.29 1.297 1.305
    cln 1.336 1.308 0.0 1.373 1.326 1.32
    clm 1.334 1.29 1.373 0.0 1.323 1.315
    clr 1.326 1.297 1.326 1.323 0.0 1.304
    cll 1.312 1.305 1.32 1.315 1.304 0.0
    EOF
    ;
     
    open my $file, '>', 'data_file.txt';
    print {$file} $data_file;
    close $file;
     
    # lecture du fichier
    open my $f, '<', 'data_file.txt';
    my @data = <$f>;
    close $f;
     
    # mes 3 varables
    my ( @x, @y, @z );
     
    # parsing
    foreach my $i ( @data )
    {
        # echap les ligne qui commance par un chiffre
        next unless ( $i =~ /^[^0-9]/ );
     
        chomp( $i );
     
        # decoupage de la ligne
        my @t = split / /, $i;
     
        # ajoute au bon tableau
        push @x, shift @t;
        push @z, \@t;
    }
     
    # copie x -> y
    @y = @x;
     
    # affichage des données
    print '@x = ', join ' ', @x, "\n";
    print '@y = ', join ' ', @x, "\n";
    foreach my $i (0..5)
    {
        print '@z['.$i.'] = ', join ' ' , @{$z[$i]}, "\n";
    }
     
    __END__
    Affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @x = clq cla cln clm clr cll 
    @y = clq cla cln clm clr cll 
    @z[0] = 0.0 1.296 1.336 1.334 1.326 1.312 
    @z[1] = 1.296 0.0 1.308 1.29 1.297 1.305 
    @z[2] = 1.336 1.308 0.0 1.373 1.326 1.32 
    @z[3] = 1.334 1.29 1.373 0.0 1.323 1.315 
    @z[4] = 1.326 1.297 1.326 1.323 0.0 1.304 
    @z[5] = 1.312 1.305 1.32 1.315 1.304 0.0

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 61
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup pour votre réponse rapide et précise !

  4. #4
    Membre habitué
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Points : 148
    Points
    148
    Par défaut
    Je ne sais pas ce que vous allez faire avec le script perl mais si par hasard vous utilisez R pour faire vos heatmap il y a un petit module pour perl:

    Statistics::R => https://stoyak.developpez.com/tutori...tre-r-et-perl/

    et faire un truc comme ça rapidement:

    Nom : heatmap.png
Affichages : 205
Taille : 36,2 Ko

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 61
    Points : 30
    Points
    30
    Par défaut
    J'ai pour consigne de créer ma heatmap à partir du script présent à cette adresse : https://plot.ly/javascript/heatmaps/ (j'utilise la heatmap "Annotated Heatmap").

    J'ai suivi votre exemple pour créer ma heatmap :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    # Ouverture du fichier test
     
    my $fichier = "gcont_83333.dist";
    open (F1, "/home/gcadars/matrice/matrice2/$fichier"); 
     
    # Mes 3 variables
    my ( @x, @y, @z );
     
    # Parsing
    foreach my $i ( $fichier )
    {
        # echap les ligne qui commance par un chiffre
        next unless ( $i =~ /^[^0-9]/ );
     
        chomp( $i );
     
        # decoupage de la ligne
        my @t = split / /, $i;
     
        # ajoute au bon tableau
        push @x, shift @t;
        push @z, \@t;
    }
     
    # copie x -> y
    @y = @x;
     
    ### FIN ###
     
    #Heatmap
     
    print <<EOF;
     
    	</table> </td>
    	</tr>
    	</table>
    	</fieldset>
    	<fieldset class='accueil'> <legend>&nbsp;HEATMAP&nbsp;</legend>
    	<head>
      <!-- Plotly.js -->
      <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
    </head>
     
    <body>
     
      <div id="myDiv"><!-- Plotly chart will be drawn inside this DIV --></div>
      <script>
     
    var xValues = @x;
     
    var yValues = @y;
     
    var zValues = @z;
     
    var colorscaleValue = [
      [0, '#ffffff'],
      [0.1, '#ffe8e8'],
      [0.2, '#ffd1d1'],
      [0.3, '#ffbcbc'],
      [0.4, '#ff9999'],
      [0.5,'#ff7f7f'],
      [0.6, '#ff6363'],
      [0.7, '#ff4c4c'],
      [0.8, '#ff3232'],
      [0.9, '#fc1b1b'],
      [1, '#ff0000']
    ];
     
    var data = [{
      x: xValues,
      y: yValues,
      z: zValues,
      type: 'heatmap',
      colorscale: colorscaleValue,
      showscale: true
    }];
     
    var layout = {
      title: 'AAI Heatmap',
      annotations: [],
      xaxis: {
        ticks: '',
        side: 'top'
      },
      yaxis: {
        ticks: '',
        ticksuffix: ' ',
        width: 700,
        height: 700,
        autosize: false
      }
    };
     
    for ( var i = 0; i < yValues.length; i++ ) {
      for ( var j = 0; j < xValues.length; j++ ) {
        var currentValue = zValues[i][j];
        if (currentValue != 0.0) {
          var textColor = 'black';
        }else{
          var textColor = 'black';
        }
        var result = {
          xref: 'x1',
          yref: 'y1',
          x: xValues[j],
          y: yValues[i],
          text: zValues[i][j],
          font: {
            family: 'Arial',
            size: 12,
            color: 'rgb(50, 171, 96)'
          },
          showarrow: false,
          font: {
            color: textColor
          }
        };
        layout.annotations.push(result);
      }
    }
     
    Plotly.newPlot('myDiv', data, layout, {showSendToCloud: true});
      </script>
    </body>
    	<p></>
    	</fieldset>
    	<td> <table> 
    EOF
    Malheureusement la heatmap ne prends pas en compte les données de mon fichier...

    Cependant avec ce code là j'obtiens un résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #lecture du fichier
     
    open my $f, '<', '/home/gcadars/matrice/matrice2/gcont_83333.dist';
    my @data = <$f>;
    close $f;
     
    #open my $fichier, '>>', "/home/gcadars/matrice/matrice2/gcont_2301.dist";
     
    # mes 3 varables
    my ( @x, @y, @z );
     
    # parsing
    foreach my $i ( @data )
    {
        # echap les ligne qui commance par un chiffre
        next unless ( $i =~ /^[^0-9]/ );
     
        chomp( $i );
     
        # decoupage de la ligne
        my @t = split / /, $i;
     
        # ajoute au bon tableau
        push @x, shift @t;
        push @z, \@t;
    }
     
    # copie x -> y
    @y = @x;
     
    # affichage des données
    print '@x = ', join ' ', @x, "\n";
    print '@y = ', join ' ', @x, "\n";
    foreach my $i (0..5)
    {
        print '@z['.$i.'] = ', join ' ' , @{$z[$i]}, "\n";
    }
    J'obtiens ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @x = ecj ebw ecok eco ecd 
    @y = ecj ebw ecok eco ecd 
    @z[0] =       0.0	3.598	3.275	3.675	3.585	 
    @z[1] =       3.598	0.0	3.201	3.618	3.497	 
    @z[2] =      3.275	3.201	0.0	3.232	3.157	 
    @z[3] =       3.675	3.618	3.232	0.0	3.535	 
    @z[4] =       3.585	3.497	3.157	3.535	0.0	 
    @z[5] =
    Merci encore de votre aide

    (IL doit y avoir beaucoup d'aberrations dans mon script mais c'est la toute première fois que je touche à du perl...)

    Merci encore de votre aide

Discussions similaires

  1. [Débutant] Tri de données dans une matrice et sélection
    Par lFantasyz dans le forum MATLAB
    Réponses: 6
    Dernier message: 05/05/2014, 10h36
  2. sélection dans une matrice : optimisation de code
    Par ol9245 dans le forum MATLAB
    Réponses: 2
    Dernier message: 06/07/2012, 11h05
  3. Sélection de voxels et stockage dans une matrice
    Par foufouta dans le forum MATLAB
    Réponses: 5
    Dernier message: 26/04/2008, 00h01
  4. Réponses: 3
    Dernier message: 17/07/2007, 10h15
  5. [JTable] couleur de sélection dans une JTable
    Par spoutyoyo dans le forum Composants
    Réponses: 7
    Dernier message: 06/12/2004, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo