[Schmitzm-commits] r736 - in trunk/src/schmitzm/jfree: . feature/style resource/locales

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Tue Mar 2 17:22:13 CET 2010


Author: alfonx
Date: 2010-03-02 17:22:12 +0100 (Tue, 02 Mar 2010)
New Revision: 736

Modified:
   trunk/src/schmitzm/jfree/JFreeChartUtil.java
   trunk/src/schmitzm/jfree/feature/style/FeatureChartStyle.java
   trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java
   trunk/src/schmitzm/jfree/resource/locales/JFreeResourceBundle.properties
   trunk/src/schmitzm/jfree/resource/locales/JFreeResourceBundle_de.properties
Log:
AV: The regression coefficient has not been correctly calculated. Also added tooltip to the regression line.

Modified: trunk/src/schmitzm/jfree/JFreeChartUtil.java
===================================================================
--- trunk/src/schmitzm/jfree/JFreeChartUtil.java	2010-03-01 17:15:25 UTC (rev 735)
+++ trunk/src/schmitzm/jfree/JFreeChartUtil.java	2010-03-02 16:22:12 UTC (rev 736)
@@ -45,6 +45,7 @@
 import org.jfree.chart.event.RendererChangeEvent;
 import org.jfree.chart.event.RendererChangeListener;
 import org.jfree.chart.labels.StandardXYToolTipGenerator;
+import org.jfree.chart.labels.XYSeriesLabelGenerator;
 import org.jfree.chart.labels.XYToolTipGenerator;
 import org.jfree.chart.plot.CategoryPlot;
 import org.jfree.chart.plot.Plot;
@@ -224,24 +225,28 @@
 	}
 
 	/**
-	 * Centers a gives {@link Plot}. For
-	 * {@link CategoryPlot} only the range axis is centered.
+	 * Centers a gives {@link Plot}. For {@link CategoryPlot} only the range
+	 * axis is centered.
 	 * 
 	 * @param axis
 	 *            the {@link Plot} to center
 	 * @param boundaryPct
 	 *            percentage boundary the absolute maximum is extended with
 	 * @param symetric
-	 *            If <code>true</code> the axis is centered symmetrically around it medium.
+	 *            If <code>true</code> the axis is centered symmetrically around
+	 *            it medium.
 	 */
 	public static void zoomPlotToFullExtend(Plot plot, Double boundaryPct,
 			boolean symetric) {
 		if (plot instanceof XYPlot) {
-			zoomAxisToFullExtend(((XYPlot) plot).getDomainAxis(), boundaryPct, symetric);
-			zoomAxisToFullExtend(((XYPlot) plot).getRangeAxis(), boundaryPct, symetric);
+			zoomAxisToFullExtend(((XYPlot) plot).getDomainAxis(), boundaryPct,
+					symetric);
+			zoomAxisToFullExtend(((XYPlot) plot).getRangeAxis(), boundaryPct,
+					symetric);
 		}
 		if (plot instanceof CategoryPlot)
-			zoomAxisToFullExtend(((CategoryPlot) plot).getRangeAxis(), boundaryPct, symetric);
+			zoomAxisToFullExtend(((CategoryPlot) plot).getRangeAxis(),
+					boundaryPct, symetric);
 	}
 
 	/**
@@ -613,8 +618,8 @@
 				plot, true);
 
 		return chart; // ChartFactory.createScatterPlot(title, xAttr, yAttr,
-						// dataset, PlotOrientation.HORIZONTAL, true, true,
-						// true);
+		// dataset, PlotOrientation.HORIZONTAL, true, true,
+		// true);
 	}
 
 	/**
@@ -639,6 +644,61 @@
 	}
 
 	/**
+	 * Returns the parameters 'a' and 'b' for an equation y = a + bx, fitted to
+	 * the data using ordinary least squares regression. The result is returned
+	 * as a double[], where result[0] --> a, and result[1] --> b.
+	 * 
+	 * @param data
+	 *            the data.
+	 * @param series
+	 *            the series (zero-based index).
+	 * 
+	 * @return Steigung und Y-Achsenabstand sowie den Produkmomentkorrelationskoefizienten r
+	 */
+	public static double[] getOLSRegression(XYDataset data, int series) {
+
+		int n = data.getItemCount(series);
+		if (n < 2) {
+			throw new IllegalArgumentException("Not enough data.");
+		}
+
+		double sumX = 0;
+		double sumXsq = 0;
+		double sumY = 0;
+		double sumYsq = 0;
+		double sumXX = 0;
+		double sumXY = 0;
+		for (int i = 0; i < n; i++) {
+			double x = data.getXValue(series, i);
+			double y = data.getYValue(series, i);
+			sumX += x;
+			sumXsq += x * x;
+			sumY += y;
+			sumYsq += y * y;
+			double xx = x * x;
+			sumXX += xx;
+			double xy = x * y;
+			sumXY += xy;
+		}
+		double sxx = sumXX - (sumX * sumX) / n;
+		double sxy = sumXY - (sumX * sumY) / n;
+		double xbar = sumX / n;
+		double ybar = sumY / n;
+
+		double[] result = new double[3];
+		result[1] = sxy / sxx;
+		result[0] = ybar - result[1] * xbar;
+		
+		// Added by me:
+		result[2] = (n * sumXY - sumX * sumY)
+				/ Math.sqrt((n * sumXsq - sumX * sumX)
+						* (n * sumYsq - sumY * sumY));
+
+		return result;
+
+	}
+
+	/**
 	 * Creates sample data for a regression line of an {@link XYDataset}.
 	 * 
 	 * @param dataset
@@ -660,17 +720,40 @@
 			int series, String seriesKey, double startX, double endX,
 			int sampleCount) {
 		try {
-			double[] coefficients = Regression
-					.getOLSRegression(dataset, series);
+			double[] coefficients = getOLSRegression(dataset, series);
 
-			seriesKey += " r²="
-					+ DecimalFormat.getInstance().format(
-							coefficients[1] * coefficients[1]);
+			double r = coefficients[2];
+			double rAbs = Math.abs(r);
+			seriesKey += ", r=" + DecimalFormat.getInstance().format(r);
 
+			// Depending on the quality of the regression, we add a note
+			// (c) LAUX
+			if (rAbs < 0.01) {
+				seriesKey += " (" + RESOURCE.getString("regression.none") + ")";
+			} else if (rAbs < 0.5) {
+				seriesKey += " (" + RESOURCE.getString("regression.weak") + ")";
+			} else if (rAbs < 0.7) {
+				seriesKey += " (" + RESOURCE.getString("regression.medium")
+						+ ")";
+			} else if (rAbs < 0.86) {
+				seriesKey += " (" + RESOURCE.getString("regression.strong")
+						+ ")";
+			} else if (rAbs < 1.) {
+				seriesKey += " (" + RESOURCE.getString("regression.verystrong")
+						+ ")";
+			} else
+				seriesKey += " (" + RESOURCE.getString("regression.total") + ")";
+
 			Function2D curve = new LineFunction2D(coefficients[0],
 					coefficients[1]);
+			
+// SK: Played around to make the line longer, but then the view will automatically get bigger also.. So it is probably OK the way it is			
+//			return DatasetUtilities.sampleFunction2D(curve, startX-Math.abs(endX-startX)*10, endX+Math.abs(endX-startX)*10, 2,
+//					seriesKey);
+			
 			return DatasetUtilities.sampleFunction2D(curve, startX, endX, 2,
-					seriesKey);
+			seriesKey);
+			
 		} catch (Exception err) {
 			// according to the data sometimes the regression
 			// dataset could not be created
@@ -698,8 +781,18 @@
 		// create and set the renderer for the regression line
 		XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true,
 				false);
+		final String string = RESOURCE.getString("regressionline.tooltip");
+		renderer.setLegendItemToolTipGenerator(new XYSeriesLabelGenerator() {
+			
+			@Override
+			public String generateLabel(XYDataset dataset, int series) {
+				return string;
+			}
+		});
 		renderer.setSeriesPaint(0, Color.blue);
 		plot.setRenderer(datasetCount, renderer);
+		
+		// TODO Ich will einen schönen Tooltip für die Regressionslinine in der Legende
 	}
 
 	// ###################

Modified: trunk/src/schmitzm/jfree/feature/style/FeatureChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/feature/style/FeatureChartStyle.java	2010-03-01 17:15:25 UTC (rev 735)
+++ trunk/src/schmitzm/jfree/feature/style/FeatureChartStyle.java	2010-03-02 16:22:12 UTC (rev 736)
@@ -74,24 +74,32 @@
 	 */
 	public static enum AggregationFunction {
 		/** Count of the attribute values. */
-		COUNT,
+		COUNT(false),
 		/** Sum of the attribute values. */
-		SUM,
+		SUM(false),
 		// /** Sum of the absolute attribute values. */
 		// SUM_ABS,
 		/** Average of the attribute values. */
-		AVG,
+		AVG(false),
+		/** Weighted average of the attribute values. Need another attribute column selected **/
+		AVG_WEIGHTED(true),
 		// /** Median of the attribute values. */
 		// MEDIAN,
 		/** Minimum attribute value. */
-		MIN,
+		MIN(false),
 		/** Maximum attribute value. */
-		MAX,
+		MAX(false),
 		/** Variance of the attribute values. */
-		VARIANCE,
+		VARIANCE(false),
 		/** Standard deviation of the attribute values. */
-		STND_DEV;
+		STND_DEV(false);
+		
+		private final boolean weighted;
 
+		private AggregationFunction(boolean weighted) {
+			this.weighted = weighted;
+		}
+
 		/**
 		 * Prefix for the title (.TITLE) and description (.DESC) key in the
 		 * resource bundle.
@@ -111,6 +119,7 @@
 		public Double getResult(StaticBin1D statistics) {
 			switch (this) {
 			case AVG:
+			case AVG_WEIGHTED:
 				return statistics.mean();
 			case MAX:
 				return statistics.max();
@@ -197,6 +206,11 @@
 		public static ListCellRenderer getListCellRenderer() {
 			return listCellRenderer;
 		}
+
+		/** Returns true, if this aggreation method is used a second attribute for weighting **/
+		public boolean isWeighted() {
+			return weighted;
+		}
 	}
 
 	/**

Modified: trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java
===================================================================
--- trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java	2010-03-01 17:15:25 UTC (rev 735)
+++ trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java	2010-03-02 16:22:12 UTC (rev 736)
@@ -68,6 +68,7 @@
 import schmitzm.jfree.feature.Feature2SeriesDatasetMapping;
 import schmitzm.jfree.feature.FeatureDatasetMetaData;
 import schmitzm.jfree.feature.FeatureDatasetSelectionModel;
+import schmitzm.jfree.feature.style.FeatureChartStyle.AggregationFunction;
 import skrueger.AttributeMetadata;
 import skrueger.geotools.AttributeMetadataMap;
 
@@ -253,12 +254,12 @@
 		// Calculate any statistics needed for normalization.
 		HashMap<String, StaticBin1D> statisticsForNormalization = calcStatisticsForNormalization(
 				fc, chartStyle);
-        // Prepare set for statistics to calculate aggregation
+		// Prepare set for statistics to calculate aggregation
 		// functions (one statistic for each range attribute of
 		// each domain value)
-        HashMap<Number, StaticBin1D>[] statisticsForAggregation = new HashMap[attrCount];
-        for (int i=1; i<attrCount; i++)
-          statisticsForAggregation[i] = new HashMap<Number, StaticBin1D>();
+		HashMap<Number, StaticBin1D>[] statisticsForAggregation = new HashMap[attrCount];
+		for (int i = 1; i < attrCount; i++)
+			statisticsForAggregation[i] = new HashMap<Number, StaticBin1D>();
 
 		// If dataset should be sorted, the features must be sorted first
 		// according to the domain attribute. The "autoSort" functionality
@@ -288,23 +289,31 @@
 			Number xValue = (Number) f.getAttribute(xAttrName);
 
 			// Filter out NODATA values
-			xValue = chartStyle.filterNoDataValue(ChartStyle.DOMAIN_AXIS, xValue);
+			xValue = chartStyle.filterNoDataValue(ChartStyle.DOMAIN_AXIS,
+					xValue);
 			if (xValue == null)
 				continue;
 
-            /*
-             * Normalization of the domain axis value (if they are not
-             * handled as categories)
-             */
-            if (chartStyle.isAttributeNormalized(ChartStyle.DOMAIN_AXIS))
-                xValue = normalize(xValue, xAttrName,
-                        statisticsForNormalization);
+			/*
+			 * Normalization of the domain axis value (if they are not handled
+			 * as categories)
+			 */
+			if (chartStyle.isAttributeNormalized(ChartStyle.DOMAIN_AXIS))
+				xValue = normalize(xValue, xAttrName,
+						statisticsForNormalization);
 
 			// Determine the Y values and fill the series
 			for (int attrIdx = 1; attrIdx < attrCount; attrIdx++) {
 				String yAttrName = chartStyle.getAttributeName(attrIdx);
 				Number yValue = (Number) f.getAttribute(yAttrName);
+				AggregationFunction attributeAggregation = chartStyle
+						.getAttributeAggregation(attrIdx);
 
+				long yWeightValue = 1;
+//				if (attributeAggregation != null && attributeAggregation.isWeighted())
+//					yWeightValue = ((Number) f.getAttribute("POP_CNTRY"))
+//							.longValue();
+
 				// Filter out NoDataValues
 				yValue = chartStyle.filterNoDataValue(attrIdx, yValue);
 				if (yValue == null)
@@ -317,43 +326,51 @@
 
 				// Fill series, if no aggregation function is defined.
 				// Otherwise fill statistic (dataset is filled later!)
-				if ( chartStyle.getAttributeAggregation(attrIdx) == null ) {
-				  // Fill series
-				  xySeries[attrIdx].add(xValue, yValue);
-				  // Mapping between FID and data index in series
-				  mapping.setMapping(f.getID(), yAttrName, datasetIdx++);
+				if (attributeAggregation == null) {
+					// Fill series
+					xySeries[attrIdx].add(xValue, yValue);
+					// Mapping between FID and data index in series
+					mapping.setMapping(f.getID(), yAttrName, datasetIdx++);
 				} else {
-				  StaticBin1D aggrStat = statisticsForAggregation[attrIdx].get(xValue);
-				  if ( aggrStat == null ) {
-				    aggrStat = new DynamicBin1D();
-				    statisticsForAggregation[attrIdx].put(xValue, aggrStat);
-				  }
-				  aggrStat.add(yValue.doubleValue());
-				  // TODO: Mapping vormerken (??)
-				  // Problem: siehe unten
+					// The values for this are aggregated
+					StaticBin1D aggrStat = statisticsForAggregation[attrIdx]
+							.get(xValue);
+					if (aggrStat == null) {
+						aggrStat = new DynamicBin1D();
+						statisticsForAggregation[attrIdx].put(xValue, aggrStat);
+					}
+
+					// The default weight is 1
+//					for (int i = 0; i < yWeightValue; i++)
+						aggrStat.add(yValue.doubleValue());
+
+					// TODO: Mapping vormerken (??)
+					// Problem: siehe unten
 				}
 			}
 		}
