JFreeChart - Valores reais dentro do gráfico

39 respostas
by_stoco

Salve a todos…

Por favor, me ajudem!!!

Estou montando meus gráficos e não estou conseguindo fazer com que apareça os valores dentro gráfico (ex. o valor real em cima da barra). A princípio tudo ok (o gráfico com barras e linhas, a legenda, a escala nos eixos), mas nada de valores dos itens.
Até já copie códigos de gráficos do modo q eu quero e mesmo assim não aparece os valores.

Segue meu código:

JFreeChart grafico = ChartFactory.createBarChart3D("Dupla Participação", "", "", dataset2, PlotOrientation.VERTICAL, true, true, false);

        CategoryPlot plot = grafico.getCategoryPlot();
        plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_LEFT);
        plot.setRangeAxisLocation(AxisLocation.TOP_OR_LEFT);


        CategoryItemRenderer renderer1 = plot.getRenderer();
        renderer1.setSeriesPaint(0, Color.red);
        renderer1.setSeriesPaint(1, Color.ORANGE);
        renderer1.setSeriesPaint(2, Color.GREEN);
        renderer1.setSeriesItemLabelsVisible(0, Boolean.TRUE);
        renderer1.setSeriesItemLabelsVisible(1, Boolean.TRUE);
        renderer1.setSeriesItemLabelsVisible(2, Boolean.TRUE);

        CategoryDataset datasetValores = dataset1;
        ValueAxis axis2 = new NumberAxis3D("Porcentagem Atingida");
        plot.setRangeAxis(1, axis2);
        plot.setDataset(1, datasetValores);

        plot.mapDatasetToRangeAxis(1, 1);
        CategoryItemRenderer renderer2 = new LineAndShapeRenderer();
        renderer2.setSeriesPaint(0, Color.blue);
        plot.setRenderer(1, renderer2);

        grafico.setBackgroundPaint(Color.WHITE);
        ChartUtilities.writeChartAsPNG(response.getOutputStream(), grafico, 880, 300);

Se alguem puder me ajudar…
GRATO desde já

39 Respostas

by_stoco

Será que pode ser alguma coisa com a versão da API?
Estou utilizando a jfreechart-1.0.9.

Alguém por fovor!!!

geidivan

Cara, tá acontecendo o mesmo comigo.

Se conseguir, por favor poste aqui.

alepenchel

puxa galera…
tbm to prescisando disso.
ja procurei na web e nada.
pelo jeito ninguem sabe como fazer isso.

c conseguir posto aki dexo postado aki

abraço a todos

Fernando_Generoso_da

adaptem esse trecho de código:

renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(false);
ItemLabelPosition p = new ItemLabelPosition(ItemLabelAnchor.CENTER,
TextAnchor.CENTER, TextAnchor.CENTER, 0.0);
renderer.setBasePositiveItemLabelPosition(p);

renderer é um CategoryItemRenderer…

alepenchel

Fernando Generoso da Rosa:
adaptem esse trecho de código:

renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(false);
ItemLabelPosition p = new ItemLabelPosition(ItemLabelAnchor.CENTER,
TextAnchor.CENTER, TextAnchor.CENTER, 0.0);
renderer.setBasePositiveItemLabelPosition(p);

renderer é um CategoryItemRenderer…

valew cara…
tava mto tepo atrás disso.

PROBLEMA RESOLVIDO.

geidivan

Vou ter que implementar essa CategoryItemRenderer toda?

geidivan

Pessoal, fiz o seguinte:

CategoryItemRenderer renderer = plot.getRenderer();

renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());

renderer.setBaseItemLabelsVisible(true);

renderer.setBaseItemLabelFont(fonte);

renderer.setBaseItemLabelsVisible(true);

renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER,  TextAnchor.CENTER, 0.0));

chart.getCategoryPlot().setRenderer(renderer);

O que há de errado. Não estão aparecendo os rótulos ainda.

Fernando_Generoso_da
static class CustomRenderer extends BarRenderer {

		
		private Paint[] colors;

		
		public CustomRenderer(Paint[] colors) {
			this.colors = colors;
		}

		
		public Paint getItemPaint(int row, int column) {
			return colors[column % colors.length];
		}
	}
alepenchel

geidivan:
Pessoal, fiz o seguinte:

CategoryItemRenderer renderer = plot.getRenderer();

renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());

renderer.setBaseItemLabelsVisible(true);

