У меня есть диаграмма JFreeChart, которая отображает измерения с датчика. Диаграмма должна показать, как эти значения меняются со временем.Как фиксировать диапазон доменов диаграммы JFreeChart XY?
создать диаграмму, используя следующий код:
// create the chart...
final JFreeChart chart = ChartFactory.createXYLineChart(
"Pulse sensor data", // chart title
"X", // x axis label
"Y", // y axis label
dataset, // data
PlotOrientation.VERTICAL,
true, // include legend
true, // tooltips
false // urls
);
// NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART...
chart.setBackgroundPaint(Color.white);
// get a reference to the plot for further customisation...
final XYPlot plot = chart.getXYPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
renderer.setDrawSeriesLineAsPath(true);
renderer.setSeriesLinesVisible(0, true);
renderer.setSeriesShapesVisible(0, false);
plot.setRenderer(renderer);
// change the auto tick unit selection to integer units only...
final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
Существует проблема с этой реализацией - ось домена постоянно меняется, следовательно, представление изменений сигналов, а также. Поэтому трудно сказать визуально, изменился ли сигнал значительно.
В начале сеанса измерения область находится в диапазоне от 0 до прибл. 550.
Через некоторое время я получаю больше данных и теперь максимальное значение составляет 35000.
Если мы будем ждать дольше, это еще раз (на самом деле меняется, с каждым полученных измерений литле).
Как я могу изменить код таким образом, что диаграмма показывает измерения последней X (т. Е. Размер оси области остается константа) и вид скользит по времени?
Обновление 1 (01.06.2013 18:06 MSK): Я изменил код для добавления нового элемента данных
sensorSeries.add(new Millisecond(new Date()), voltage);
, где voltage
это новое значение датчика.
Код для создания диаграммы также изменилась:
dataset = new TimeSeriesCollection();
sensorSeries = new TimeSeries("Pulse sensor data");
sensorSeries.setMaximumItemAge(12500);
dataset.addSeries(sensorSeries);
final JFreeChart chart = createChart(dataset);
[...]
private JFreeChart createChart(final XYDataset dataset) {
// create the chart...
final JFreeChart chart = ChartFactory.createTimeSeriesChart(
"Pulse sensor data", // chart title
"X", // x axis label
"Y", // y axis label
dataset, // data
true, // include legend
true, // tooltips
false // urls
);
final XYPlot plot = chart.getXYPlot();
ValueAxis domain = plot.getDomainAxis();
domain.setAutoRange(true);
final ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setAutoRange(true);
return chart;
}
Это работает отлично, за исключением, что иногда я получаю следующее исключение:
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1201, Size: 1201
at java.util.ArrayList.RangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at org.jfree.data.time.TimeSeries.getRawDataItem(TimeSeries.java:422)
at org.jfree.data.time.TimeSeries.getTimePeriod(TimeSeries.java:454)
at org.jfree.data.time.TimeSeriesCollection.getXValue(TimeSeriesCollection.java:428)
at org.jfree.chart.renderer.xy.XYLineAndShapeRenderer.drawPrimaryLine(XYLineAndShapeRenderer.java:987)
at org.jfree.chart.renderer.xy.XYLineAndShapeRenderer.drawItem(XYLineAndShapeRenderer.java:913)
at org.jfree.chart.plot.XYPlot.render(XYPlot.java:3828)
at org.jfree.chart.plot.XYPlot.draw(XYPlot.java:3389)
at org.jfree.chart.JFreeChart.draw(JFreeChart.java:1237)
at org.jfree.chart.ChartPanel.paintComponent(ChartPanel.java:1672)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
Любые идеи, как это исправить?
Смотрите также [* Использование JFreeChart для отображения последних изменений в временном ряде *] (http://stackoverflow.com/q/5048852/230513). – trashgod
@trashgod Спасибо. См. Мое обновление 1. –
Что-то, что происходит _sometimes_, всегда заставляет меня думать о неправильной синхронизации; убедитесь, что вы обновляете модель (набор данных) в [потоке рассылки событий] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod