Pessoal,
Tenho que criar um gráfico de área combinado com linhas. A idéia básica é a seguinte. Tenho um crédito inicial para todos os meses e os dados do gráfico de área podem ser incompletos de acordo com a data que ele foi gerado. Exemplo: Estamos em novembro e as atividades financeiras de 2009 estão fechadas até outubro, portanto não tenho dados de Novembro e dezembro. O gráfico ideal é semelhante a imagem abaixo:
[img]http://www.marcossousa.com/arquivos/chart_right.png[/img]
Porém, usando JFreechart estou tendo problemas em encerrar esta área em 90° como no exemplo acima. Usei 3 tentativas:
1ª - O dataset para áreas possui dados de janeiro a dezembro onde ao terminar os valores, os demais são zerados.
2ª - O dataset para áreas possui dados de janeiro a dezembro onde ao terminar os valores, os demais recebem o valor NULL.
3ª - O dataset para áreas possui dados de janeiro a até o mês que há dados.
Para o primeiro caso a área encerra até o próximo mês. O Segundo caso, a área encerra entre o último mês e seu subseqüente, como na imagem abaixo. Já para o terceiro a área inicia e encerra corretamente, porém a área é centralizada na área de plotagem e é gerado fora da perspectiva.
[img]http://www.marcossousa.com/arquivos/chart_wrong.png[/img]
Abaixo, há um código de teste gerando o gráfico usando a idéia 3.import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.CombinedDomainCategoryPlot;
import org.jfree.chart.renderer.AbstractRenderer;
import org.jfree.chart.renderer.AreaRendererEndType;
import org.jfree.chart.renderer.category.AreaRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.util.Log;
import org.jfree.util.PrintStreamLogTarget;
public class AreaChartDemo extends ApplicationFrame{
public static void main(final String[] args){
Log.getInstance().addTarget(new PrintStreamLogTarget());
final AreaChartDemo demo = new AreaChartDemo("Area Chart Demo");
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
}
public AreaChartDemo(final String title){
super(title);
// create the chart...
final JFreeChart chart = createChart();
final ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new Dimension(500, 270));
chartPanel.setEnforceFileExtensions(false);
setContentPane(chartPanel);
}
private void configureChart(JFreeChart chart){
CategoryPlot p = chart.getCategoryPlot();
p.setForegroundAlpha(0.85f);
p.setRangeGridlinePaint(Color.red);
p.setDomainGridlinesVisible(true);
p.setDomainGridlinePaint(Color.black);
p.setBackgroundPaint(Color.WHITE);
final CategoryAxis domainAxis = p.getDomainAxis();
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);
domainAxis.setLabelFont(new Font("SansSerif", Font.BOLD, 10));
domainAxis.setTickLabelFont(new Font("SansSerif", Font.PLAIN, 10));
domainAxis.setLowerMargin(-0.045);
domainAxis.setUpperMargin(-0.045);
domainAxis.setCategoryMargin(0.0);
}
private JFreeChart createChart(){
final ValueAxis valueAxis = new NumberAxis("Milion");
final CategoryDataset areaDataSet = generateAreaDataSet();
final CategoryDataset lineDataSet = generateLineDataSet();
valueAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
final AreaRenderer areaRenderer = new AreaRenderer();
areaRenderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
areaRenderer.setSeriesPaint(0, Color.GRAY);
areaRenderer.setSeriesPaint(1, Color.YELLOW);
areaRenderer.setSeriesPaint(2, Color.GREEN);
areaRenderer.setSeriesPaint(3, Color.BLACK);
areaRenderer.setEndType(AreaRendererEndType.TRUNCATE);
final CategoryPlot subPlot = new CategoryPlot(lineDataSet, null, valueAxis, areaRenderer);
subPlot.setDataset(1, areaDataSet);
final CategoryItemRenderer lineRenderer = new LineAndShapeRenderer();
lineRenderer.setSeriesPaint(0, Color.BLUE);
lineRenderer.setBaseShape(AbstractRenderer.DEFAULT_SHAPE);
lineRenderer.setSeriesStroke(0, new BasicStroke(7.0f));
subPlot.setForegroundAlpha(0.9f);
subPlot.setRenderer(1, areaRenderer);
subPlot.setRenderer(0, lineRenderer);
// domainAxis se refere ao eixo x
final CombinedDomainCategoryPlot plot = new CombinedDomainCategoryPlot();
plot.add(subPlot, 1);
final JFreeChart chart = new JFreeChart("Financial analise", new Font("SansSerif",
Font.BOLD, 12), plot, true);
chart.setBackgroundPaint(Color.WHITE);
configureChart(chart);
return chart;
}
private DefaultCategoryDataset generateAreaDataSet(){
String[] months = { "Jan", "Feb", "Mar"};
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
for (int i = 0; i < months.length; i++){
dataset.addValue(60 * i, "Credit", months[i] + "/2009");
dataset.addValue(50 * i, "Added Budged", months[i] + "/2009");
dataset.addValue(30 * i, "Compromissed", months[i] + "/2009");
dataset.addValue(15 * i, "Spents", months[i] + "/2009");
}
return dataset;
}
private DefaultCategoryDataset generateLineDataSet(){
String[] months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Ago", "Sep", "Oct",
"Nov", "Dec" };
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
for (int i = 0; i < 12; i++){
dataset.addValue(300, "Initial Budged", months[i] + "/2009");
}
return dataset;
}
}
Existe algo que pode ser feito usando JFreeChart? Ou alguém conhece outra ferramenta capaz de gerar o resultado pretendido?