Pregunta

Estoy escribiendo un programa que toma en un archivo de entrada del usuario. El archivo tiene montón de números en ella y voy a leer los números en el archivo y crear un gráfico basado en los números usando GD :: Graph .

La primera línea del archivo es el eje X, segunda línea del archivo es valores Y correspondientes al eje X y tercera, cuarta, ..., etc. Por ejemplo:

1 2 3 4 5 
2 4 5 10 14
5 6 8 12 13

Así que en la primera línea anterior, es eje x, la segunda es valores de y correspondientes a eje X así que esto obtendrá 10 puntos. (1, 2) (1, 5) (2, 4) (2, 6) .... (4,10) (4,12) (5,14) (5, 13)

planeo en la lectura de cada línea de la matriz y luego dividir la línea en espacios o tabuladores y almacenar los valores en una matriz. Por lo tanto, una matriz 1 tendrá eje x, matriz2 tendrá eje Y, pero ¿cómo debo guardar tercera, cuarta, quinta, ..., etc líneas en una matriz de modo que se conviertan en (x, y)?

Además, ¿cómo puedo encontrar el valor más grande de la primera y segunda líneas (2 arrays) por lo que puede crear un límite para mi ejes X e Y?

¿Fue útil?

Solución

Vaya, leído mal la pregunta, desea que sea un AoAoH o un AoH, dependiendo de si cada línea después de la primera representa una línea o el todo apenas puntos para trazar respectivamente. Así es como yo lo escribiría si cada línea en el archivo se convertiría en una línea en la gráfica:

#!/usr/bin/perl

use strict;
use warnings;
use List::Util qw/min max/;

my @x_points         = split " ", scalar <>; #read in the x axis labels
my ($x_min, $x_max)  = (sort { $a <=> $b } @x_points)[0,-1];
my ($y_min, $y_max)  = (0, 0);

#lines is an AoAoH, first layer are the lines to be drawn
#second layer is a list of coords
#third layer are the x and y coords
my @lines;
while (<>) {
    my @y_points = split;
    #if the two arrays are not the same size, we have a problem
    die "invalid file\n" unless @y_points == @x_points;

    $y_min = max($y_min, @y_points);
    $y_max = min($y_max, @y_points);

    push @lines, [ 
        map { { x => $x_points[$_], y => $y_points[$_] } }  
    0 .. $#x_points 
    ];
}

use Data::Dumper;

print "x min and max $x_min $x_max\n",
      "y min and max $y_min $y_max\n",
      "data:\n",
      Dumper(\@lines);

my $i;
for my $line (@lines) {
    $i++;
    print "line $i is made up of points: ",
        (map { "($_->{x}, $_->{y}) " } @$line), "\n";
}

Y aquí es cómo iba a manejarlo si no son más que apunta a ser complotados:

#!/usr/bin/perl

use strict;
use warnings;
use List::Util qw/min max/;

my @x_points         = split " ", scalar <>; #read in the x axis labels
my ($x_min, $x_max)  = (sort { $a <=> $b } @x_points)[0,-1];
my ($y_min, $y_max)  = (0, 0);

#lines is an AoAoH, first layer are the lines to be drawn
#second layer is a list of coords
#third layer are the x and y coords
my @points;
while (<>) {
    my @y_points = split;
    #if the two arrays are not the same size, we have a problem
    die "invalid file\n" unless @y_points == @x_points;

    $y_min = max($y_min, @y_points);
    $y_max = min($y_max, @y_points);

    push @points,
        map { { x => $x_points[$_], y => $y_points[$_] } }
        0 .. $#x_points;
}

use Data::Dumper;

print "x min and max $x_min $x_max\n",
      "y min and max $y_min $y_max\n",
      "data:\n",
      Dumper(\@points);

print "Here are the points: ", 
    (map { "($_->{x}, $_->{y}) " } @points), "\n";

Otros consejos

No es realmente una respuesta a su pregunta, pero no se pierda GD: :. :: Gráfico de datos

A menos que sea seguro que el primero y el último de cada línea es más pequeña / grande que tendrá que usar algo como Lista :: Util min() 's y max().


No entiendo muy bien lo que quiere decir con "La primera línea del archivo es el eje X, la segunda línea del archivo es el eje Y y tercero, cuarto, etc ..., son puntos correspondientes al eje X".

Puede crecer sus matrices X e Y a medida que avanza.

#!/usr/bin/perl

use Data::Dumper;
use warnings;
use strict;

my @xs = ();
my @ys = ();
my $expecting_xs = 1;
my $last_xs_count;

while(<>) {
  chomp;
  my @values = split(/\s+/);
  if($expecting_xs) {
    push(@xs, @values);
    $last_xs_count = @values;
    $expecting_xs = 0;
  } else {
    if(@values != $last_xs_count) {
      die "Count mismatch";
    } 
    push(@ys, @values);
    $expecting_xs = 1;
  }
}

if(!$expecting_xs) {
  die("Odd number of lines");
}

my($xmin, $xmax) = extremes(@xs);
my($ymin, $ymax) = extremes(@ys);

print "xmin: $xmin xmax: $xmax ymin: $ymin ymax: $ymax\n";
print Dumper(\@xs), Dumper(\@ys);

sub extremes {
  my(@values) = @_;
  return undef unless @values;
  my $min = shift(@values);
  my $max = $min;
  for my $value (@values) {
    $max = $value if $value > $max;
    $min = $value if $value < $min;
  }
  return $min, $max;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top