-		
+
 		// Fill series for aggregated range attributes
-        for (int attrIdx = 1; attrIdx < attrCount; attrIdx++) {
-          String yAttrName = chartStyle.getAttributeName(attrIdx);
-          FeatureChartStyle.AggregationFunction aggrFunc = chartStyle.getAttributeAggregation(attrIdx);
-          if ( aggrFunc == null )
-            continue;
-          for (Number xValue : statisticsForAggregation[attrIdx].keySet() ) {
-            StaticBin1D aggrStat = statisticsForAggregation[attrIdx].get(xValue);
-            Number      yValue   = aggrFunc.getResult(aggrStat); 
-            // Fill series
-            xySeries[attrIdx].add(xValue, yValue);
-            // TODO: Mapping setzen
-            // Problem: Pro dataset item kann nur EINE FeatureID gesetzt
-            //          werden (Feature2DatasetMapping, Zeile 124) 
-//            // Mapping between FID and data index in series
-//            mapping.setMapping(f.getID() ??, yAttrName, datasetIdx++);
-          }
-        }
-		
+		for (int attrIdx = 1; attrIdx < attrCount; attrIdx++) {
+//			String yAttrName = chartStyle.getAttributeName(attrIdx);
+			FeatureChartStyle.AggregationFunction aggrFunc = chartStyle
+					.getAttributeAggregation(attrIdx);
+			if (aggrFunc == null)
+				continue;
+			for (Number xValue : statisticsForAggregation[attrIdx].keySet()) {
+				StaticBin1D aggrStat = statisticsForAggregation[attrIdx]
+						.get(xValue);
+				Number yValue = aggrFunc.getResult(aggrStat);
+				// Fill series
+				xySeries[attrIdx].add(xValue, yValue);
+				// TODO: Mapping setzen
+				// Problem: Pro dataset item kann nur EINE FeatureID gesetzt
+				// werden (Feature2DatasetMapping, Zeile 124)
+				// // Mapping between FID and data index in series
+				// mapping.setMapping(f.getID() ??, yAttrName, datasetIdx++);
+			}
+		}
+
 		return dataset;
 	}
 
