如何使用JFreeChart
在不斷更新時間序列只顯示最新的數據最近的變化?使用的JFreeChart顯示的時間序列
附錄:一個完整的,工作示例併入接受的答案被示出here。另見variation有兩個系列。關於setTimeBase()
,另請參閱此Q&A。
如何使用JFreeChart
在不斷更新時間序列只顯示最新的數據最近的變化?使用的JFreeChart顯示的時間序列
附錄:一個完整的,工作示例併入接受的答案被示出here。另見variation有兩個系列。關於setTimeBase()
,另請參閱此Q&A。
您也可以消除第一advanceTime(零),然後appendData。 (在示例中交換他們正在做的事情)。
的JFreeChart
類DynamicTimeSeriesCollection
是一個不錯的選擇。
附錄:正如@Bahadır指出,該系列的最後一點是持續零。 @Don有用地建議提前時間,然後然後附加數據。
dataset.advanceTime();
dataset.appendData(newData);
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.DynamicTimeSeriesCollection;
import org.jfree.data.time.Second;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
/** @see http://stackoverflow.com/questions/5048852 */
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 = 2 * 60;
private static final int FAST = 100;
private static final int SLOW = FAST * 5;
private static final Random random = new Random();
private Timer timer;
public DTSCTest(final String title) {
super(title);
final DynamicTimeSeriesCollection dataset =
new DynamicTimeSeriesCollection(1, COUNT, new Second());
dataset.setTimeBase(new Second(0, 0, 0, 1, 1, 2011));
dataset.addSeries(gaussianData(), 0, "Gaussian data");
JFreeChart chart = createChart(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() {
float[] newData = new float[1];
@Override
public void actionPerformed(ActionEvent e) {
newData[0] = randomValue();
dataset.advanceTime();
dataset.appendData(newData);
}
});
}
private float randomValue() {
return (float) (random.nextGaussian() * MINMAX/3);
}
private float[] gaussianData() {
float[] a = new float[COUNT];
for (int i = 0; i < a.length; i++) {
a[i] = randomValue();
}
return a;
}
private JFreeChart createChart(final XYDataset dataset) {
final JFreeChart result = ChartFactory.createTimeSeriesChart(
TITLE, "hh:mm:ss", "milliVolts", dataset, true, true, false);
final XYPlot plot = result.getXYPlot();
ValueAxis domain = plot.getDomainAxis();
domain.setAutoRange(true);
ValueAxis range = plot.getRangeAxis();
range.setRange(-MINMAX, MINMAX);
return result;
}
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();
}
});
}
}
@ thrashgod的答案的另一種方法是使用TimeSeriesCollection
並在TimeSeries
上設置項目的年齡。下面的代碼可以設置圖形以1分鐘的間隔顯示最近1小時的數據。
sensorSeries.add(new Minute(new Date()), newData);
感謝這個偉大的樣本:
..和你會它帶有添加數據。你知道一種方法來防止線路的最後一點爲零嗎? – 2011-04-28 13:29:09
@Bahadır:它似乎是`advanceTime()`的有意效果。我從來沒有用過不同的基線值。有什麼想法嗎?不要忘記提高你認爲有用的答案。 :-) – trashgod 2011-04-28 16:30:56
「你上次投票在本回答四月25在13:11」我總是這樣做。順便說一句,我通過使用TimeSeriesCollection而不是動態的來修復這個問題。然後用add添加dataset.appendData,並設置數據集的生存時間。它提供了幾乎相同的功能。 – 2011-04-28 20:21:48