Zoom gráfico JFreeChart

19 respostas
L

Olá pessoal, alguém sabe me dizer como eu faço pra fazer um zoom em um gráfico gerado no JFreeChart?

19 Respostas

R

Você está exibindo seu gráfico dentro de um ChartPanel? Talvez o método abaixo resolva o seu problema, embora eu não o tenha testado:

http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/ChartPanel.html#setZoomInFactor(double)

R

Não entendi sua dúvida. Com o mouse já não é possível dar o zoom?

L

Eu não tinha prestado a devida atenção, ele por default realiza o zoom…mas tem um problema… ele não está permitindo eu selecionar uma parte específica do gráfico para fazer a seleção, quando eu tento selecionar uma determinada área no gráfico, por default ele está selecionando toda a área horizontal. Alguém já passou por este problema?

R

Eu uso ele diariamente e nunca tive este problema. Qual versão do JFreeChart você está usando? Está com as bibliotecas do JCommon colocadas corretamente?

L

jfreechart-1.0.13, também adicionei a as bibliotecas do JCommon.

se você tentar selecionar uma determinda área irá acontecer o que eu descrevi.

package graficos;

import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;

import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;

public class PrimeiroGrafico {
	
	private ChartPanel panel;
	private JFreeChart grafico;
	private JFrame frame = new JFrame();
	
	public PrimeiroGrafico() throws Exception {
		super();
		
		montaJanela();
		montaGrafico();
		adicionaComponente();
		mostraJanela();
	}
	
	public void montaGrafico() {
		DefaultCategoryDataset ds = new DefaultCategoryDataset();
		
		ds.addValue(40.5, "maximo", "dia 1");
		ds.addValue(38.2, "maximo", "dia 2");
		ds.addValue(37.3, "maximo", "dia 3");
		ds.addValue(31.5, "maximo", "dia 4");
		ds.addValue(35.7, "maximo", "dia 5");
		ds.addValue(17, "maximo", "dia 6");
		ds.addValue(22, "maximo", "dia 7");
		
		grafico = ChartFactory.createLineChart("Meu gráfico", null, "Valor", ds, PlotOrientation.VERTICAL, true, false, false);
		
		panel = new ChartPanel(grafico);
	}
	
	public void montaJanela() {
		frame.setSize(500,500);
		frame.setLocationRelativeTo(null);
	}
	
	public void adicionaComponente() {
		frame.add(panel);
	}
	
	public void mostraJanela() {
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public JPanel getPanel() {
		return new ChartPanel(grafico);
	}
	
	public static void main(String[] args) throws Exception{
		new PrimeiroGrafico();
	}
}

o que está acontecendo provavelmente deve ser por causa de algum tipo de configuração default.

R

Isto provavelemente está ocorrendo devido ao tipo de Chart que você está usando, LineChart, que é um “tipo” de CategoryChart(não é bem isso).

Sugiro que você tente usar outro tipo de chart, pois este realmente não possui duas dimensões, apenas uma.

Tente adaptar seu programa para usar o “XYLineChart”, ou até mesmo o TimeSeriesChart(ESTE AQUI É UM INFERNO!!!)

L

Valeu Ricardo Prado, utilizei a classe DefaultXYDataset.

package graficos;

import java.awt.Cursor;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;

import org.jfree.chart.JFreeChart;
import org.jfree.chart.event.ChartChangeEvent;
import org.jfree.chart.event.ChartChangeListener;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.xy.DefaultXYDataset;

public class PrimeiroGrafico {
	
	private ChartPanel panel;
	private JFreeChart grafico;
	private JFrame frame = new JFrame();
	
	public PrimeiroGrafico() throws Exception {
		super();
		
		montaJanela();
		montaGrafico();
		adicionaComponente();
		mostraJanela();
	}
	
	public void montaGrafico() {
		
		DefaultXYDataset ds = new DefaultXYDataset();
		double[][] meuArrayDouble = new double[2][4];

		meuArrayDouble[0][0] = 20;
		meuArrayDouble[0][1] = 50;
		meuArrayDouble[0][2] = 20;
		meuArrayDouble[0][3] = 60;
		meuArrayDouble[1][0] = 10;
		meuArrayDouble[1][1] = 30;
		meuArrayDouble[1][2] = 40;
		meuArrayDouble[1][3] = 70;
		
		ds.addSeries(30, meuArrayDouble);
		
		grafico = ChartFactory.createXYLineChart("Meu gráfico", null, "Valor", ds, PlotOrientation.HORIZONTAL, false, false, false);
		panel = new ChartPanel(grafico);
		
		panel.addMouseListener(new MouseAdapter() {
	        
			public void mouseExited(MouseEvent e) {
	            panel.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
	        }

	        public void mouseEntered(MouseEvent e) {
	            panel.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
	        }       
		});
	}
	