@@ -510,12 +527,12 @@
 		// Calculate any statistics needed for normalization.
 		HashMap<String, StaticBin1D> statisticsForNormalization = calcStatisticsForNormalization(
 				fc, chartStyle);
-        // Prepare set for statistics to calculate aggregation
-        // functions (one statistic for each range attribute of
-        // each domain value)
-        HashMap<Comparable<?>, StaticBin1D>[] statisticsForAggregation = new HashMap[attrCount];
-        for (int i=1; i<attrCount; i++)
-          statisticsForAggregation[i] = new HashMap<Comparable<?>, StaticBin1D>();
+		// Prepare set for statistics to calculate aggregation
+		// functions (one statistic for each range attribute of
+		// each domain value)
+		HashMap<Comparable<?>, StaticBin1D>[] statisticsForAggregation = new HashMap[attrCount];
+		for (int i = 1; i < attrCount; i++)
+			statisticsForAggregation[i] = new HashMap<Comparable<?>, StaticBin1D>();
 
 		// Create a new dataset and insert the series
 		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
@@ -549,16 +566,25 @@
 						.getAttribute(xAttrName);
 
 				// Filter out NODATA values
-				catValue = chartStyle.filterNoDataValue(ChartStyle.DOMAIN_AXIS, catValue);
+				catValue = chartStyle.filterNoDataValue(ChartStyle.DOMAIN_AXIS,
+						catValue);
 
 				if (catValue == null)
 					continue;
 
 				// Determine the Y values and fill the dataset
 				for (int attrIdx = 1; attrIdx < attrCount; attrIdx++) {
+					AggregationFunction attributeAggregation = chartStyle.getAttributeAggregation(attrIdx);
+					
 					String yAttrName = chartStyle.getAttributeName(attrIdx);
 					Number yValue = (Number) f.getAttribute(yAttrName);
 
+					// By default the wight is 1 => no weighting. If the aggregation uses weighting, read the weight attribnute
+					long yWeightValue = 1;
+//					if (attributeAggregation != null && attributeAggregation.isWeighted())
+//						yWeightValue = ((Number) f.getAttribute("POP_CNTRY"))
+//								.longValue();
+
 					// Filter out NoDataValues
 					yValue = chartStyle.filterNoDataValue(attrIdx, yValue);
 					if (yValue == null)
@@ -569,45 +595,55 @@
 						yValue = normalize(yValue, yAttrName,
 								statisticsForNormalization);
 
-	                // Fill series, if no aggregation function is defined.
-	                // Otherwise fill statistic (dataset is filled later!)
-	                if ( chartStyle.getAttributeAggregation(attrIdx) == null ) {
-	                  // Add data to dataset
-	                  dataset.addValue(yValue, yAttrName, catValue);
-	                  // Mapping between FID and data index in series
-	                  mapping.setMapping(f.getID(), yAttrName, catValue);
-	                } else {
-	                  StaticBin1D aggrStat = statisticsForAggregation[attrIdx].get(catValue);
-	                  if ( aggrStat == null ) {
-	                    aggrStat = new DynamicBin1D();
-	                    statisticsForAggregation[attrIdx].put(catValue, aggrStat);
-	                  }
-	                  aggrStat.add(yValue.doubleValue());
-	                  // TODO: Mapping vormerken (??)
-	                  // Problem: siehe unten
-	                }
+					// Fill series, if no aggregation function is defined.
+					// Otherwise fill statistic (dataset is filled later!)
+					if (attributeAggregation == null) {
+						// Add data to dataset
+						dataset.addValue(yValue, yAttrName, catValue);
+						// Mapping between FID and data index in series
+						mapping.setMapping(f.getID(), yAttrName, catValue);
+					} else {
+						StaticBin1D aggrStat = statisticsForAggregation[attrIdx]
+								.get(catValue);
+						if (aggrStat == null) {
+							aggrStat = new DynamicBin1D();
+							statisticsForAggregation[attrIdx].put(catValue,
+									aggrStat);
+						}
+						
+						// The default weight is 1
+//						for (int i = 0; i < yWeightValue; i++)
+							aggrStat.add(yValue.doubleValue());
+						
+						// TODO: Mapping vormerken (??)
+						// Problem: siehe unten
+					}
 				}
 
 			}
 
