Форматирование GD :: График оси X в Perl - PullRequest
4 голосов
/ 01 мая 2020

Я создаю график цен с течением времени. Поскольку у меня есть даты на оси X, я преобразовал их в дни, начиная с эпохи. Дни, прошедшие с начала эпохи, не очень понятны для отображения на графике, поэтому я хочу преобразовать их обратно в удобочитаемые даты, используя опцию x_number_format.

Но ... это не называется график отображается.

Я создал следующий тестовый код для демонстрации проблемы.

use strict;
use GD::Graph::points;

# Generate some random data!
my @x_data;
my @y_data;
for (1...20) {
    push @x_data, $_;
    push @y_data, rand(20) + 10;
}

# This is never called - possible bug!
sub x_format {
    print "X Formatter!\n";
    return " - $_[0] - ";
}

# This gets called for every Y-axis point
sub y_format {
    print "Y Formatter!\n";
    return " - $_[0] - ";
}

my $graph=GD::Graph::points->new(1000,450);
$graph->set(
    y_label             => 'Random numbers',
    y_number_format     => \&y_format,
    x_number_format     => \&x_format,
    x_label             => 'Sequential meaningless numbers',
    x_labels_vertical   => 1,
    x_plot_values       => 1,
);
my @data=(
    [ @x_data ],
    [ @y_data ],
);

open PNG, ">temp.png";
binmode PNG;
print PNG $graph->plot(\@data)->png;
close PNG;

system("temp.png");

Этот тестовый код создает ожидаемый график и печатает Y Formatter! 6 раз. Один для каждой точки на оси Y. Тем не менее, он не печатает X Formatter! и не форматирует ось X.

Я попытался отформатировать значения оси X более напрямую с помощью

x_number_format     => sub { " - $_[0] - " },

Это не ' либо отформатируйте ось X.

Я делаю что-то глупое или это ошибка в GD: Graph? На странице ошибок GD :: Graph нет сообщений об ошибке

1 Ответ

3 голосов
/ 01 мая 2020

Изучив источник , я вижу, что вам нужно установить x_tick_number на определенное значение для вызова обратного вызова x_number_format.

Таким образом, вы можете попробовать что-то вроде этого:

$graph->set(
    y_label             => 'Random numbers',
    y_number_format     => \&y_format,
    x_number_format     => \&x_format,
    x_tick_number       => 6,
    x_label             => 'Sequential meaningless numbers',
    x_labels_vertical   => 1,
    x_plot_values       => 1,
);

Согласно документации :

x_tick_number
Если установлено значение 'auto', GD::Graph будет пытаться правильно отформатировать ось X на основе фактических значений X. Если установить число, это число тиков, которое вы получите. Если установлено значение undef, GD::Graph будет обрабатывать данные X как метки. По умолчанию: undef.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...