Ограничьте JFreeChart TimeSeries рабочими часами - PullRequest
1 голос
/ 21 марта 2019

Рендеринг диаграммы за несколько дней с набором данных, который имеет данные за 24 часа, но это полезно только во время M-F, с 7:00 до 17:00. Если я установлю временной ряд с кодом ниже, я получу диаграмму, которая содержит все 24 часа, 7 дней в неделю. Имеет смысл, но не для моего случая использования.

Есть ли способ определить, какой интервал отображает временной ряд? Или мне нужно использовать другой тип диаграммы и пытаться вписать мои данные в регулярные периоды? Я надеюсь, что не последний, в то время как данные, которые я получаю, обычно с 30-секундными интервалами, легко могут быть пробелы.

Довольно невозможно опубликовать SSCE работающего пользовательского интерфейса с диаграммой, динамически запрашивающей данные с сервера, но ниже приведены некоторые основные моменты, чтобы получить представление о типах диаграмм, которые я использую.

Некоторые из plot.add, CombinedDomainXY, код индекса 0 могут показаться странными. У меня есть три участка с общими значениями времени, я сократил их до одного здесь, чтобы сократить его. Я предполагаю, что есть способ сделать то, что мне нужно для одного графика, он бы работал для диаграммы с несколькими вспомогательными участками.

public ChartPanel extends JPanel
{
    private final MyDataset _myDataset = new MyDataset();
    private final XYPlot _myPlot = new XYPlot();
    _chartPanel = new ChartPanel( createChart() );
    private JFreeChart createChart()
    {
            CombinedDomainXYPlot plot = new CombinedDomainXYPlot(
                    timeAxis );
            plot.setGap( 10.0 );
            plot.setDomainPannable( true );

            plot.setDataset( index, dataset );
            NumberAxis axis = new NumberAxis();

            axis.setAutoRangeIncludesZero( false );
            plot.setRangeAxis( 0, axis );
            plot.setRangeAxisLocation( 0, axisLocation );
            plot.setRenderer( 0, new StandardXYItemRenderer() );
            plot.mapDatasetToRangeAxis( 0, index );

            // add the subplots...
            plot.add( _myPlot, 1 );
    }
}
public class MyDataset implements XYDataset
{
    @Override
    public double getYValue( int series, int item )
    {
        return getMyData(item);
    }
    @Override
    public double getXValue( int series, int item )
    {
        return _bars.get( item ).DateTime.toInstant().toEpochMilli();
    }
    //other basic overloaded methods left out for brevity
}

1 Ответ

1 голос
/ 23 марта 2019

Вы можете использовать DateAxis с пользовательским Timeline.SegmentedTimeline, рассмотрено здесь , является конкретной реализацией;хотя устарело , оно может служить ориентиром.Исходя из этого примера , ваш условный newWorkdayTimeline() может выглядеть примерно так:

public static SegmentedTimeline newWorkdayTimeline() {
    SegmentedTimeline timeline = new SegmentedTimeline(
        SegmentedTimeline.HOUR_SEGMENT_SIZE, 10, 14);
    timeline.setStartTime(SegmentedTimeline.firstMondayAfter1900()
        + 7 * timeline.getSegmentSize());
    timeline.setBaseTimeline(SegmentedTimeline.newMondayThroughFridayTimeline());
    return timeline;
}

Этот пример иллюстрирует один из способов смягчения любых артефактов рендеринга, с которыми вы сталкиваетесь.

...