使用GD:Graph进行perl绘图

时间:2010-07-19 21:43:11

标签: perl graph plot

我有这样的数据。

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

我可以分别在这两个文件中为数据集绘制graohs。 但我想要做的是,我想显示一个单独的图表,其中第一个文件的第3列和第4列与第3个第3列的第3列和第4列一起绘制。

有人可以帮我解决这两个问题。

谢谢。

2 个答案:

答案 0 :(得分:1)

这是另一次尝试。我不会使用GD::Graph,因为我已经在Graphics::GnuplotIF的其他帖子中开始了这个答案。

根据我的理解,你的两个问题是:

  1. 您想要对x值进行数字排序。
  2. 您想绘制多个系列。
  3. 右:

    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();
    

答案 1 :(得分:0)

合并后发布。已更新perl plotting using GD:Graph版本。

Perl没有“原生”绘图功能:您必须使用外部库,因此如果可用,您也可以使用gnuplotgnuplot上有CPANplenty接口。我曾经使用并且似乎运作良好的是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 );
}