-		     // Fill series for aggregated range attributes
-	        for (int attrIdx = 1; attrIdx < attrCount; attrIdx++) {
-	          String yAttrName = chartStyle.getAttributeName(attrIdx);
-	          FeatureChartStyle.AggregationFunction aggrFunc = chartStyle.getAttributeAggregation(attrIdx);
-	          if ( aggrFunc == null )
-	            continue;
-	          for (Comparable<?> catValue : statisticsForAggregation[attrIdx].keySet() ) {
-	            StaticBin1D aggrStat = statisticsForAggregation[attrIdx].get(catValue);
-	            Number      yValue   = aggrFunc.getResult(aggrStat); 
-	            // Fill series
-                dataset.addValue(yValue, yAttrName, catValue);
-	            // TODO: Mapping setzen
-	            // Problem: Pro dataset item kann nur EINE FeatureID gesetzt
-	            //          werden (Feature2DatasetMapping, Zeile 124) 
-//	            // Mapping between FID and data index in series
-//	            mapping.setMapping(f.getID() ??, yAttrName, datasetIdx++);
-	          }
-	        }
+			// Fill series for aggregated range attributes
+			for (int attrIdx = 1; attrIdx < attrCount; attrIdx++) {
+				String yAttrName = chartStyle.getAttributeName(attrIdx);
+				FeatureChartStyle.AggregationFunction aggrFunc = chartStyle
+						.getAttributeAggregation(attrIdx);
+				if (aggrFunc == null)
+					continue;
+				for (Comparable<?> catValue : statisticsForAggregation[attrIdx]
+						.keySet()) {
+					StaticBin1D aggrStat = statisticsForAggregation[attrIdx]
+							.get(catValue);
+					Number yValue = aggrFunc.getResult(aggrStat);
+					// Fill series
+					dataset.addValue(yValue, yAttrName, catValue);
+					// TODO: Mapping setzen
+					// Problem: Pro dataset item kann nur EINE FeatureID gesetzt
+					// werden (Feature2DatasetMapping, Zeile 124)
+					// // Mapping between FID and data index in series
+					// mapping.setMapping(f.getID() ??, yAttrName,
+					// datasetIdx++);
+				}
+			}
 		} finally {
 			if (features != null) {
 				// this is a hint
@@ -665,12 +701,13 @@
 	}
 
 	/**
-	 * Passes the NODATA Values stored in the {@link AttributeMetadataMap} to the attributes of the {@link ChartStyle}. 
+	 * Passes the NODATA Values stored in the {@link AttributeMetadataMap} to
+	 * the attributes of the {@link ChartStyle}.
 	 */
 	public static void passNoDataValues(
 			AttributeMetadataMap attributeMetaDataMap,
 			FeatureChartStyle featureChartStyle) {
-		
+
 		// Pass the NODATA values for the attributes to the ChartStyle
 		for (int idx = 0; idx < featureChartStyle.getAttributeCount(); idx++) {
 

Modified: trunk/src/schmitzm/jfree/resource/locales/JFreeResourceBundle.properties
===================================================================
--- trunk/src/schmitzm/jfree/resource/locales/JFreeResourceBundle.properties	2010-03-01 17:15:25 UTC (rev 735)
+++ trunk/src/schmitzm/jfree/resource/locales/JFreeResourceBundle.properties	2010-03-02 16:22:12 UTC (rev 736)
@@ -61,6 +61,8 @@
 AggregationFunction.SUM_ABS.Desc=Sum of the absolute attribute values
 AggregationFunction.AVG.Title=Average
 AggregationFunction.AVG.Desc=Average attribute value
+AggregationFunction.AVG_WEIGHTED.Title=Weighted average
+AggregationFunction.AVG_WEIGHTED.Desc=Weighted average attribute value
 AggregationFunction.MEDIAN.Title=Median
 AggregationFunction.MEDIAN.Desc=Median attribute value
 AggregationFunction.MIN.Title=Minimum
@@ -71,3 +73,13 @@
 AggregationFunction.VARIANCE.Desc=Variance of the attribute values
 AggregationFunction.STND_DEV.Title=Standard Deviation
 AggregationFunction.STND_DEV.Desc=Standard deviation of the attribute values
+
+regression.none=no relation
+regression.weak=weak relation
+regression.medium=medium relation
+regression.strong=strong relation
+regression.verystrong=very strong relation
+regression.total=perfect relation
+
+regressionline.tooltip=<html><i>r</i> is the product-moment-correlation coefficient and gives information about how strong the variables are related.</html>
+

Modified: trunk/src/schmitzm/jfree/resource/locales/JFreeResourceBundle_de.properties
===================================================================
--- trunk/src/schmitzm/jfree/resource/locales/JFreeResourceBundle_de.properties	2010-03-01 17:15:25 UTC (rev 735)
+++ trunk/src/schmitzm/jfree/resource/locales/JFreeResourceBundle_de.properties	2010-03-02 16:22:12 UTC (rev 736)
@@ -36,7 +36,7 @@
 diagram.points=Punkte
 diagram.lines=Linien
 diagram.bars=Balken
-diagram.areas=Fl\u00E4chen
+diagram.areas=Fl\u00e4chen
 
 ChartType_BAR.Title=Balkendiagramm
 ChartType_BAR.Object.Title=Balken
@@ -44,8 +44,8 @@
 ChartType_SCATTER.Object.Title=Punkte
 ChartType_PIE.Title=Kreisdiagramm
 ChartType_PIE.Object.Title=Teil
-ChartType_AREA.Title=Fl\u00E4chendiagramm
-ChartType_AREA.Object.Title=Fl\u00E4chen
+ChartType_AREA.Title=Fl\u00e4chendiagramm
+ChartType_AREA.Object.Title=Fl\u00e4chen
 ChartType_LINE.Title=Liniendiagramm
 ChartType_LINE.Object.Title=Linie
 ChartType_POINT.Title=Punktdiagramm
@@ -72,3 +72,11 @@
 AggregationFunction.STND_DEV.Title=Standard-Abweichung
 AggregationFunction.STND_DEV.Desc=Standard-Abweichung der Attribut-Werte
 
+regression.none=kein Zusammenhang
+regression.weak=schwacher Zusammenhang
+regression.medium=mittlerer Zusammenhang
+regression.strong=starteker Zusammenhang
+regression.verystrong=sehr starker Zusammenhang
+regression.total=vollkommener Zusammenhang
+
+regressionline.tooltip=<html><i>r</i> ist der Produktmomentkorrelationskoefizient und sagt aus, wie stark zwei Variablen voneinander abh\u00e4ngen. 
\ No newline at end of file



More information about the Schmitzm-commits mailing list