Maison  >  Article  >  Java  >  Comment mettre à l'échelle efficacement les boxplots JFreeChart avec plusieurs catégories ?

Comment mettre à l'échelle efficacement les boxplots JFreeChart avec plusieurs catégories ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-06 04:45:02748parcourir

How to Effectively Scale JFreeChart Boxplots with Multiple Categories?

Mise à l'échelle des boxplots JFreeChart avec plusieurs catégories

Énoncé du problème :

Lors de la création de boxplots à l'aide de JFreeChart pour un CategoryDataset comportant de nombreuses catégories et séries, il a été remarqué que le graphique n'était pas correctement mis à l'échelle. Soit la sous-intrigue est trop petite, soit la légende et les annotations sont disproportionnées.

Technique de mise à l'échelle appropriée :

Pour garantir une mise à l'échelle correcte, il est crucial de définir la taille préférée. du ChartPanel contenant le graphique, pas du graphique lui-même. Cela garantit que seule la sous-intrigue est mise à l'échelle tout en conservant la taille et la lisibilité de la légende et des annotations.

Approche basée sur les pages :

Dans les cas où il y a un nombre excessif de catégories, envisager une approche basée sur les pages peut être plus pratique. Cela implique de diviser les données en sous-ensembles plus petits et d’afficher seulement une partie des données à la fois. Un élément de contrôle, tel qu'une barre de défilement, peut être ajouté pour naviguer entre les pages de données.

Exemple :

Le code suivant illustre une implémentation basée sur les pages :

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BoxAndWhiskerRenderer;
import org.jfree.data.statistics.DefaultBoxAndWhiskerCategoryDataset;

public class BoxAndWhiskerDemo {

    private List<List<List<Double>>> data;
    private DefaultBoxAndWhiskerCategoryDataset dataset;
    private CategoryPlot plot;
    private ChartPanel chartPanel;
    private JPanel controlPanel;
    private int start = 0;
    private int visible = 4;

    public BoxAndWhiskerDemo() {
        createData();
        createDataset(start);
        createChartPanel();
        createControlPanel();
    }

    // Data generation and dataset creation
    // ...

    private void createChartPanel() {
        CategoryAxis xAxis = new CategoryAxis("Category");
        NumberAxis yAxis = new NumberAxis("Value");
        BoxAndWhiskerRenderer renderer = new BoxAndWhiskerRenderer();
        plot = new CategoryPlot(dataset, xAxis, yAxis, renderer);
        JFreeChart chart = new JFreeChart("BoxAndWhiskerDemo", plot);
        chartPanel = new ChartPanel(chart);
    }

    private void createControlPanel() {
        controlPanel = new JPanel();
        controlPanel.add(new JButton(new AbstractAction("\u22b2Prev") {
            @Override
            public void actionPerformed(ActionEvent e) {
                start -= visible;
                if (start < 0) {
                    start = 0;
                    return;
                }
                createDataset(start);
                plot.setDataset(dataset);
            }
        }));
        controlPanel.add(new JButton(new AbstractAction("Next\u22b3") {
            @Override
            public void actionPerformed(ActionEvent e) {
                start += visible;
                if (start >= data.size() - visible) {
                    start = data.size() - visible;
                    return;
                }
                createDataset(start);
                plot.setDataset(dataset);
            }
        }));
    }

    // ...

    public static void main(String[] args) {
        BoxAndWhiskerDemo demo = new BoxAndWhiskerDemo();
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(demo.getChartPanel(), BorderLayout.CENTER);
        frame.add(demo.getControlPanel(), BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }
}

Cette approche permet d'afficher un ensemble de données plus grand de manière plus gérable tout en préservant la clarté des éléments du graphique.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn