Olá pessoal, alguém sabe me dizer como eu faço pra fazer um zoom em um gráfico gerado no JFreeChart?
Zoom gráfico JFreeChart
19 Respostas
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)
Não entendi sua dúvida. Com o mouse já não é possível dar o zoom?
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?
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?
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.
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!!!)
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();
}
}
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
em qual biblioteca se encontra a classe XYLineChart :?: :?: :?:
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
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();
}
}
Sim.
Basta criar um objeto Marker e adiciona-lo ao seu XYPlot (Chart.getXYPlot())
Por exemplo:
Marker marcador = new ValueMarker(120);
plot.addRangeMarker(marker);
não consegui encontrar o método addRangeMarker no meu XYSeries.
Não é no Series, é no XYPlot
De forma bruta:
JFreeChart chart = new JFreeChart(new XYPlot());
chart.getXYPlot().addRangeMarker(new ValueMarker(200));
Finish, valeu Ricardo Prado, consegui chegar ao ponto desejado, muito obrigado.

haha qualquer dúvida só perguntar! Eu já fiz muitos trabalhos com o JFreeChart, é uma ferramenta muito poderosa 
é possível alterar a cor desse marcador?
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!
valeu pela força.