2013-08-09 4 views
5

とグラフ、例えばGD ::私は一人ひとりの学生のためのデータを持っているPerlの

Student Name   Score 
    Jack     89 
    Jill     70 
    Sandy     40 

は今、私はバー::グラフ:: GDを使用して棒グラフでこれらをプロットしようとしているが、私からよ私はperlとモジュールにはまったく新しいので、グラフからXとYの値をすべてプロットするように手動で宣言できます。

しかし、私は学生のそれぞれの名前とスコアを知らないので、(テキストファイルから引き出さ) 私は自動的に値を行うことができるようにしたい、

私はハッシュのキーと値を考えていました良いアプローチでした。だから私はハッシュテーブルにすべてを置いた、%ハッシュ(学生名)=(スコア)

私はこれを棒グラフとしてプロットするか、あるいは、別の方法をお勧めしますか?

おかげ

は、「これは私が学生の名前を入力することによって、手動でグラフをプロットすることができます一部です

を更新します。

my $graph = GD::Graph::bars->new(800, 800); 

    @data = ( 
     ["Jack","Jill"], 
     ['30','50'], 
     ); 

    $graph->set( 
     x_label   => 'Students', 
     y_label   => 'Scores', 
     title    => 'Student Vs. Scores', 
     y_max_value  => 60, 
     y_tick_number  => 8, 
     y_label_skip  => 2 
    ) or die $graph->error; 


    my $gd = $graph->plot(\@data) or die $graph->error; 

    open(IMG, '>file.png') or die $!; 
    binmode IMG; 
    print IMG $gd->png; 
+2

あなたのこれまでに試してみましたか? – hwnd

+0

私はハッシュテーブルをグラフ化する方法を知らない。そして、私はその点に固執しています。 –

+0

ハッシュを使用せずにグラフを作成するためのコードを表示します。 – toolic

答えて

3

はタブ区切り文字を使用して、次のようにデータファイルがあると仮定。

Student Name   Score 
Jack     89 
Jill     70 
Sandy     40 

あなたは、このような何かを行うのアレイにデータファイルからx軸とy軸の値をプッシュすることができます。たとえば、あなたを与える

use strict; 
use warnings; 
use CGI qw(:standard); 
use GD::Graph::bars; 

open my $fh, '<', 'data.txt' or die $!; 

my (@x, @y); 
while (<$fh>) { 
    next if $. == 1;   # skip header line 
    push @x, (split /\t/)[0]; # push 'Student Names' into @x array 
    push @y, (split /\t/)[1]; # push 'Score' into @y array 
} 
close $fh; 

my $graph = GD::Graph::bars->new(800, 800); 

$graph->set( 
      x_label => 'Students', 
      y_label => 'Scores', 
      title => 'Student Vs. Scores', 
) or warn $graph->error; 

my @data = (\@x, \@y); 
$graph->plot(\@data) or die $graph->error(); 

print header(-type=>'image/jpeg'), $graph->gd->jpeg; 

enter image description here

をあなたが例Score2用と別のタブ区切りの列を持っていると仮定すると、複数のy軸の値を使用することを望んでいる場合は、簡単にこのような何かを行うことができます。

my (@x, @y, @y2); 
while (<$fh>) { 
    next if $. == 1; 
    push @x, (split /\t/)[0]; 
    push @y, (split /\t/)[1]; 
    push @y2, (split /\t/)[2]; 
} 

とのお@data配列を変更:

my @data = (\@x, \@y, \@y2); 

そして、あなたの結果は次のようになります。enter image description here

1

documentationによると、あなたは配列を渡す必要があります配列の配列をGD :: Graph :: barsのplotメソッドに渡します。すでにハッシュがあるので、配列の配列に変換する必要がありますが、これはいくつかの方法がありますが、

#!/usr/bin/perl 

use strict; 
use warnings; 

use Data::Dumper; 

my %hash = (
    Larry => 15, 
    Curly => 16, 
    Moe => 20 
); 

my (@names, @scores); 
while (my ($name, $score) = each %hash) { 
    push @names, $name; 
    push @scores, $score; 
} 

my @data = (\@names, \@scores); 

print Dumper(\@data); 

# $VAR1 = [ 
#   [ 
#    'Moe', 
#    'Curly', 
#    'Larry' 
#   ], 
#   [ 
#    20, 
#    16, 
#    15 
#   ] 
#  ]; 

ただし、内部配列の順序を保持してください。

+0

ちょっと、私はこのメソッドを実装していて、うまくいきました。私は素敵な小さなチャートを作成し、それに応じてそれを微調整することができました。ありがとうございました!しかし、私はちょうど問題に遭遇しました。学生一人一人の平均を取る代わりに、各学生に2つの平均があります。私は2つの値を持つハッシュを使うことはできないと思います。どんなインプットや提案も素晴らしいでしょう。 –

+2

あなたは 'my%hash =(Jack => [89、90]);' – hwnd

+0

を実行できます。私はちょうどハッシュを取り除き、別の配列を追加して、@ data =(\ @names、\ @ scores、\ @ newarray)に追加します。 –

1

私はコードfrom the samples directory in GD::Graphを適応:

use warnings; 
use strict; 
use GD::Graph::bars; 
use GD::Graph::Data; 

my %students = (
    Jack => 89, 
    Jill => 70, 
    Sandy => 40, 
); 

my @scores; 
my @names; 
for (keys %students) { 
    push @names, $_; 
    push @scores, $students{$_}; 
} 

my $data = GD::Graph::Data->new([ 
    [@names], 
    [@scores], 
]) or die GD::Graph::Data->error; 

my $my_graph = GD::Graph::bars->new(); 
$my_graph->set(
    x_label   => 'Name', 
    y_label   => 'Score', 
    title   => 'A Simple Bar Chart', 
) or warn $my_graph->error; 
$my_graph->plot($data) or die $my_graph->error(); 
save_chart($my_graph, 'graph'); 

sub save_chart { 
    my $chart = shift or die "Need a chart!"; 
    my $name = shift or die "Need a name!"; 
    local(*OUT); 

    my $ext = $chart->export_format; 

    open(OUT, ">$name.$ext") or 
     die "Cannot open $name.$ext for write: $!"; 
    binmode OUT; 
    print OUT $chart->gd->$ext(); 
    close OUT; 
} 
関連する問題