【问题标题】:Formatting GD::Graph x-axis in Perl在 Perl 中格式化 GD::Graph x 轴
【发布时间】:2020-05-01 17:01:37
【问题描述】:

我正在制作一张随时间变化的价格图表。因为我在 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 bug page

中没有针对此问题的错误报告

【问题讨论】:

    标签: perl graph gd-graph


    【解决方案1】:

    通过检查source,我可以看到您需要设置 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,
    );
    

    根据documentation

    x_tick_number
    如果设置为“自动”,GD::Graph 将尝试格式化 X 基于实际的 X 值,以一种很好的方式轴。如果设置为数字, 这就是您将获得的滴答数。如果设置为undefGD::Graph 将 X 数据视为标签。默认值:undef

    【讨论】:

    • 非常感谢。我确实尝试查看源代码,但找不到确切的位置。似乎,正如怀疑的那样,我遗漏了一些非常明显的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2020-12-03
    • 1970-01-01
    • 2018-03-28
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多