Java中的动态时间序列堆积面积图

Java中的动态时间序列堆积面积图,java,dynamic,jfreechart,time-series,stacked-area-chart,Java,Dynamic,Jfreechart,Time Series,Stacked Area Chart,我的要求是在java桌面应用程序中创建一个动态时间序列堆叠面积图。类似于示例,但我想要堆积面积图。我发现了很多堆积面积图的示例,但它们都基于静态数据。这里是动态时间序列堆积面积图示例的修改版本 import java.awt.BorderLayout; import java.awt.Color; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import ja

我的要求是在java桌面应用程序中创建一个动态时间序列堆叠面积图。类似于示例,但我想要堆积面积图。我发现了很多堆积面积图的示例,但它们都基于静态数据。

这里是动态时间序列堆积面积图示例的修改版本

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.Timer;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.DateTickUnitType;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.SeriesRenderingOrder;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StackedXYAreaRenderer;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimePeriod;
import org.jfree.data.time.TimeTableXYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

public class DTSCTest extends ApplicationFrame {

    private static final String TITLE = "Dynamic Series";
    private static final String START = "Start";
    private static final String STOP = "Stop";
    private static final float MINMAX = 100;
    private static final int COUNT = 15;
    private static final int FAST = 1000;
    private static final int SLOW = FAST * 5;
    private static final Random random = new Random();
    private Timer timer;
    private static final String SERIES1 = "Positive";
    private static final String SERIES2 = "Negative";

