Java | 複数の入力をまとめて List に格納するサンプル

Java Java
スポンサーリンク

では、これまでの「入力 → 集計 → CSV保存 → CSV読み込み → GUI棒グラフ → PNG保存」をさらに発展させて、複数のデータセットを比較する折れ線グラフを Swing で描画するサンプルを紹介します。

サンプルコード:複数データセットの折れ線グラフ

ここでは例として「2つのデータセット(CSVの複数行を想定)」を読み込み、折れ線グラフで比較します。

import javax.swing.*;
import java.awt.*;
import java.util.*;

public class MultiLineChart extends JPanel {
    private List<Map<Integer, Integer>> datasets; // 複数のデータセット
    private List<Color> colors = Arrays.asList(Color.RED, Color.BLUE, Color.GREEN, Color.ORANGE);

    public MultiLineChart(List<Map<Integer, Integer>> datasets) {
        this.datasets = datasets;
        setPreferredSize(new Dimension(600, 400));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        if (datasets == null || datasets.isEmpty()) return;

        int width = getWidth();
        int height = getHeight();

        // 軸を描画
        g.setColor(Color.BLACK);
        g.drawLine(50, height - 50, width - 20, height - 50); // X軸
        g.drawLine(50, 30, 50, height - 50); // Y軸

        // 最大値を求める(全データセットから)
        int maxCount = 0;
        for (Map<Integer, Integer> data : datasets) {
            if (!data.isEmpty()) {
                maxCount = Math.max(maxCount, Collections.max(data.values()));
            }
        }

        // データセットごとに折れ線を描画
        int datasetIndex = 0;
        for (Map<Integer, Integer> data : datasets) {
            g.setColor(colors.get(datasetIndex % colors.size()));

            // 値を昇順に並べる
            List<Integer> keys = new ArrayList<>(data.keySet());
            Collections.sort(keys);

            int prevX = -1, prevY = -1;
            int i = 0;
            for (int key : keys) {
                int count = data.get(key);

                // 座標変換
                int x = 50 + (i * (width - 100) / (keys.size() - 1));
                int y = height - 50 - (int) ((double) count / maxCount * (height - 100));

                // 点を描画
                g.fillOval(x - 3, y - 3, 6, 6);

                // 線をつなぐ
                if (prevX != -1) {
                    g.drawLine(prevX, prevY, x, y);
                }

                // ラベル
                g.drawString(String.valueOf(count), x - 5, y - 10);

                prevX = x;
                prevY = y;
                i++;
            }

            datasetIndex++;
        }
    }

    public static void main(String[] args) {
        // ダミーデータセット(本来はCSVから読み込む)
        Map<Integer, Integer> dataset1 = new LinkedHashMap<>();
        dataset1.put(1, 3);
        dataset1.put(2, 5);
        dataset1.put(3, 2);
        dataset1.put(4, 7);

        Map<Integer, Integer> dataset2 = new LinkedHashMap<>();
        dataset2.put(1, 2);
        dataset2.put(2, 4);
        dataset2.put(3, 6);
        dataset2.put(4, 5);

        List<Map<Integer, Integer>> datasets = Arrays.asList(dataset1, dataset2);

        JFrame frame = new JFrame("複数データセットの折れ線グラフ");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new MultiLineChart(datasets));
        frame.pack();
        frame.setVisible(true);
    }
}
Java

✅ 実行イメージ

  • ウィンドウに 2本の折れ線グラフ が表示されます
  • 赤線と青線でデータセットを区別
  • 各点に出現回数がラベル表示され、比較がしやすい

ポイント

  • List<Map<Integer,Integer>> を使って複数データセットを保持
  • 各データセットを異なる色で描画
  • 値を昇順に並べて折れ線を描画することで比較が可能

発展アイデア

  • 凡例(赤=データ1、青=データ2)を追加
  • CSVの複数行を読み込んで自動的に複数データセットに変換
  • JavaFX の LineChart を使えばよりリッチな折れ線グラフが簡単に作れる

👉 これで「複数データセットを折れ線グラフで比較」できるようになりました。

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました