PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : JFreeChart Range-Skala verschwindet immer


darph
2008-08-24, 14:47:26
Ich habe eine Java-Applikation, die die Meßwerte eines Massenspektrometers darstellen soll. Dazu nutze ich JFreeChart, das ich sukzessive mit den Daten füttere.

So sieht es aus, wenn das Programm gestartet wurde
http://img393.imageshack.us/img393/6714/fa550leerqt0.th.jpg (http://img393.imageshack.us/my.php?image=fa550leerqt0.jpg)

So sieht es aus, wenn der Prüflauf abgeschlossen wurde:
http://img297.imageshack.us/img297/81/fa550vollip4.th.jpg (http://img297.imageshack.us/my.php?image=fa550vollip4.jpg)

Wie man sieht, fehlt die Skala. Sobald der erste Datenpunkt eingefügt wird, verschwindet diese und taucht auf nicht mehr auf, wenn beispielsweise die clear()-Methode aufgerufen wird. Ich bräuchte jetzt aber schon irgendwie einen Hinweis darauf, in welcher Skala sich das ganze befindet, zum einen, weil es sich um eine Logarithmic-Chart handelt, zum Anderen, weil sich die Range automatisch vergrößert, wenn die Meßwerte steigen. Das ist aber nur sinnvoll, wenn ich einen Anhaltspunkt für die Skalierung habe. Ich brauche die Skala, aber ich verstehe beim Besten Willen nicht, warum sie verschwindet.

Hat jemand eine Idee?

Hier die Klasse, welche den Graphen zeichnet:



public class SniffingChart implements GraphicsView {

private static ResourceBundle settings = ResourceBundle
.getBundle("settings");
private static ResourceBundle languageFile = ResourceBundle.getBundle(
"lang", new Locale(settings.getString("locale")));
private static final double MARGIN = 0.00005;
private ChartPanel chartPanel;
private XYPlot plot;
private LogarithmicAxis rangeAxis; //
private ValueMarker thresholdMarker;
private XYSeries valueSeries;

public SniffingChart(String title) {

XYSeriesCollection xYDataSet = new XYSeriesCollection();
valueSeries = new XYSeries(languageFile.getString("value"), true);
xYDataSet.addSeries(valueSeries);
JFreeChart chart = ChartFactory.createTimeSeriesChart(title,
languageFile.getString("time"), languageFile
.getString("helium"), xYDataSet, true, false, false);
chartPanel = new ChartPanel(chart, true);
chartPanel.setPopupMenu(null);
chartPanel.setDomainZoomable(false);
chartPanel.setRangeZoomable(false);

Dimension d = new Dimension(900, 300);

chartPanel.setMaximumSize(d);
chartPanel.setPreferredSize(d);
chartPanel.setMinimumSize(d);

plot = (XYPlot) chart.getPlot();
plot.setDomainGridlinesVisible(true);

NumberAxis timeAxis = new NumberAxis();
timeAxis.setAutoRangeIncludesZero(true);
timeAxis.setLowerBound(0);
timeAxis.setUpperBound(50000);
timeAxis.setNumberFormatOverride(new DecimalFormat("#0.## ms"));
plot.setDomainAxis(timeAxis);

rangeAxis = new LogarithmicAxis(languageFile.getString("axisLabel"));
rangeAxis.setExpTickLabelsFlag(true);
rangeAxis.setNumberFormatOverride(new DecimalFormat(settings
.getString("heformat")));
plot.setRangeAxis(rangeAxis);

plot.getRenderer().setSeriesPaint(0, Color.RED);
plot.setBackgroundPaint(Color.WHITE);

LegendTitle legendtitle = new LegendTitle(plot);
legendtitle.setPosition(RectangleEdge.BOTTOM);
chart.removeLegend();
}

public void addValue(SniffingDataPoint dataPoint) {
valueSeries.add(dataPoint.getTimeStamp(), dataPoint.getValue());
}

public void clear() {
valueSeries.clear();
plot.clearDomainMarkers();
plot.clearRangeMarkers();
this.thresholdMarker = null;
chartPanel.removeAll();
}

public ChartPanel getPanel() {
return this.chartPanel;
}

@Override
public void setPeak(SniffingDataPoint peak) {
rangeAxis.setUpperBound(peak.getValue() + MARGIN);

}

@Override
public void setPosition(RobotPosition position) {
Marker marker = new ValueMarker(position.getTimeStamp());
if (position.getPosition() == RobotPosition.STOP) {
marker.setPaint(Color.BLACK);
marker.setStroke(new BasicStroke(2));
marker.setLabel(languageFile.getString("stop").toUpperCase());
} else {
marker.setPaint(Color.ORANGE);
marker.setStroke(new BasicStroke(3));
marker.setLabel(position.getPosition() + ">");
}
plot.addDomainMarker(marker);
}

@Override
public void setResult(boolean isOK) {
/* no-op */
}

@Override
public void setThreshold(double threshold) {
if (thresholdMarker == null) {
thresholdMarker = new ValueMarker(threshold);
thresholdMarker.setPaint(Color.GREEN);
thresholdMarker.setLabel(languageFile.getString("threshold"));
thresholdMarker.setLabelAnchor(RectangleAnchor.BOTTOM_RIGHT);
thresholdMarker.setLabelTextAnchor(TextAnchor.TOP_RIGHT);
plot.addRangeMarker(thresholdMarker);
}
}

// [...]
}

Berni
2008-08-24, 15:46:27
Wenn du das Chart einfach mal testweise viel höher machst wird auch nichts dargestellt?

darph
2008-08-24, 15:51:12
Wenn du das Chart einfach mal testweise viel höher machst wird auch nichts dargestellt?
Nope.

Es ist ja nicht so, daß das nicht einfach nur nicht in's Fenster paßt. Es sollte ja auch kleinere Werte anzeigen können, wofür bräuchte ich sonst die Logarithmic-Axis? (Helium kommt in der Luft mit rund 5,2E-6 ppm vor) Aber der Graph wird ja breiter. Es werden nicht nur die Zahlen nicht angezeigt, sondern der Platz für die Zahlen verschwindet - das Graphenfeld wird um ein paar Pixel breiter.

Wenn ich es beim Start kleiner mache, bekomme ich dann auch für jede zusätzliche Nullstelle einen Streifen. Also bei 0.1, bei 0.01, bei 0.001 etc. Aber auch die verschwinden, sobald ein erster Datenpunkt eingefügt wird.