    public DTSCTest(final String title) {
        super(title);
        final TimeTableXYDataset dataset = new TimeTableXYDataset();        
        JFreeChart chart = createAreaChart(dataset);

        final JButton run = new JButton(STOP);
        run.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String cmd = e.getActionCommand();
                if (STOP.equals(cmd)) {
                    timer.stop();
                    run.setText(START);
                } else {
                    timer.start();
                    run.setText(STOP);
                }
            }
        });

        final JComboBox combo = new JComboBox();
        combo.addItem("Fast");
        combo.addItem("Slow");
        combo.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if ("Fast".equals(combo.getSelectedItem())) {
                    timer.setDelay(FAST);
                } else {
                    timer.setDelay(SLOW);
                }
            }
        });

        this.add(new ChartPanel(chart), BorderLayout.CENTER);
        JPanel btnPanel = new JPanel(new FlowLayout());
        btnPanel.add(run);
        btnPanel.add(combo);
        this.add(btnPanel, BorderLayout.SOUTH);

        timer = new Timer(FAST, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                TimePeriod period = new Second();
                dataset.add(period, randomValue(), SERIES1);
                dataset.add(period, randomValue(), SERIES2);
                if(dataset.getItemCount() > COUNT) {
                    TimePeriod firstItemTime = dataset.getTimePeriod(0);
                    dataset.remove(firstItemTime, SERIES1);
                    dataset.remove(firstItemTime, SERIES2);
                }
            }
        });
    }

    private float randomValue() {
        float randValue = (float) (random.nextGaussian() * MINMAX / 3);
        return randValue < 0 ? -randValue : randValue;
    }

    private JFreeChart createAreaChart(final TimeTableXYDataset dataset) {
        final JFreeChart chart = ChartFactory.createStackedXYAreaChart(
                "Live Sentiment Chart", "Time", "Sentiments", dataset, PlotOrientation.VERTICAL, true, true, false);

        final StackedXYAreaRenderer render = new StackedXYAreaRenderer();
        render.setSeriesPaint(0, Color.RED);
        render.setSeriesPaint(1, Color.GREEN);

        DateAxis domainAxis = new DateAxis();
        domainAxis.setAutoRange(true);
        domainAxis.setDateFormatOverride(new SimpleDateFormat("HH:mm:ss"));
        domainAxis.setTickUnit(new DateTickUnit(DateTickUnitType.SECOND, 1));

        XYPlot plot = (XYPlot) chart.getPlot();
        plot.setRenderer(render);
        plot.setDomainAxis(domainAxis);
        plot.setSeriesRenderingOrder(SeriesRenderingOrder.FORWARD);
        plot.setForegroundAlpha(0.5f);

        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setNumberFormatOverride(new DecimalFormat("#,###.#"));
        rangeAxis.setAutoRange(true);

        return chart;
    }

    public void start() {
        timer.start();
    }

    public static void main(final String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                DTSCTest demo = new DTSCTest(TITLE);
                demo.pack();
                RefineryUtilities.centerFrameOnScreen(demo);
                demo.setVisible(true);
                demo.start();
            }
        });
    }
}

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.EventQueue;
导入java.awt.FlowLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.text.DecimalFormat;
导入java.text.simpleDataFormat;
导入java.util.Random;
导入javax.swing.JButton;
导入javax.swing.JComboBox;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入org.jfree.chart.ChartFactory;
导入org.jfree.chart.ChartPanel;
导入org.jfree.chart.JFreeChart;
导入org.jfree.chart.axis.DateAxis;
导入org.jfree.chart.axis.DateTickUnit;
导入org.jfree.chart.axis.DateTickUnitType;
导入org.jfree.chart.axis.NumberAxis;
导入org.jfree.chart.plot.PlotOrientation;
导入org.jfree.chart.plot.SeriesRenderingOrder;
导入org.jfree.chart.plot.XYPlot;
导入org.jfree.chart.renderer.xy.StackedXYAreaRenderer;
导入org.jfree.data.time.Second;
导入org.jfree.data.time.TimePeriod;
导入org.jfree.data.time.TimeTableXYDataset;
导入org.jfree.ui.ApplicationFrame;
导入org.jfree.ui.RefineryUtilities;
公共类DTSCTest扩展了ApplicationFrame{
私有静态最终字符串TITLE=“动态系列”;
私有静态最终字符串START=“START”;
私有静态最终字符串STOP=“STOP”;
专用静态最终浮动最小值=100;
私有静态最终整数计数=15;
专用静态最终整数FAST=1000;
专用静态最终整数慢=快*5;
私有静态最终随机=新随机();
私人定时器;
私有静态最终字符串SERIES1=“正”;
私有静态最终字符串SERIES2=“负”;
公共DTSCTest(最终字符串标题){
超级(标题);
final TimeTableXYDataset dataset=新的TimeTableXYDataset();
JFreeChart chart=createAreaChart(数据集);
最终JButton运行=新JButton(停止);
run.addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
字符串cmd=e.getActionCommand();
if(停止等于(cmd)){
timer.stop();
run.setText(开始);
}否则{
timer.start();
run.setText(停止);
}
}
});
最终JComboBox组合=新JComboBox();
combo.addItem(“快速”);
组合添加项(“慢”);
combo.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
if(“Fast”.equals(combo.getSelectedItem())){
定时器设置延迟(快速);
}否则{
定时器设置延迟(慢);
}
}
});
添加(新图表面板(图表),边框布局.CENTER);
JPanel btnPanel=newjpanel(newflowlayout());
btnPanel.add(运行);
btnPanel.add(组合);
添加(btnPanel,BorderLayout.SOUTH);
计时器=新计时器(快速,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
时间段=新的秒();
添加(句点,randomValue(),SERIES1);
添加(句点,randomValue(),序列2);
if(dataset.getItemCount()>COUNT){
TimePeriod firstItemTime=dataset.getTimePeriod(0);
dataset.remove(firstItemTime,SERIES1);
dataset.remove(firstItemTime,SERIES2);
}
}
});
}
私有浮点值(){
float randValue=(float)(random.nextGaussian()*MINMAX/3);
返回randValue<0?-randValue:randValue;
}
私有JFreeChart createAreaChart(最终时间表XYDataSet数据集){
最终JFreeChart图表=ChartFactory.createStackedXYAreaChart(
“现场情绪图”、“时间”、“情绪”、数据集、PlotOrientation.VERTICAL、true、true、false);
最终StackedXYAreaRenderer render=新的StackedXYAreaRenderer();
render.setSeriesPaint(0,颜色为红色);
render.setSeriesPaint(1,颜色为绿色);
DateAxis domainAxis=新的DateAxis();
domainAxis.setAutoRange(true);
setDateFormatOverride(新的SimpleDataFormat(“HH:mm:ss”);
domainAxis.setTickUnit(新的DateTickUnit(DateTickUnitType.SECOND,1));
XYPlot=(XYPlot)chart.getPlot();
plot.setRenderer(渲染);
plot.setDomainAxis(domainAxis);
plot.setSeriesRenderingOrder(序列检索顺序向前);
绘图:setForegroundAlpha(0.5f);
NumberAxis rangeAxis=(NumberAxis)plot.getRangeAxis();
rangeAxis.setNumberFormatOverride(新的十进制格式(“#,#,#.#”);
rangeAxis.setAutoRange(真);
收益表;
}
公开作废开始(){
timer.start();
}
公共静态void main(最终字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
DTSCTest demo=新的DTSCTest(标题);
demo.pack();
RefineryUtilities.centerFrameOnScreen(演示版);
demo.setVisible(true);
demo.start();
}
});
}
}

请根据您对引用的示例和所选数据/渲染器的理解,编辑您的问题,将其包括在内。我尝试了这个示例,只显示了一个空白表单。这个代码完成了吗?代码完成了。我只是有一点意见。因为您要从数据集中删除元素