2016-08-24 5 views
2

Chart::Clickerを初めて使用しており、ヒストグラムの作成に問題があります。次のコードを使用する:ヒストグラムのChart :: Clicker

#!/usr/bin/perl -w 

use strict; 

use Gtk3 -init; 
use Chart::Clicker; 
use Chart::Clicker::Renderer::Bar; 

my $data = { 
     Alpha => 3, 
     Bravo => 1, 
     Charlie => 4, 
     Delta => 1, 
     Echo => 5, 
}; 
my $counter = 0; 

my $chart = Chart::Clicker->new; 
my $context = $chart->get_context('default'); 
$context->range_axis->range(Chart::Clicker::Data::Range->new(lower => 0)); 
for my $value (sort keys %$data) { 
     $chart->add_data($value, {$counter++ => $data->{$value}}); 
} 
my $xaxis = Chart::Clicker::Axis->new(orientation => 'horizontal', position => 'bottom'); 
$xaxis->{tick_values} = [0 .. $counter-1]; 
$xaxis->{tick_labels} = [sort keys %$data]; 
$context->{domain_axis} = $xaxis; 
$chart->set_renderer(Chart::Clicker::Renderer::Bar->new); 
$chart->legend->visible(0); 
$chart->draw; 

my $win = Gtk3::Window->new; 
my $img = Gtk3::Image->new_from_surface($chart->driver->surface); 
$win->add($img); 
$win->signal_connect('delete-event' => sub{Gtk3::main_quit}); 
$win->show_all; 
Gtk3::main; 

すると、次の出力を生成します:

Undesirable result

私がしたいことより、このような何か(グラフィカルに編集した)である:

Desired result

Iドンx軸ラベルの色を気にしないでください。私が指定した順番でバーが好きなのですが、私はオーダーについてあまり気にしません。

編集:ボロディンの提案@しよう

は、次のように生成します。

enter image description here

それは良いでしょうが、非常に適切ではありません。現在25のデータポイントがありますが、20はゼロですので表示されませんが、X軸のスペースはまだ使用されています。 2つは左にカットされ、2つは右にカットされます(欠落したものはこのチャートでゼロになるので、他のものと同じくらい悪くはありません)。

X軸を各方向に1ティック伸ばしてみましたが、何も切り取られないため、データ値が重なることになります。あなたがしたい場合は、各データセット内のすべての5つのバーの値を含まなければならないように見える、

enter image description here

答えて

1

私はそれは、単一のシリーズに切り替えることによって動作するようになったが、それは色のコストがかかります...まあ、すべてのものを持つことはできません。最も左と一番右のバーがカットされないように、X軸は目盛り調整

  • はカップル他の問題を修正しました。

  • Y軸のティックを強制的に整数にする(カウントが発生しているので、データは常に整数になります)。
  • Gtk3の回避策を追加しました。< 3.10。

新コード:

#!/usr/bin/perl -w 

use strict; 
use Gtk3 -init; 
use Chart::Clicker; 
use Chart::Clicker::Renderer::Bar; 
use POSIX qw/ceil/; 

my $data = { 
    Alpha => 3, 
    Bravo => 1, 
    Charlie => 4, 
    Delta => 1, 
    Echo => 5, 
    Foxtrot => 9, 
}; 

my $points = keys %$data; 
my $counter = 0; 
my $max = 0; 
my $chart = Chart::Clicker->new; 
for my $series (sort keys %$data) { 
    $chart->add_data('histogram', {++$counter => $data->{$series}}); 
    $max = $data->{$series} if $data->{$series} > $max; 
} 
my $context = $chart->get_context('default'); 
my $yaxis = $context->range_axis; 
$yaxis->range(Chart::Clicker::Data::Range->new(lower => 0)); 

# Force Y-axis ticks to integers 
$yaxis->clear_tick_values; 
my $increment = ceil($max/10); 
for(my $tick = 0; $tick <= $max; $tick += $increment) { 
    $yaxis->add_to_tick_values($tick); 
} 
$yaxis->format('%d'); 

# Fix cropped bars on the left and right end of the X-axis 
my $xaxis = $context->domain_axis; 
$xaxis->tick_values([1 .. $counter]); 
$xaxis->tick_labels([sort keys %$data]); 
$xaxis->range(Chart::Clicker::Data::Range->new(lower => .5, upper => $counter+.5)); 
$context->domain_axis($xaxis); 

$chart->set_renderer(Chart::Clicker::Renderer::Bar->new); 
$chart->legend->visible(0); 
$chart->draw; 

my $win = Gtk3::Window->new; 
my $loader = Gtk3::Gdk::PixbufLoader->new; 
$chart->driver->surface->write_to_png_stream(sub { 
    $loader->write([unpack 'C*', $_[1]]); 
}); 
$loader->close; 
my $img = Gtk3::Image->new_from_pixbuf($loader->get_pixbuf); 
$win->add($img); 
$win->signal_connect('delete-event' => sub{Gtk3::main_quit}); 
$win->show_all; 
Gtk3::main; 

次のようになります。

enter image description here

0

モジュールのドキュメントを読む:私は何が起こっているか説明するために非ゼロにゼロ値を変更しましたさまざまな色のバー

これは、おそらく何か?

my $i = 0; 
for my $set (sort keys %$data) { 
    my @values = (0) x keys %$data; 
    $values[$i++] = $data->{$set}; 
    $chart->add_data($value, \@values); 
} 
+0

面白いアイデア。間違いなく良いですが、それでもなお正しいわけではありません。私はそれを試して何が起こるのスクリーンショットで質問を更新しました。 – TheAmigo