renderer.setBaseItemLabelFont(fonte);

renderer.setBaseItemLabelsVisible(true);

renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER,  TextAnchor.CENTER, 0.0));

chart.getCategoryPlot().setRenderer(renderer);

O que há de errado. Não estão aparecendo os rótulos ainda.

JFreeChart grafico = ChartFactory.createLineChart("", "Intervalo de Horas", "Acessos", dataset, PlotOrientation.VERTICAL, true, false, false); CategoryPlot plot = (CategoryPlot) grafico.getPlot(); LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer(); renderer.setBaseShapesVisible(true); renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setBaseItemLabelsVisible(true); /*ItemLabelPosition p = new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER, 0.0); renderer.setBasePositiveItemLabelPosition(p);*/ BufferedImage bufferedGrafico = grafico.createBufferedImage(500, 350);

a minha fico assim e ta funcionando…

espero q te ajude.

abraços.

alepenchel

Fernando Generoso da Rosa:
adaptem esse trecho de código:

renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(false);
ItemLabelPosition p = new ItemLabelPosition(ItemLabelAnchor.CENTER,
TextAnchor.CENTER, TextAnchor.CENTER, 0.0);
renderer.setBasePositiveItemLabelPosition(p);

renderer é um CategoryItemRenderer…

Fernando.

Presciso de mais uma ajuda.

O código que vc forneceu funcionou perfeitamente.
Mas devido ao pontos serme mto próximos e os valores muito grande, eles ficaram um por cima do outro.
Já tentei organiza para que isso não ocorresse, porém sem sucesso.

existe alguma forma de fazer isso automaticamente???
desde já agradecido.

geidivan

Cara, ainda não apareceu. O meu gráfico é de barras.

CategoryPlot plot = chart.getCategoryPlot();
            
            // Define rótulos das categorias
            BarRenderer renderer = (BarRenderer) plot.getRenderer();            
            renderer.setBaseSeriesVisible(true);  
            renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());               
            renderer.setBaseItemLabelsVisible(true);  
            
            chart.getCategoryPlot().setRenderer(renderer);
Fernando_Generoso_da

alepenchel, tenta isso:

ItemLabelPosition p = new ItemLabelPosition(ItemLabelAnchor.INSIDE12,
		        TextAnchor.CENTER_RIGHT, TextAnchor.CENTER_RIGHT,
		        -Math.PI / 2.0);
		renderer.setBasePositiveItemLabelPosition(p);

		ItemLabelPosition p2 = new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12,
		        TextAnchor.CENTER_LEFT, TextAnchor.CENTER_LEFT, -Math.PI / 2.0);
		renderer.setPositiveItemLabelPositionFallback(p2);

Fernando

Fernando_Generoso_da

geidivan,

faz o seguinte: Cria um datset ficticio (nao sei se tu já está utilizando), utiliza o trecho de código que passei e ve se funciona. Se não funcionar, cola tua classe aqui para darmos uma olhada e tentar ver o que está acontecendo.

Fernando

geidivan

FIIINOOO!

Valeu Fernando, você conhece viu. Finalmente consegui.

Agora, abusando mais um pouco, você sabe qual desses ItemLabelAnchor.OUTSIDE deixa o valor do lado de fora no canto superior sem ficar por cima da barra?

Obrigado cara, ajudou demais.

Fernando_Generoso_da

Cara,

Tentativa e erro :wink:

vai testando até achar o que melhor se adequa a tua necessidade…blz?

geidivan

Ok. Não vou te perturbar mais.

Obrigado.

[RESOLVED]

Fernando_Generoso_da

hehehehe,

não é perturbar, mas é que a resposta não tenho assim de bate-pronto. Também terei que testar pra achar os valores ideais, sacou ??

Fernando

Fernando_Generoso_da

geidivan,

Ve se é isso:

ItemLabelPosition p = new ItemLabelPosition(ItemLabelAnchor.INSIDE1,
		        TextAnchor.CENTER_RIGHT, TextAnchor.CENTER_RIGHT,
		        -Math.PI / 2.0);
		renderer.setBasePositiveItemLabelPosition(p);
geidivan

Pensei que fosse esse também, mas ele pega um pedaço da barra ainda. Mas tá bom cara, esse aí vai servir. Firulas ficam pra depois. rsrs.

Agora tô apanhando é na inclinação do PieChart. Não consigo mudar a inclinação da pizza.

falow.

Fernando_Generoso_da

isso ajuda

