我是新手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;
产生以下输出:
我想要的是这样的东西(经过图形编辑):
我不在乎x轴标签上的颜色。尽管我希望条形排列顺序符合我指定的顺序,但是我并不在乎顺序。
编辑:
尝试@Borodin的建议会产生以下结果:
更好,但是不太正确。现在有25个数据点,但20个数据点为零,因此不显示它们,但它们仍占据X轴上的空间。左边两个被截断,右边两个被截断(丢失的那个在该图表中恰好是零,因此它不如在其他图表中那样糟糕)。
我尝试将X轴在每个方向上延伸一个刻度,这样就不会截断任何东西,但这会导致数据值重叠。我将零值更改为非零以说明正在发生的情况:
我可以通过切换到一个系列来使它起作用,但这是以颜色为代价的……哦,不能拥有所有东西。
修复了其他一些问题:
新代码:
#!/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;
看起来像这样:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句