Ich hoffe, jemand kann mir helfen, ein benutzerdefiniertes Label für die Domain-Achse Tick Etiketten in einem jFreeChart von Jasper Reports erstellt wird. Ich habe alles versucht, was ich online gefunden habe und immer noch keine Würfel. Hier ist mein Code:jFreeChart benutzerdefinierte Domain-Achsenbeschriftungen
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.util.List;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.SymbolAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.CategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.Range;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.text.TextBlock;
import org.jfree.text.TextUtilities;
import org.jfree.ui.RectangleEdge;
import net.sf.jasperreports.engine.JRChart;
import net.sf.jasperreports.engine.JRChartCustomizer;
public class ChartCustomizer implements JRChartCustomizer{
public class CustomColorRenderer extends BarRenderer {
private static final long serialVersionUID = -9045170581109026224L;
@Override
public Paint getItemPaint(int row, int col) {
CategoryDataset currentDataset = getPlot().getDataset();
String columnKey = (String) currentDataset.getColumnKey(col);
String[] columnKeyValues = columnKey.split(":");
if(columnKeyValues.length < 2) return getSeriesPaint(row);
String columnActualEstimated = columnKeyValues[2];
if(columnActualEstimated.equals("A")) {
return Color.RED;
} else if(columnActualEstimated.equals("E")) {
return Color.BLUE;
}
return getSeriesPaint(row);
}
}
public void customize(JFreeChart chart, JRChart jasperChart)
{
if(jasperChart.getChartType() == JRChart.CHART_TYPE_BAR) {
CategoryPlot plot = chart.getCategoryPlot();
CategoryDataset currentDataset = plot.getDataset();
double maxValue = Double.MIN_VALUE;
// Scan to get total max value for the chart in order to set chart height appropriately
for(int i = 0; i < currentDataset.getRowCount(); i++) {
//System.out.println(i);
for(int j = 0; j < currentDataset.getColumnCount(); j++) {
Number numberValue = currentDataset.getValue(i, j);
//System.out.println("Column " + j + " key: " + currentDataset.getColumnKey(j));
double value = numberValue == null ? Double.NaN : numberValue.doubleValue();
if(value > maxValue) {
maxValue = value;
}
}
}
// Add 10% to top margin
double tenPercent = maxValue * 0.1;
maxValue = (Math.round((maxValue * 1.1)/tenPercent) * tenPercent) + tenPercent;
// Set max bar height to max value
ValueAxis yAxis = plot.getRangeAxis();
yAxis.setAutoRange(false);
yAxis.setRange(0, maxValue);
CategoryAxis xAxis = plot.getDomainAxis();
// Set label font size
xAxis.setTickLabelFont(new Font("Arial", Font.PLAIN, 4));
// Will set single bar colors by value with a custom renderer
CustomColorRenderer customRenderer = new CustomColorRenderer();
// Set the chart to apply the custom renderer
plot.setRenderer(customRenderer);
}
}
}
Hier ist, was meine Grafik wie zur Zeit aussieht:
Beachten Sie, dass die Domain-Achse Tasten wie "1: N: A" angezeigt wird. In diesem Fall bezieht sich 1 auf die Reihenfolge, N bezieht sich auf November, A bezieht sich auf den Wert "aktuell" gegenüber "geschätzt", die die beiden Serien sind. Alles was ich tun möchte, ist das sichtbare Häkchen auf "Nov" für das "1: N: A" Beispiel zu ändern. Dinge wie benutzerdefinierte Etikettengeneratoren ändern die Bezeichnungen für andere Teile des Diagramms und nicht die Hilfsstrichsbeschriftungen. Ich kann die Tick-Label-Fonts erfolgreich einstellen, aber ich kann nicht scheinen, dass die Labels selbst geändert werden.
Edit: Der andere schwierige Teil über diese Situation ist, dass die Anforderung 13 Monate anzeigen, bestehend aus den vorherigen 11, aktuelle und kommende. Der kommende Monat ist immer ein geschätzter Wert, daher die Serien "A" und "E". Dies macht es schmerzhaft, da dies bedeutet, dass es immer einen doppelten Monat gibt, also Spalten, die zusammengeführt werden sollen.
Jede Hilfe wäre willkommen. Lassen Sie mich wissen, wenn mehr Informationen benötigt werden.
Crossposted zu http://www.jfree.org/forum/viewtopic.php?f=3&t=117811
Basierend auf Ihren Vorschlägen habe ich eine 'SymbolAxis' aus den vorhandenen Dataset Keys erstellt, die funktioniert, aber das Problem damit scheint keine Möglichkeit zu sein, die neue' SymbolAxis' auf die Domainachse seit dem Plot zu setzen 'setDomainAxis()' nimmt nur eine 'CategoryAxis', während' setRangeAxis() 'des Plots eine' SymbolAxis' als Eingabe benötigt. Fehle ich etwas? – Kettch19
Hoppla, mein Fehler; 'SymbolAxis' ist nicht für die Domänenachse Ihres Kategorie-Plots geeignet – trashgod