plot.setCircular(false); :

alepenchel

Fernando Generoso da Rosa:
alepenchel, tenta isso:

ItemLabelPosition p = new ItemLabelPosition(ItemLabelAnchor.INSIDE12,
		        TextAnchor.CENTER_RIGHT, TextAnchor.CENTER_RIGHT,
		        -Math.PI / 2.0);
		renderer.setBasePositiveItemLabelPosition(p);

		ItemLabelPosition p2 = new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12,
		        TextAnchor.CENTER_LEFT, TextAnchor.CENTER_LEFT, -Math.PI / 2.0);
		renderer.setPositiveItemLabelPositionFallback(p2);

Fernando

Valew a dica Fernando…de umas ajustadas para o que eu queria.
agora ta funcionando que é uma blz.

PROBLEMA RESOLVIDO

Abraços.

geidivan

Mas eu quero definir quantos graus eu quero ‘deitar’ a pizza. Tipo, 20 graus.

Fernando_Generoso_da

Cara,

Estou pra te dizer que não tem um método que faça isso. o que tu pode fazer para “melhorar” ou chegar perto é:

RectangleInsets ri = new RectangleInsets(100.0, 50.0, 100.0, 50.0);
		plot.setInsets(ri);

Fernando

geidivan

YAHOOO!!

Beleza. Mas a área de plotagem tá diminuindo. Como mantenho? rsrs.

Fernando_Generoso_da

O RectangleInsets provavelmente define a área de plotagem…

Aí tu teria que trabalhar de uma forma que ele alongasse o teu gráfico para dar a impressão de estar “deitado”, e também tivesse uma área de visualização boa…testa vários valores e tenta achar um padrão…hehehe

Fernando

alepenchel

Olá Pessoal.

Estou prescisando de outra ajuda…

Estou gerando um gráfico de linhas, e por default, a jfreechart gera os posntos do grafico no formato de quadrados.
Estou querendo modificar esse formato para circulos e tambem mudar a cor interna desses pontos.

No máximo consegui deixar transparente…

se alguem puder me ajudar.

exemplo de como kero deixar os pontos:
http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/renderer/category/LineAndShapeRenderer.html

Desde já agradecido pessoal.

Fernando_Generoso_da

vê se esse código te dá uma luz…

LineAndShapeRenderer renderer
            = (LineAndShapeRenderer) plot.getRenderer();
renderer.setSeriesShape(2, ShapeUtilities.createDiamond(4.0f));
renderer.setUseFillPaint(true);
		renderer.setBaseFillPaint(Color.WHITE);

Fernando

alepenchel

Fernando Generoso da Rosa:
vê se esse código te dá uma luz…

LineAndShapeRenderer renderer
            = (LineAndShapeRenderer) plot.getRenderer();
renderer.setSeriesShape(2, ShapeUtilities.createDiamond(4.0f));
renderer.setUseFillPaint(true);
		renderer.setBaseFillPaint(Color.WHITE);

Fernando

Valew Fernando…

pra mudar de formato os pontos eu não consegui…

mas foi d grande ajuda na mudança da cor…

Agradecido.
Abraços.

Fernando_Generoso_da

Esse código muda o shape para o formato de elipse:

renderer.setSeriesShape(0, new Ellipse2D.Double(-5.0, -5.0, 10.0, 10.0));

Fernando

alepenchel

Fernando Generoso da Rosa:
Esse código muda o shape para o formato de elipse:

renderer.setSeriesShape(0, new Ellipse2D.Double(-5.0, -5.0, 10.0, 10.0));

Fernando

Cara…tu é bom.
resolveu todos meu problemas.

mto obrigado msm…

tava fods procurando na net
achei alguns exemplos bons na net…
mas saum mto básicos.

Vlw novamente.

PROBLEMA RESOLVIDO

Djonatah

Boa tarde galera

Alguem teria um tutorial para essa API (JFreeChart), ou algum exemplo completo que usa ela?

Valeu

luis.txt

Quando vc faz o donwload da api, o arquivo zip já contém um demo (acho que tem um pacote demo).

Exemplo Pizza:
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

public class GraficoPizzaDemo extends ApplicationFrame {

	/** 
      *  
      */
	private static final long serialVersionUID = 1L;

	public GraficoPizzaDemo() {
		super(null);
		this.setTitle("Grafico de Pizza");
		JPanel jpanel = PanelDemostracao();
		jpanel.setPreferredSize(new Dimension(500, 270));
		setContentPane(jpanel);
	}

