построение Perl с использованием GD: Graph - PullRequest
0 голосов
/ 20 июля 2010

У меня есть такие данные.

file1 date1  1  76.09
      date10 10 87.09
      date11 11 89.89
      date2  2  66.5
      date3  3  78.89
      date4  4  87.98
      date5  5  57
      date6  6  57.98
      date7  7  34.32
      date8  8  45.76
      date9  9  34.99
file2 date1  1  82.45
      date2  2  86.23
file3 date1  1  65.76
      date10 10 34.89
      date11 11 23.79
      date12 12 86.23
      date2  2  23.78
      date3  3  45.78
      date4  4  34.78
      date5  5  67.89
      date6  6  34.78
      date7  7  78.45
      date8  8  67.89
      date9  9  86.23

Я храню значения столбца 3 и столбца 4 в массиве.

@x = [1,10,11,12,13,2,3,4,5,6,7,8,9]
and corresponding column 4 values in array @y

Теперь я строю график следующим образом:

my @data = ([@x], [@y]);

my $mygraph = GD::Graph::lines->new(500, 300);
$mygraph->set(
                        x_label     => 'X axis',
                        y_label     => 'Y axis',
                        title       => "stats",
                    ) or warn $mygraph->error;

 my $myimage = $mygraph->plot(\@data) or die $mygraph->error;

Моя проблема ...

На графике ось X имеет значения, отображаемые как 1,10,11,12,13,2,3,4,5,6,7,8,9 и соответствующие значения y, нанесенные на график. Я не могу жестко закодировать значения оси X, поскольку извлекаю эти данные из файла в эти массивы. Как убедиться, что ось X имеет значения 1,2,3,4,5,6,7,8,9,10,11,12,13 и имеет соответствующие значения y, нанесенные на график.

Также у меня есть другой файл, который имеет такие данные, как:

file1 date1  1  1
      date10 10 2
      date11 11 2
      date2  2  2
      date3  3  3
      date4  4  3
      date5  5  3
      date6  6  4
      date7  7  4
      date8  8  4
      date9  9  4
file2 date1  1  3
      date2  2  2
file3 date1  1  2
      date10 10 3
      date11 11 3
      date12 12 3
      date2  2  3
      date3  3  1
      date4  4  2
      date5  5  5
      date6  6  1
      date7  7  1
      date8  8  2
      date9  9  2

Я могу наносить графики для наборов данных в обоих этих файлах по отдельности. Но я хочу показать один график со столбцом 3 и столбцом 4 первого файла, нанесенным вместе с столбцом 3 и столбцом 4 второго файла, нанесенным в виде одного графика.

Может кто-нибудь помочь мне с этими двумя вопросами.

Спасибо.

Ответы [ 2 ]

1 голос
/ 20 июля 2010

Вот еще одна попытка.Я не буду использовать GD::Graph, так как я уже начал этот ответ в вашем другом посте с Graphics::GnuplotIF.

Ваши две проблемы, насколько я понимаю, таковы:

  1. Вы хотите численно отсортировать значения x.
  2. Вы хотите построить несколько рядов.

Справа:

use Graphics::GnuplotIF;

my $last;
my %data_per_file;

LOAD:
while (<>) {
    chomp;
    my ($file, $label, $x, $y) = split /\s+/;
    $last = $file if $file;
    push @{$data_per_file{$last}}, [$label, $x, $y];
}

SORT:
for my $file (keys %data_per_file) {
    @{$data_per_file{$file}}
    = sort { $a->[1] <=> $b->[1] }
      @{$data_per_file{$file}};
}

my @all_data_in_pairs;

PLOT_SINGLE:
for my $file (keys %data_per_file) {
    my @labels = map { $_->[0] } @{$data_per_file{$file}};
    my @x      = map { $_->[1] } @{$data_per_file{$file}};
    my @y      = map { $_->[2] } @{$data_per_file{$file}};

    my $plot = Graphics::GnuplotIF->new(persist => 1, style => 'points');
    $plot->gnuplot_set_title( $file );
    $plot->gnuplot_plot_xy( \@x, \@y );

    push @all_data_in_pairs, \@x, \@y;
}

my $plot = Graphics::GnuplotIF->new(persist => 1, style => 'lines');
$plot->gnuplot_set_xrange(0, 10);
$plot->gnuplot_hardcopy( 'output.ps',
                         'postscript',
                         'color lw 3' )
if $want_hardcopy;

$plot->gnuplot_set_title( 'all' );
$plot->gnuplot_plot_many( @all_data_in_pairs );

$plot->gnuplot_restore_terminal();
0 голосов
/ 17 июля 2010

Сообщение объединено. Обновлена ​​версия на Perl для печати с использованием GD: График .

В Perl нет «нативных» средств построения графиков: вам придется использовать внешнюю библиотеку, поэтому вы можете также использовать gnuplot, если доступно. Существует множество интерфейсов для gnuplot на CPAN. Тот, который я использовал и, кажется, работает хорошо: Graphics :: GnuplotIF .

Вы можете сделать что-то вроде следующего:

use Graphics::GnuplotIF;

my $last;
my %data_per_file;

LOAD:
while (<>) {
    chomp;
    my ($file, $label, $x, $y) = split /\s+/;
    $last = $file if $file;
    push @{$data_per_file{$last}}, [$label, $x, $y];
}

PLOT:
for my $file (keys %data_per_file) {
    my @labels = map { $_->[0] } @{$data_per_file{$file}};
    my @x      = map { $_->[1] } @{$data_per_file{$file}};
    my @y      = map { $_->[2] } @{$data_per_file{$file}};

    my $plot = Graphics::GnuplotIF->new(persist => 1, style => 'points');
    $plot->gnuplot_set_title( $file );
    $plot->gnuplot_plot_xy( \@x, \@y );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...