2010-07-19 54 views
-2

我有這樣的數據。perl使用GD繪圖:圖表

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 

現在我繪製曲線圖folllows:

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值。

我也有具有類似數據abother文件:

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和列2號文件的4繪製在一張圖中畫在一起。

有人可以幫我這兩個問題。

謝謝。

+0

你的問題不清楚。同樣,即使您使用'GD :: Graph :: lines',您的討論也讓我認爲您不需要默認情況下生成'GD :: Graph'的線圖。相反,你似乎想要X-Y散點圖。但我不確定我瞭解你的目標。如果你想散點圖,請參閱'GD :: Graph :: Cartesian'。 – FMc 2010-07-19 23:36:28

+0

對不起。我會說清楚。 我正在爲2個文件中的每個數據集繪製線圖。我從第一個文件爲file1繪製了一條線條圖,第一個文件爲file2繪製了一張圖,第一個文件爲file3繪製了一個圖。 類似地,我爲第二個文件的file1,file2,file3中的每一個繪製了一條線圖。 我想結合來自第一和第二文件file1的圖表,以便我可以關聯數據並做一些分析。它可以看起來像任何東西,但應該有辦法在同一個圖中看到兩個數據。我並不特別使用任何特定的圖形。 – jerrygo 2010-07-20 00:16:32

+2

-1:你幾乎在這裏發佈了這個確切的問題http://stackoverflow.com/questions/3269355/perl-plotting-for-multiple-datasets-in-csv-file/3269598#3269598 2天前,我爲其提供了一個解決方案,你還沒有關閉,接受或以其他方式承認它。 – 2010-07-20 06:02:03

回答

0

合併後。更新版本爲perl plotting using GD:Graph

Perl沒有「本地」繪圖工具:您必須使用外部庫,因此如果可用,您還可以使用gnuplot。在CPAN上有gnuplot的接口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); 
} 
+0

我得到一個錯誤 「問題關閉通信GNUPLOT」 能有人幫助我如何解決這個問題。 – jerrygo 2010-07-19 20:00:18

+0

當析構函數不乾淨地關閉管道到'gnuplot'或其打印硬拷貝的文件時,有時會發生這種情況。它應該是無害的,因爲錯誤只在對象銷燬階段被調用。無論如何,你會得到錯誤是很奇怪的;我不是。你有沒有嘗試更新的版本(http:// stackoverflow。COM /問題/ 3285340/Perl的繪製,使用/ 3287615#3287615)? – 2010-07-20 17:19:55

+0

是的,我做到了。但問題是......我再次遇到錯誤。另外,我無法看到任何圖表。 – jerrygo 2010-07-20 17:34:28

1

這裏的另一次嘗試。我不會使用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

我很抱歉。我嘗試使用Graphics :: GnuplotIF;爲期2天,但遇到了一些錯誤,我在21小時前發佈了對舊帖子的評論。由於我是perl的新手,我不太瞭解如何解決這個問題。我仍在尋找它。所以我想到了使用GD:Graph,並且能夠取得一些進展。抱歉再次發佈這個問題,但這次我發佈了,因爲我不得不使用Perl的情節,並不得不補充我現在做的任何事情。 對不起,我的錯誤。我會在下一次照顧。 – jerrygo 2010-07-20 17:21:57