2016-08-24 54 views
2

我是新使用Chart::Clicker並且無法創建直方圖。使用下面的代碼:圖中的直方圖:: 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

我不不關心x軸標籤上的顏色。雖然我更喜歡酒吧按照我指定的順序,但我並不關心訂單。

編輯:

試圖@鮑羅廷的建議產生以下:

enter image description here

這是更好,但並不完全正確。現在有25個數據點,但是20個是零,因此它們不顯示,但它們仍佔用X軸上的空間。左邊兩個被切斷,右邊兩個被切斷(在這個圖表中,缺失的零點恰好爲零,所以它不像其他人那樣糟糕)。

我試着在每個方向上延伸X軸一個刻度,所以沒有任何東西會被切斷,但會導致數據值重疊。我改變了零個值不爲零,說明發生了什麼:

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

閱讀該模塊的文檔,它看起來像你必須包含在每個數據集的所有5分格值,如果你想要的不同顏色的酒吧

這樣的事情,也許呢?

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