Отображение общего времени в секундах на TimeSeries JFreeChart

Я использую TimeSeries jfreechart для отображения производительности сети. Я хочу показать общее время, прошедшее в секундах, но он показывает только секунды от 0 до 59, а затем снова сбрасывает секунды на 0. Мне нужно показать данные за последние 120 секунд.

Вот код: Эта функция используется для создания диаграммы:

private JFreeChart createChart(XYDataset xydataset) {

    result = ChartFactory.createTimeSeriesChart("admin0", "", "MBytes/S", xydataset, true, true, true);
    TextTitle objTitle = new TextTitle("admin0", new Font("Verdana", Font.BOLD, 12));
    result.setTitle(objTitle);

        final XYPlot plot = result.getXYPlot();
        plot.setDomainGridlinesVisible(true);
        plot.setRangeGridlinesVisible(true);
        plot.setBackgroundPaint(Color.WHITE);
        plot.setRangeGridlinePaint(Color.GRAY);
        plot.setDomainGridlinePaint(Color.GRAY);


       DateAxis xaxis = (DateAxis)plot.getDomainAxis();
        xaxis.setAutoRange(true); ////set true to move graph with time.
        xaxis.setFixedAutoRange(120000.0);
        xaxis.setTickUnit(new DateTickUnit(DateTickUnit.SECOND, 15, new SimpleDateFormat("ss")));


        NumberAxis range = (NumberAxis) plot.getRangeAxis();///y-Axis
        range.setRange(0.0, 1.0);
        range.setTickUnit(new NumberTickUnit(0.2));

        XYItemRenderer renderer = plot.getRenderer();
        renderer.setSeriesPaint(0, Color.RED);
        renderer.setSeriesPaint(1, Color.GREEN);

        return result;

}

А вот код для создания набора данных:

  private XYDataset createAdmin0DatasetTest() {

     TimeSeriesCollection dataset = new TimeSeriesCollection();

    try
    {

     if(performanceData != null)
     {
         long speed = 0;
         double recieveRate = 0;
         double sendRate = 0;
         long timeinMilli = 0;
         long devider = 4294967296l;
         long snapTime = 0;

         Vector admin0Vec = (Vector)this.performanceData.get("admin0");
            if(admin0Vec != null && admin0Vec.size() > 0)
            {
                Vector innerVec = (Vector)admin0Vec.get(0);             
                recieveRate = Long.parseLong(innerVec.get(2).toString());
                sendRate = Long.parseLong(innerVec.get(1).toString());

                timeinMilli = Long.parseLong(innerVec.get(0).toString());

                }catch(Exception ex)
                {
                    System.out.println("Exception in adding same values");
                }


                for(int i  = 1 ; i < admin0Vec.size() ; i++)
                {
                    innerVec = (Vector)admin0Vec.get(i);                
                    recieveRate = Long.parseLong(innerVec.get(2).toString());
                    sendRate = Long.parseLong(innerVec.get(1).toString());
                    timeinMilli = Long.parseLong(innerVec.get(0).toString());
                    try
                    {
                        this.adminRecieve.addOrUpdate(new Second(new Date(timeinMilli)), recieveRate);
                        this.adminSend.addOrUpdate(new Second(new Date(timeinMilli)), sendRate);

                    }catch(Exception ex)
                    {
                        System.out.println("Exception in adding same values");
                        //ex.printStackTrace();
                    }


                }
                dataset = new TimeSeriesCollection(this.adminRecieve);
                dataset.addSeries(adminSend);

            }
     }
     }catch(Exception ex)
     {
         ex.printStackTrace();
     }

  return dataset;
}

Пожалуйста, помогите мне


person user1553769    schedule 10.01.2014    source источник


Ответы (1)


Намекать:

Вы используете DateAxis для оси своего домена и отображаете его в секундах, поэтому наверняка он будет отображать только секундную часть данных без вычисления каких-либо итогов. Более того, он не должен начинаться с нуля и будет отображать данные только за 120 секунд.

Вам нужен не временной ряд, то есть числа против времени, а ряд данных чисел и чисел (прошедшие секунды). Постройте его таким образом и используйте NumberAxis для домена.

Примечание. Вышеуказанное предназначено для реального отображения общего прошедшего времени, например для данных между 480 и 600 секундами метки будут, например, 480, 500, 520, 540, 560, 580, 600 (то есть всего, как указано в заголовке, с некоторого момента). Если вопрос в том, чтобы иметь статические метки, например -120, -100, -80, -60, -40, -20, 0, при перемещении данных тогда установка меток и меток на оси должна выполняться по-другому.

person Oleg Sklyar    schedule 10.01.2014
comment
Как использовать NumberAxis с графиком timeSeries? Потому что мне нужен движущийся график, показывающий производительность сети, как у нас есть график производительности рабочего стола с секундами по оси x. Если я попытаюсь использовать NumberAxis в качестве оси x, график перестанет двигаться вперед. Не могли бы вы объяснить мне какой-нибудь работающий пример? - person user1553769; 10.01.2014
comment
AFAIK движущаяся функция не зависит от оси, которая является DateAxis, а данные - это временные ряды. Функциональность перемещения обеспечивается путем ограничения диапазона данных с помощью setFixedAutoRange, а затем добавления данных, выходящих за пределы исходного диапазона. Вы можете сделать то же самое для NumberAxis: xaxis.setAutoRange(true); xaxis.setFixedAutoRange(120000.0);, где данные здесь должны быть разницей в миллисекундах до первой точки в наборе данных или миллисекундах с момента epoc - person Oleg Sklyar; 10.01.2014
comment
Таким образом, вам нужно изменить dataset = new TimeSeriesCollection(this.adminRecieve);, чтобы он не стал TimeSeriesCollection, поскольку вам здесь не нужна концепция времени (в смысле лет, месяцев, ..., секунд, миллисекунд), а нужно просто числовое представление момента времени или разница между этим моментом и более ранним моментом (начало): просто извлеките миллисекунду из даты / времени и заполните числовой набор данных (извините, я не помню JavaDoc jfreechart, чтобы сообщить вам объекты, какого именно класса вам нужно построить) - person Oleg Sklyar; 10.01.2014
comment
Спасибо за ваш быстрый ответ, теперь я использую dataset = new XYSeriesCollection () и this.adminRecieve = new XYSeries () и создаю с ним TimeSeriesChart, но когда я пытаюсь получить NumberAxis xaxis = (NumberAxis) plot.getDomianAxis (), это дает me исключение как java.lang.ClassCastException: org.jfree.chart.axis.DateAxis нельзя преобразовать в org.jfree.chart.axis.NumberAxis - person user1553769; 10.01.2014
comment
Из-за этого ChartFactory.createTimeSeriesChart(...? - person Oleg Sklyar; 10.01.2014
comment
Чем вы так много, я понял вашу точку зрения. Теперь это работает нормально. Теперь как я могу сделать мою ось x статической от 0 до 120 и продолжить движение графика? - person user1553769; 10.01.2014
comment
Я не делал этого годами и не помню, но следующее надеюсь поможет - person Oleg Sklyar; 10.01.2014