Gerar Gráfico Mensal com Banco de Dados

Estou postando isso por falta de conteúdo na internet:

Fiz um gráfico mensal (com todos os dias do mês) usando o jFreeChart + Postgres (generate_series)

Preview do JFrame:

Botão direito, copiar:
Resultado
image

No meu, tem um intervalo de 03 dias

02/08
05/08......

Pra alterar isso, é só mudar o 3 pra qualquer numero de sua preferencia.
Se quiser intervalo diário só deixar o DAY, se quiser um intervalo mensal, MONTH

 xAxis.setTickUnit(new DateTickUnit(DateTickUnitType.DAY, 3));

1º. Crie uma função no Postgres:
Essa função, trás todos os dias do mês de forma dinâmica, então você não precisa ficar alterando o mês manualmente.

create function dias_do_mes(the_date timestamptz=now())
returns table(dias_do_mes date) as $$
select d::date from generate_series(
    date_trunc('month',the_date),
    date_trunc('month',the_date) + '1 month' - '1 day'::interval,
    '1 day'
) as series(d);
$$ LANGUAGE sql

1.1 SELECT + Function

SELECT dias, COUNT(qualquer_coluna) AS qtd
FROM dias_do_mes() 
LEFT JOIN sua_tabela on dias= to_date(sua_tabela.data, 'DD/MM/YYYY') 
GROUP BY dias_do_mes.dias ORDER BY dias ASC

2º Crie a sua classe no Java Swing:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.DateTickUnitType;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.RectangleEdge;

public class GraficoDiario extends JFrame {

    ConectaBanco conecta = new ConectaBanco();

    public GraficoDiario() {
        initUI();
    }

    private void initUI() {
        XYDataset dataset = createDataset();
        JFreeChart chart = createChart(dataset);
        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
        chartPanel.setBackground(Color.white);
        add(chartPanel);

        pack();
        setTitle("Line chart");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private XYDataset createDataset() {
        TimeSeriesCollection dataset = null;
        try {
            conecta.conexao();
            conecta.executaSQL("SELECT the_date, COUNT(nome) AS visita FROM dias_do_mes() LEFT JOIN visitantes on the_date = to_date(visitantes.dataentrada,'DD/MM/YYYY') GROUP BY dias_do_mes.the_date ORDER BY the_date ASC");

            TimeSeries series = new TimeSeries("Visitas");
            while (conecta.rs.next()) {
                int total = conecta.rs.getInt("visita");
                Date data = conecta.rs.getDate("the_date");

                Calendar cal = Calendar.getInstance();
                cal.setTime(data);
                int month = cal.get(Calendar.MONTH) + 1;
                int day = cal.get(Calendar.DAY_OF_MONTH);
                int year = cal.get(Calendar.YEAR);

                series.addOrUpdate(new Day(day, month, year), total);
            }

            dataset = new TimeSeriesCollection();
            dataset.addSeries(series);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return dataset;
    }

    private JFreeChart createChart(XYDataset dataset) {
        JFreeChart chart = ChartFactory.createTimeSeriesChart(
                "",
                "Dias do Mês",
                "Qtd.",
                dataset, true, true, true
        );

        XYPlot plot = chart.getXYPlot();
        XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
        renderer.setSeriesPaint(0, new Color(221, 162, 71));
        renderer.setSeriesStroke(0, new BasicStroke(3.0f));

        renderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator("Visitas no dia: {1}, Qtd: {2}", new SimpleDateFormat("dd/MM"), NumberFormat.getInstance()));
        plot.setRenderer(renderer);

        //Mudar fonte das informações laterais e rodapé
        Font font3 = new Font("Montserrat Medium", 0, 14);
        plot.getDomainAxis().setAutoRangeMinimumSize(20);
        plot.getDomainAxis().setLabelFont(font3);
        plot.getRangeAxis().setLabelFont(font3);

        DateAxis dateAxis = new DateAxis();
        dateAxis.setDateFormatOverride(new SimpleDateFormat("dd/MM"));
        plot.setDomainAxis(dateAxis);
        //

        //Setando intervalo
        DateAxis xAxis = (DateAxis) plot.getDomainAxis();
        xAxis.setTickUnit(new DateTickUnit(DateTickUnitType.DAY, 3));
        //

        //Valor inteiro ao invés de float
        plot.getDomainAxis().setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        plot.getRangeAxis().setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        //
        //Trocar cor do bg e detalhes...
        plot.setBackgroundPaint(Color.WHITE);
        plot.setRangeGridlinesVisible(true);
        plot.setRangeGridlinePaint(new Color(230, 230, 230));

        plot.setDomainGridlinesVisible(false);
        plot.setDomainGridlinePaint(new Color(230, 230, 230));
        plot.setOutlinePaint(null);
        //

        //configurações da legenda
        chart.getLegend().setFrame(BlockBorder.NONE);
        chart.setBorderVisible(false);
        chart.getLegend().setPosition(RectangleEdge.TOP);
        //

        return chart;
    }

    public static void main(String[] args) {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Windows".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        }
        SwingUtilities.invokeLater(() -> {
            GraficoDiario ex = new GraficoDiario();
            ex.setVisible(true);
        });
    }
}
4 curtidas