	public void montaJanela() {
		frame.setSize(500,500);
		frame.setLocationRelativeTo(null);
	}
	
	public void adicionaComponente() {
		frame.add(panel);
	}
	
	public void mostraJanela() {
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public JPanel getPanel() {
		return new ChartPanel(grafico);
	}
	
	public static void main(String[] args) throws Exception{
		new PrimeiroGrafico();
	}
}
R

Opa, eu recomendo muito duas coisas:
1)Que você tenha os javadocs integrados com sua IDE
2)Que você compre a documentação do JFreeChart(peça para sua empresa comprar se possível) pois a documentação é sensacional e aumenta em 1500% sua produção

L

em qual biblioteca se encontra a classe XYLineChart :?: :?: :?:

R

Então, não existe uma classe chamada XYLineChart. O XYLineChart que ele te devolve na verdade é um Chart, cujos componentes são um XYDataSet e (provavelmente) um XYLineAndShapeRenderer(se não for esse o nome, é algo do tipo). O JFreeChart permite uma grande versatilidade na hora de gerar gráficos, então cada pedaço do seu objeto Chart é customizável/substituível. Você pode dividir inicialmente um objeto Chart total em 2 partes principais:
O “Chart” que é onde ficam legendas, títulos etc (Na verdade, um Chart CONTÉM um PLOT)
O Plot, que é onde o gráfico é realemente desenhável.
Qualquer coisa relacionada ao gráfico em si estará relacionado ao objeto Plot deste Chart

L

cosegui Ricardo Prado usando o XYSeries, agora eu só preciso desenhar uma linha constante mostrando o valor médio do gráfico.
vc sabe me dizer se o XYSeries possui algum método desse tipo?

package graficos;

import java.awt.Cursor;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;

import org.jfree.chart.JFreeChart;
import org.jfree.chart.event.ChartChangeEvent;
import org.jfree.chart.event.ChartChangeListener;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class PrimeiroGrafico {
	
	private ChartPanel panel;
	private JFreeChart grafico;
	private JFrame frame = new JFrame();
	
	public PrimeiroGrafico() throws Exception {
		super();
		
		montaJanela();
		montaGrafico();
		adicionaComponente();
		mostraJanela();
	}
	
	public void montaGrafico() {
		XYSeries ds = new XYSeries("Teste com o XYSeries");
		
		ds.add(40.5, 1);
		ds.add(38.2, 2);
		ds.add(37.3, 3);
		ds.add(31.5, 4);
		ds.add(35.7, 5);
		ds.add(17, 6);
		ds.add(22, 7);
		
        XYDataset xyDataSet = new XYSeriesCollection(ds);
		grafico = ChartFactory.createXYLineChart("Meu gráfico", null, "Valor", xyDataSet, PlotOrientation.VERTICAL, true, true, false);
		panel = new ChartPanel(grafico);
		
		panel.addMouseListener(new MouseAdapter() {
	        
			public void mouseExited(MouseEvent e) {
	            panel.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
	        }

	        public void mouseEntered(MouseEvent e) {
	            panel.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
	        }       
		});
	}
	
	public void montaJanela() {
		frame.setSize(500,500);
		frame.setLocationRelativeTo(null);
	}
	
	public void adicionaComponente() {
		frame.add(panel);
	}
	
	public void mostraJanela() {
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public JPanel getPanel() {
		return new ChartPanel(grafico);
	}
	
	public static void main(String[] args) throws Exception{
		new PrimeiroGrafico();
	}
}
R

Sim.
Basta criar um objeto Marker e adiciona-lo ao seu XYPlot (Chart.getXYPlot())

Por exemplo:

Marker marcador = new ValueMarker(120); plot.addRangeMarker(marker);

L

não consegui encontrar o método addRangeMarker no meu XYSeries.

R

Não é no Series, é no XYPlot

De forma bruta:

JFreeChart chart = new JFreeChart(new XYPlot()); chart.getXYPlot().addRangeMarker(new ValueMarker(200));

L

Finish, valeu Ricardo Prado, consegui chegar ao ponto desejado, muito obrigado. :smiley: :smiley:

R

haha qualquer dúvida só perguntar! Eu já fiz muitos trabalhos com o JFreeChart, é uma ferramenta muito poderosa :wink:

L

é possível alterar a cor desse marcador?

R

objetoMarker.setPaint(Color.BLUE)

Dá pra mudar a “opaquicidade”(sei lá como escreve) usando
objetoMarker.setAlpha(0.5) – Não é esse o nome, mas é algo muiito parecido!

L

valeu pela força.

Criado 28 de setembro de 2010
Ultima resposta 6 de out. de 2010
Respostas 19
Participantes 3