JFreeChart - Valores reais dentro do gráfico

39 respostas
B

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

B

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

Alguém por fovor!!!

G

Cara, tá acontecendo o mesmo comigo.

Se conseguir, por favor poste aqui.

A

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

F

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…

A

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.

G

Vou ter que implementar essa CategoryItemRenderer toda?

G

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.

F
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];
		}
	}
A

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.

A

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.

G

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);
F

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

F

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

G

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.

F

Cara,

Tentativa e erro :wink:

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

G

Ok. Não vou te perturbar mais.

Obrigado.

[RESOLVED]

F

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

F

geidivan,

Ve se é isso:

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

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.

F

isso ajuda

plot.setCircular(false); :

A

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.

G

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

F

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

G

YAHOOO!!

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

F

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

A

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.

F

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

A

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.

F

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

A

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

D

Boa tarde galera

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

Valeu

L

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);
	}
}
L

Outro exemplo pode ser encontrado em:

A

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.

D

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:

<><

F

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

A

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.

D

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