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
    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 régulier
    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
    Merci beaucoup pour votre réponse rapide et précise !

  4. #4
    Membre régulier
    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:


  5. #5
    Nouveau membre du Club
    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