无法获取Perl Chart(gnuplot)来标记轴上的所有抽搐

时间:2017-06-21 19:42:23

标签: perl gnuplot

在perl中使用Chart::Gnuplot

x轴用于日期/时间。

我指定了

timeaxis => "x"   (seems to work)

我正在使用

timefmt => '%Y-%m-%d_%H:%M:%S' 

读取传递给Chart::Gnuplot::DataSet->new中xdata的数组ref中的元素。 (这似乎也有效)

使用

xtics => {labelfmt => "%m-%d %H", rotate => -90} 

以我想要的方式显示标签。 (这一切似乎都有效)

事实上,除了在x(日期/时间)轴上标记少量抽搐之外,一切看起来都不错。我想将它们全部标记(或者每隔一个标记,或者对此有一些控制权)

我找到了很多关于如何使用... start,incr,end等来做数字(注释日期)的例子。我尝试了很多实验来实现这一目标。但是我觉得我已经用尽了所有可以在谷歌搜索中找到的东西而且我仍然陷入困境: - (

所以,如果有任何关于如何使用日期/时间来标记所有抽搐的建议,我非常感激。

1 个答案:

答案 0 :(得分:3)

您可以使用xtics => { labels=>[...] },但需要尊重

  

如果是时间序列数据,则必须根据 timefmt 格式将位置值作为报价日期或时间给出。

来自gnuplot documentation

假设数组@x包含 timefmt 中数据集的时间值,则可以在每个时间强制使用x-tick标签。

xtics => {
    labels=>[map { q(').$_.q(') } @x]
}

每次都有很多方法可以添加单引号,但我认为上面的map是最干净的。

您当然可以提供自己的标签,只需确保它们被正确引用并与 timefmt 相同。我认为Perl的q()引用运算符是可行的方法。

labels=>[ q('2005-6-7_07:04:53') , q('2005-6-7_07:05:10') ]

完整的工作示例

这是一个完整的工作示例,从gnuplot tick示例中进行了修改。

    #!/usr/bin/perl -w
    use strict;
    use Chart::Gnuplot;

    # Change the date time format of the tic labels
    # - the solution is the same as change the number format

    # Date array
    my @x = qw(
    2005-6-7_07:00:00
    2005-6-7_07:05:00
    2005-6-7_07:10:00
    2005-6-7_07:15:00
    );

    my @y = qw(
    3562279127
    3710215571
    3877469703
    3876354871
    );

    # Create the chart object
    my $chart = Chart::Gnuplot->new(
        output   => 'test.png',
        xtics    => {
            rotate => -90,
            labelfmt => "%m-%d %H",
            labels=>[map { q(').$_.q(') } @x]
        },
        timeaxis => "x", # declare that x-axis uses time format
    );

    # Data set object
    my $data = Chart::Gnuplot::DataSet->new(
        xdata   => \@x,
        ydata   => \@y,
        style   => 'linespoints',
        timefmt => '%Y-%m-%d_%H:%M:%S',
    );

    # Plot the graph
    $chart->plot2d($data);

如果没有labels,你就会得到类似的东西。

Without specifying labels you get automatic ones

使用labels,你会得到类似的结果。

Fixing label locations to provided values