Maintenant que j'ai récemment eu besoin d'écrire un programme qui utilise JFreeChart pour générer des graphiques, je vais résumer comment utiliser JFreeChart.
Si vous commencez par regarder l'exemple de code, vous pouvez rapidement créer un graphique simple, mais si cela devient un peu compliqué, vous perdrez bientôt la trace de l'endroit où le définir. Pour éviter que cela ne se produise, commençons par le concept de JFreeChart.
Chart
Représente le graphique entier. Normalement, vous créez un graphique à l'aide de la méthode ChartFactory, il est donc facile de penser que le type de graphique est déterminé par le graphique (le type de graphique est décidé par le moteur de rendu), mais les appartenances directes de Chart sont le titre et la légende. (Legned), et uniquement Tracer ci-dessous, le graphique est comme le cadre entier uniquement.
Plot
La zone de dessin entière du graphique, y compris les axes, devient un tracé. Les principaux biens incluent le jeu de données, le moteur de rendu et l'axe. Il existe deux types de tracé, de tracé de catégorie et de tracé XY, selon la façon dont vous détenez les données. Seuls les jeux de données et le moteur de rendu de type catégorie peuvent être définis dans le tracé de catégorie, et seuls les jeux de données et le moteur de rendu de type XY peuvent être définis dans le tracé XY.
Dans un graphique comme celui utilisé en entreprise, l'axe Y est une valeur numérique normale, mais l'axe X n'est pas une valeur numérique normale, et s'il s'agit d'un graphique des ventes pour chaque produit, ce sera une chaîne de caractères comme le produit A. Il s'agit de Category, et vous devez utiliser Category Plot pour créer un tel graphique.
Dans l'explication ci-dessus, les termes axe X et axe Y sont utilisés pour des raisons de clarté, mais selon le graphique, les significations de l'axe X et de l'axe Y peuvent être opposées. Dans JFreeChart, le nom de l'axe est appelé Axe du domaine pour l'axe X normal (représentant la catégorie) et Axe des valeurs pour l'axe Y.
Pour les graphiques où l'axe X est également un nombre normal, comme c'est souvent le cas en mathématiques, utilisez XY Plot.
Dans un graphique de type ventes mensuelles typique, l'axe X est la date, qui peut être représentée par un graphique de catégorie ou un graphique XY. Dans le premier, 2017/7 n'est pas traité comme une valeur numérique continue, mais comme une chaîne de caractères. En réalité, de nombreuses personnes utilisent Category Plot. Cela est dû au fait que le moteur de rendu de type Catégorie a plus de types de graphiques à barres.
Dataset
Une collection de données à afficher est un ensemble de données. Dans l'ensemble de données de type Catégorie, l'axe X = valeur de la catégorie (exemple: avril 2017), la valeur de l'axe Y (exemple: 10) et la répartition des données = série, le cas échéant, la valeur (exemple: produit A) est 1. Cela devient une donnée.
Renderer
Le moteur de rendu dessine en fait le graphique en fonction du jeu de données et le type de moteur de rendu = le type de graphique. Vous pouvez découvrir le type de moteur de rendu que vous avez dans Javadoc [org.jfreechart.chart.renderer.category Package](http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/renderer/category/ package-summary.html) et [org.jfreechart.chart.renderer.xy package](http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/renderer/xy/package-summary. Vérifiez la classe de html).
Pour personnaliser l'apparence du graphique, utilisez les méthodes de Renderer.
Lors de la création d'un graphique composite, ajoutez une paire Renderer / Dataset à Plot pour chaque type de graphique.
C'est le code qui génère l'exemple de graphique affiché au début. Si vous avez l'explication ci-dessus à l'esprit, vous pouvez facilement la comprendre.
JFreeChartSample.java
public class JFreeChartSample {
public void createChart(ChartType type) { //Permet à l'argument de changer si la partie de barre est une pile ou un ensemble
//Création d'un moteur de rendu de graphique à barres empilé de base/Dataset#0
JFreeChart chart = ChartFactory.createStackedBarChart("Title", "Category", "Value", barDataset());
CategoryPlot plot = (CategoryPlot) chart.getPlot(); //StackedBarChart est un type de catégorie
String filename = type.getFilename();
if (type == ChartType.CLUSTERED) { //Passer au graphique à barres agrégé
BarRenderer barRenderer = new BarRenderer();
barRenderer.setItemMargin(0.0); //Espacement des barres dans la catégorie
plot.setRenderer(barRenderer);
}
//Ajout de lignes brisées (total)
LineAndShapeRenderer lineRenderer1 = new LineAndShapeRenderer();
plot.setRenderer(1, lineRenderer1); // Renderer#1
plot.setDataset(1, lineDataset1()); // Dataset#1
//Renderer car je souhaite ajouter une ligne brisée (par rapport à l'année précédente) et séparer l'axe/Ensemble de données séparé
LineAndShapeRenderer lineRenderer2 = new LineAndShapeRenderer();
plot.setRenderer(2, lineRenderer2); // Renderer#2
plot.setDataset(2, lineDataset2()); // Dataset#2
//Ajouter un axe
NumberAxis axis = new NumberAxis("Par rapport à l'année précédente(%)");
axis.setRange(0, 200);
plot.setRangeAxis(1, axis); // RangeAxis#1
plot.mapDatasetToRangeAxis(2, 1); // Dataset#2 est l'axe de portée#Utiliser 1
//Position de la légende
chart.getLegend().setPosition(RectangleEdge.RIGHT);
//Modifier l'ordre du dessin Ordre décroissant par défaut (#0 est le dernier) → Ordre croissant (#0 s'affiche en premier, puis s'affiche au-dessus)
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
//Génération d'images
try {
ChartUtilities.saveChartAsPNG(new File(filename), chart, 600, 400);
} catch (Exception e) {
e.printStackTrace();
}
}
public enum ChartType {
STACKED("stackedChart.png "), CLUSTERED("clusteredChart.png ");
private String filename;
ChartType(String filename) { this.filename = filename; }
public String getFilename() { return filename; }
}
private DefaultCategoryDataset barDataset() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(10.0, "Produit A", "Avril 2017");
dataset.addValue(15.0, "Produit B", "Avril 2017");
dataset.addValue(10.0, "Produit A", "Mai 2017");
dataset.addValue(5.0, "Produit B", "Mai 2017");
dataset.addValue(5.0, "Produit C", "Mai 2017");
dataset.addValue(5.0, "Produit A", "Juin 2017");
dataset.addValue(10.0, "Produit C", "Juin 2017");
return dataset;
}
private DefaultCategoryDataset lineDataset1() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(25.0, "total", "Avril 2017");
dataset.addValue(20.0, "total", "Mai 2017");
dataset.addValue(15.0, "total", "Juin 2017");
return dataset;
}
private DefaultCategoryDataset lineDataset2() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(100.0, "Par rapport à l'année précédente", "Avril 2017");
dataset.addValue(60.0, "Par rapport à l'année précédente", "Mai 2017");
dataset.addValue(80.0, "Par rapport à l'année précédente", "Juin 2017");
return dataset;
}
}
Recommended Posts