Как я могу построить график временного ряда с Perl?

Это зависит от Ваших целей. Можно использовать версию 1, если Вы

  • Намереваетесь заменить тормоза автомобиля (во времени выполнения)
  • , Намереваются раздать Автомобиль для необрабатывания функций по шаблону

, я обычно предпочитал бы версию 1 с помощью полиморфизма во время выполнения, потому что это все еще гибко и позволяет, у Вас, чтобы иметь Автомобиль все еще есть тот же тип: Car другой тип, чем Car. Если Вашими целями является высокая эффективность при использовании тормозов часто, я рекомендую Вам использовать шаблонный подход. Между прочим, это называют основанным на политике дизайном. Вы обеспечиваете политика тормоза . Пример, потому что Вы сказали Вас, запрограммировал в Java, возможно Вы слишком еще не испытаны с C++. Один способ сделать его:

template
class Car {
    Accelerator accelerator;
    Brakes brakes;

public:
    void brake() {
        brakes.brake();
    }
}

, Если у Вас есть много политик, можно собрать в группу их в их собственную структуру и передачу что один, например, как SpeedConfiguration сбор Accelerator, Brakes и еще немного. В моих проектах я пытаюсь сохранить много кода без шаблонов, позволяя им быть скомпилированным однажды в их собственные объектные файлы, не нуждаясь в их коде в заголовках, но все еще позволяя полиморфизм (через виртуальные функции). Например, Вы могли бы хотеть сохранить общие данные и функции, что нешаблон кода, вероятно, обратится ко многим случаям в базовом классе:

class VehicleBase {
protected:
    std::string model;
    std::string manufacturer;
    // ...

public:
    ~VehicleBase() { }
    virtual bool checkHealth() = 0;
};


template
class Car : public VehicleBase {
    Accelerator accelerator;
    Breaks breaks;
    // ...

    virtual bool checkHealth() { ... }
};

Кстати, который является также подходом, который используют потоки C++: std::ios_base содержит флаги, и наполните, которые не зависят от символьного типа или черт как openmode, флаги формата и материал, в то время как std::basic_ios тогда шаблон класса, который наследовал его. Это также уменьшает чрезмерное увеличение размера кода путем совместного использования кода, который характерен для всех инстанцирований шаблона класса.

Частное Наследование?

Частного наследования нужно избежать в целом. Это только очень редко полезно, и включение является лучшей идеей в большинстве случаев. Общий падеж, где противоположное верно, когда размер действительно крайне важен (основанный на политике строковый класс, например): Пустая Оптимизация Базового класса может применяться при получении из пустого класса политики (просто содержащий функции).

Использование Read и злоупотребления Наследованием Herb Sutter.

10
задан Sinan Ünür 22 October 2009 в 22:14
поделиться

6 ответов

Вы можете управлять gnuplot , используя Chart :: Gnuplot .

В качестве альтернативы, если SVG является приемлемым выходным форматом, существует SVG :: TT :: График .

8
ответ дан 3 December 2019 в 15:06
поделиться

Вы можете использовать Chart :: Clicker Axis :: DateTime:

#!/usr/local/bin/perl -w
use strict;
use Chart::Clicker;
use Chart::Clicker::Axis::DateTime;
use Chart::Clicker::Data::Series;
use Chart::Clicker::Data::DataSet;
use Chart::Clicker::Renderer::Point;

my $cc = Chart::Clicker->new;
my $series = Chart::Clicker::Data::Series->new(
    values    => [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ],
    keys      => [
        1256147117, 1256148117, 1256149117, 1256150117, 1256151117, 1256152117,
        1256153117, 1256154117, 1256155117, 1256156117
    ],
);
my $ctx = $cc->get_context('default');
$ctx->domain_axis(Chart::Clicker::Axis::DateTime->new(position => 'bottom', orientation     => 'horizontal'));
my $ds = Chart::Clicker::Data::DataSet->new(series => [ $series ]);
$cc->add_to_datasets($ds);
$cc->write_output('foo.png');

Вы должны преобразовать свое время в временные метки Unix, но это DWIM.

11
ответ дан 3 December 2019 в 15:06
поделиться

Вам нужно, чтобы график создавался в реальном времени или для разового отчета? В последнем случае вы можете использовать модули DateTime для генерации значений Excel и построения их графика в Excel (или его аналоге с открытым исходным кодом).

use DateTime::Format::MySQL;
use DateTime::Format::Excel;

my $dt = DateTime::Format::MySQL->parse_datetime( '2003-01-16 23:12:01' );
print $dt, "\n";
my $daynum = DateTime::Format::Excel->format_datetime($dt);
print $daynum, "\n";

Некоторое время назад я сделал что-то подобное, используя Asymptote . Это замечательный пакет, но им нелегко пользоваться.

1
ответ дан 3 December 2019 в 15:06
поделиться

Я попробовал DBIx :: Chart, но не смог заставить его распознавать мои даты.

Вы пытались перевести свои даты в Unix-Timestamp и использовать их как даты X?

3
ответ дан 3 December 2019 в 15:06
поделиться

Самый простой способ сделать это с помощью Perl - это использовать Perl для запуска процесса gnuplot. Вы можете использовать set timefmt x "% Y-% m-% d" , и он автоматически проанализирует данные в имеющемся у вас формате. Gnuplot также поддерживает множество форматов вывода.

2
ответ дан 3 December 2019 в 15:06
поделиться

Я бы порекомендовал нормализовать даты к целым числам. Метод грубой силы, конечно, будет использовать секунды эпохи, но это может выглядеть не слишком хорошо на графике, поэтому нормализуйте линейным преобразованием в некоторый приличный диапазон (я могу предоставить подробности о том, как, если хотите).

1
ответ дан 3 December 2019 в 15:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: