[JAVA] Erstellen Sie Diagramme mit JFreeChart

Nachdem ich kürzlich ein Programm schreiben musste, das JFreeChart zum Generieren von Diagrammen verwendet, werde ich die Verwendung von JFreeChart zusammenfassen.

Konzept

Wenn Sie sich zunächst den Beispielcode ansehen, können Sie schnell ein einfaches Diagramm erstellen. Wenn es jedoch etwas kompliziert wird, verlieren Sie schnell den Überblick darüber, wo Sie es einstellen müssen. Um dies zu verhindern, beginnen wir mit dem Konzept von JFreeChart.

グラフサンプル

Chart

Repräsentiert das gesamte Diagramm. Normalerweise erstellen Sie ein Diagramm mit der ChartFactory-Methode. Es ist daher leicht zu glauben, dass der Diagrammtyp durch das Diagramm bestimmt wird (der Diagrammtyp wird vom Renderer festgelegt), aber die direkten Objekte des Diagramms sind Titel und Legende. (Legned) und nur Plot unten, Chart ist wie der gesamte Frame.

Plot

Der gesamte Zeichenbereich des Diagramms einschließlich der Achsen wird zu einem Diagramm. Einige meiner Hauptgegenstände sind der Datensatz, der Renderer und die Achse. Es gibt zwei Arten von Plots: Kategorie-Plots und XY-Plots, je nachdem, wie Sie die Daten speichern. Im Kategoriediagramm können nur Dataset und Renderer vom Kategorietyp und im XY-Plot nur Dataset und Renderer vom Typ XY festgelegt werden.

Kategorietyp

In Diagrammen wie den im Geschäftsleben verwendeten ist die Y-Achse eine normale Zahl, die X-Achse jedoch keine normale Zahl. Wenn es sich um ein Verkaufsdiagramm für jedes Produkt handelt, handelt es sich um eine Zeichenfolge wie bei Produkt A. Dies ist Kategorie, und Sie müssen Kategoriediagramm verwenden, um ein solches Diagramm zu erstellen.

In der obigen Erklärung werden die Begriffe X-Achse und Y-Achse der Klarheit halber verwendet, aber abhängig von der Grafik können die Bedeutungen der X-Achse und der Y-Achse entgegengesetzt sein. In JFreeChart heißt der Name der Achse Domänenachse für die normale X-Achse (die Kategorie darstellt) und Werteachse für die Y-Achse.

XY-Typ

Verwenden Sie für Diagramme, bei denen die X-Achse ebenfalls eine normale Zahl ist, wie dies in der Mathematik häufig der Fall ist, das XY-Diagramm.

In einem typischen monatlichen umsatzähnlichen Diagramm ist die X-Achse das Datum, das entweder durch ein Kategoriediagramm oder ein XY-Diagramm dargestellt werden kann. Im ersten Fall wird 2017/7 nicht als fortlaufender numerischer Wert, sondern als Zeichenfolge behandelt. In Wirklichkeit verwenden viele Menschen Category Plot. Dies liegt daran, dass der Category-Typ-Renderer mehr Arten von Balkendiagrammen enthält.

Dataset

Eine Sammlung von Daten, die angezeigt werden sollen, ist ein Datensatz. Im Datensatz vom Kategorietyp ist die X-Achse = Kategoriewert (Beispiel: April 2017), der Y-Achsenwert (Beispiel: 10) und die Datenaufteilung = Serie, falls vorhanden, der Wert (Beispiel: Produkt A) 1. Es werden eine Daten.

Renderer

Der Renderer zeichnet das Diagramm tatsächlich basierend auf dem Datensatz, und der Typ des Renderers = der Typ des Diagramms. Welche Art von Renderer Sie haben, finden Sie in Javadoc org.jfreechart.chart.renderer.category Package. package-summary.html) und org.jfreechart.chart.renderer.xy package. Überprüfen Sie die Klasse von HTML).

Verwenden Sie die Renderer-Methoden, um das Erscheinungsbild des Diagramms anzupassen.

Fügen Sie beim Erstellen eines zusammengesetzten Diagramms für jeden Diagrammtyp ein Renderer / Dataset-Paar zu Plot hinzu.

Beispielcode

Kategorietyp

Dies ist der Code, der das am Anfang gezeigte Beispieldiagramm generiert. Wenn Sie die obige Erklärung im Auge haben, können Sie sie leicht verstehen.

JFreeChartSample.java


public class JFreeChartSample {

	public void createChart(ChartType type) { //Ermöglicht dem Argument zu ändern, ob das Balkenteil ein Stapel oder eine Menge ist
		//Erstellen eines einfachen gestapelten Balkendiagramm-Renderers/Dataset#0
		JFreeChart chart = ChartFactory.createStackedBarChart("Title", "Category", "Value", barDataset());
		CategoryPlot plot = (CategoryPlot) chart.getPlot(); //StackedBarChart ist ein Kategorietyp
		String filename = type.getFilename();
		if (type == ChartType.CLUSTERED) { //Wechseln Sie zum aggregierten Balkendiagramm
			BarRenderer barRenderer = new BarRenderer();
			barRenderer.setItemMargin(0.0); //Balkenabstand in Kategorie
			plot.setRenderer(barRenderer);
		}
		//Hinzufügen von gestrichelten Linien (insgesamt)
		LineAndShapeRenderer lineRenderer1 = new LineAndShapeRenderer();
		plot.setRenderer(1, lineRenderer1); // Renderer#1
		plot.setDataset(1, lineDataset1()); // Dataset#1
		//Renderer, weil ich eine gestrichelte Linie (im Vergleich zum Vorjahr) hinzufügen und die Achse trennen möchte/Separater Datensatz
		LineAndShapeRenderer lineRenderer2 = new LineAndShapeRenderer();
		plot.setRenderer(2, lineRenderer2); // Renderer#2
		plot.setDataset(2, lineDataset2()); // Dataset#2
		//Achse hinzufügen
		NumberAxis axis = new NumberAxis("Verglichen mit dem vorherigen Jahr(%)");
		axis.setRange(0, 200);
		plot.setRangeAxis(1, axis); // RangeAxis#1
		plot.mapDatasetToRangeAxis(2, 1); // Dataset#2 ist die Bereichsachse#Verwende 1
		//Legendenposition
		chart.getLegend().setPosition(RectangleEdge.RIGHT);
		//Zeichnungsreihenfolge ändern Standardabsteigende Reihenfolge (#0 ist die letzte) → Aufsteigende Reihenfolge (#0 wird zuerst angezeigt, später wird oben angezeigt)
		plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
		
		//Bilderzeugung
		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, "Produkt A.", "April 2017");
		dataset.addValue(15.0, "Produkt B.", "April 2017");
		dataset.addValue(10.0, "Produkt A.", "Mai 2017");
		dataset.addValue(5.0, "Produkt B.", "Mai 2017");
		dataset.addValue(5.0, "Produkt C.", "Mai 2017");
		dataset.addValue(5.0, "Produkt A.", "Juni 2017");
		dataset.addValue(10.0, "Produkt C.", "Juni 2017");
		return dataset;
	}
	
	private DefaultCategoryDataset lineDataset1() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(25.0, "gesamt", "April 2017");
		dataset.addValue(20.0, "gesamt", "Mai 2017");
		dataset.addValue(15.0, "gesamt", "Juni 2017");
		return dataset;
	}

	private DefaultCategoryDataset lineDataset2() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(100.0, "Verglichen mit dem vorherigen Jahr", "April 2017");
		dataset.addValue(60.0, "Verglichen mit dem vorherigen Jahr", "Mai 2017");
		dataset.addValue(80.0, "Verglichen mit dem vorherigen Jahr", "Juni 2017");
		return dataset;
	}
}

Recommended Posts

Erstellen Sie Diagramme mit JFreeChart
Erstellen Sie mit Gradle ein Java-Multiprojekt
Verwenden Sie Microsoft Graph mit Standard-Java
Erstellen Sie eine Anfrage-App mit Spring Boot
[Rails] Erste Datenerstellung mit Seed
[Rails 6] Interaktive Grafikzeichnung mit Ajax + chart.js
JavaFX & Tool Creation mit in sich geschlossenem Paket (Distribution)
Erstellen von Tools mit JavaFX und eigenständigen Paketen (JavaFX Edition)