	private static PieDataset criaDadosGrafico() {
		DefaultPieDataset defaultpiedataset = new DefaultPieDataset();
		defaultpiedataset.setValue("Conteúdo 1", 43.23D);
		defaultpiedataset.setValue("Conteúdo 2", 10D);
		defaultpiedataset.setValue("Conteúdo 3", 27.5D);
		defaultpiedataset.setValue("Conteúdo 4", 17.5D);
		defaultpiedataset.setValue("Conteúdo 5", 11D);
		defaultpiedataset.setValue("Conteúdo 6", 19.39D);
		return defaultpiedataset;
	}

	private static JFreeChart criaGrafico(PieDataset piedataset) {
		JFreeChart jfreechart = ChartFactory.createPieChart(
				"Gráfico Pizza Demo ", piedataset, true, true, false);
		PiePlot plotagem = (PiePlot) jfreechart.getPlot();
		plotagem.setLabelGenerator(new StandardPieSectionLabelGenerator(
				"{0} ({2})"));// define porcentagem no gráfico
		plotagem.setLabelBackgroundPaint(new Color(220, 220, 220));
		return jfreechart;
	}

	public static JPanel PanelDemostracao() {
		JFreeChart jfreechart = criaGrafico(criaDadosGrafico());
		return new ChartPanel(jfreechart);
	}

	public static void main(String args[]) {
		GraficoPizzaDemo demo = new GraficoPizzaDemo();
		demo.pack();
		RefineryUtilities.centerFrameOnScreen(demo);
		demo.setVisible(true);
	}
}
luis.txt

Outro exemplo pode ser encontrado em:

alepenchel

Djonatah:
Boa tarde galera

Alguem teria um tutorial para essa API (JFreeChart), ou algum exemplo completo que usa ela?

Valeu

um tutorial completo sobre isso…ja to cansado d procura e nada.
mas…Esse site possui exemplos bons.
da uma olhada q pode t ajudar.

http://www.java2s.com/Code/Java/Chart/CatalogChart.htm

abraços.

Djonatah

Eu tenho mais uma pergunta,

Seria possivel gerar um PNG B&W?
(Eu criei um topico sobre isto, mas ainda não obtive resposta.)

Abraços,

E muito obrigado pelos exemplos :smiley:

<><

Fernando_Generoso_da

Pra falar a verdade, nem o tutorial do jfreechart é “tão” completo assim…o que vale muito a pena são os exemplos. Vale cada centavo pago pela documentação.

Fernando

alepenchel

Djonatah:
Eu tenho mais uma pergunta,

Seria possivel gerar um PNG B&W?
(Eu criei um topico sobre isto, mas ainda não obtive resposta.)

Abraços,

E muito obrigado pelos exemplos :smiley:

<><

tem como cria sim amigo…

segue um exemplo

try {
   FileOutputStream fos = new FileOutputStream(name);
} catch (IOException e) {
   e.printStackTrace();
}
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(10, "Legenda", "0 horas");
dataset.addValue(20, "Legenda", "2 horas");
JFreeChart grafico = ChartFactory.createLineChart("", "Intervalo de Horas", "Acessos", dataset, PlotOrientation.VERTICAL, true, false, false);
ChartUtilities.writeChartAsPNG(fos, grafico, 500, 350);      //linha que gera uma imagem do tipo PNG e salva em disco
System.out.println("Imagem gerada com sucesso.");

o exemplo acima salva a imagem na pasta da classe que está sendo executada.

abraços.

Djonatah

Boa tarde pessoal,

A partir dos examplos e de uma ampla procurada na documentacao, eu criei alguns charts.

Mas estou tendo um pequeno problema em um gráfico de barras. As barras estão desalinhadas quanto ao eixo mostrado no gráfico e rótulos em baixo dele. Eu não alterei nada em relação a isso (apenas a rotação das rótulos) então quer dizer que isso veio por default. Isso é um bug?

tem como corrigir?

Abracos e obrigado toda ajuda :slight_smile:

<><

R

To precisando fazer a mesma coisa, so que para grafico de linhas e
Scatter.

tentei o que esta descrito aqui e nao funcionou, alguem teria um exemplo para grafico de linhas?
Não ta aparecendo os valores dentro da area dde plotagem do grafico de linha.

Criado 29 de fevereiro de 2008
Ultima resposta 28 de jun. de 2010
Respostas 39
Participantes 7