[JAVA] Créer des graphiques avec JFreeChart

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.

concept

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.

Type de catégorie

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.

Type XY

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.

Exemple de code

Type de catégorie

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

Créer des graphiques avec JFreeChart
Créer un multi-projet Java avec Gradle
Utiliser Microsoft Graph avec Java standard
Créer une application d'enquête avec Spring Boot
[Rails] Création initiale des données avec seed
[Rails 6] Dessin graphique interactif avec Ajax + chart.js
Création de JavaFX et d'outils avec un package autonome (distribution)
Création d'outils avec JavaFX et packages autonomes (édition JavaFX)