Olá pessoal, alguém sabe me dizer como eu faço pra fazer um zoom em um gráfico gerado no JFreeChart?
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.