我有这样的数据。
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列一起绘制。
有人可以帮我解决这两个问题。
谢谢。
答案 0 :(得分:1)
这是另一次尝试。我不会使用GD::Graph
,因为我已经在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];
}
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没有“原生”绘图功能:您必须使用外部库,因此如果可用,您也可以使用gnuplot
。 gnuplot
上有CPAN
个plenty接口。我曾经使用并且似乎运作良好的是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 );
}