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

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