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

Java Java
スポンサーリンク

では、前回の「凡例+グリッド線+X軸ラベル+縦書きY軸ラベル付き折れ線グラフ」に グラフ全体のタイトル を追加するサンプルを紹介します。

サンプルコード:タイトル付き折れ線グラフ

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

public class MultiLineChartWithTitle extends JPanel {
    private List<Map<Integer, Integer>> datasets;
    private List<String> labels;
    private String xAxisLabel = "カテゴリ"; // X軸ラベル
    private String yAxisLabel = "値";      // Y軸ラベル
    private String chartTitle = "複数データセットの折れ線グラフ"; // グラフタイトル
    private List<Color> colors = Arrays.asList(Color.RED, Color.BLUE, Color.GREEN, Color.ORANGE);

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

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

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

        Graphics2D g2 = (Graphics2D) g;

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

        // --- タイトル ---
        g2.setFont(new Font("SansSerif", Font.BOLD, 16));
        FontMetrics fm = g2.getFontMetrics();
        int titleWidth = fm.stringWidth(chartTitle);
        g2.drawString(chartTitle, (width - titleWidth) / 2, 25);

        // 軸
        g2.setFont(new Font("SansSerif", Font.PLAIN, 12));
        g2.setColor(Color.BLACK);
        g2.drawLine(50, height - 50, width - 20, height - 50); // X軸
        g2.drawLine(50, 30, 50, height - 50); // Y軸

        // --- X軸ラベル ---
        g2.drawString(xAxisLabel, width / 2 - 20, height - 10);

        // --- Y軸ラベル(縦書き・回転) ---
        g2.rotate(-Math.PI / 2);
        g2.drawString(yAxisLabel, -height / 2 - 20, 20);
        g2.rotate(Math.PI / 2);

        // 最大値を求める
        int maxCount = 0;
        for (Map<Integer, Integer> data : datasets) {
            if (!data.isEmpty()) {
                maxCount = Math.max(maxCount, Collections.max(data.values()));
            }
        }

        // --- グリッド線(横方向) ---
        g2.setColor(Color.LIGHT_GRAY);
        int gridLines = 5;
        for (int i = 1; i <= gridLines; i++) {
            int y = height - 50 - (i * (height - 80) / gridLines);
            g2.drawLine(50, y, width - 20, y);
            int labelValue = (int) ((double) maxCount * i / gridLines);
            g2.setColor(Color.BLACK);
            g2.drawString(String.valueOf(labelValue), 20, y + 5);
            g2.setColor(Color.LIGHT_GRAY);
        }

        // データセットごとに折れ線を描画
        int datasetIndex = 0;
        for (Map<Integer, Integer> data : datasets) {
            g2.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));

                g2.fillOval(x - 3, y - 3, 6, 6);

                if (prevX != -1) {
                    g2.drawLine(prevX, prevY, x, y);
                }

                g2.setColor(Color.BLACK);
                g2.drawString(String.valueOf(key), x - 5, height - 35);

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

            datasetIndex++;
        }

        // --- 凡例 ---
        int legendX = width - 150;
        int legendY = 60;
        g2.setColor(Color.BLACK);
        g2.drawString("凡例:", legendX, legendY);

        for (int i = 0; i < datasets.size(); i++) {
            g2.setColor(colors.get(i % colors.size()));
            g2.fillRect(legendX, legendY + 15 + i * 20, 15, 15);

            g2.setColor(Color.BLACK);
            g2.drawString(labels.get(i), legendX + 20, legendY + 27 + i * 20);
        }
    }

    public static void main(String[] args) {
        // ダミーデータセット
        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);
        List<String> labels = Arrays.asList("データセット1", "データセット2");

        JFrame frame = new JFrame("タイトル付き折れ線グラフ");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new MultiLineChartWithTitle(datasets, labels));
        frame.pack();
        frame.setVisible(true);
    }
}
Java

✅ 実行イメージ

  • グラフ上部中央に 太字のタイトル が表示されます
  • X軸・Y軸ラベル、グリッド線、凡例も引き続き表示され、より完成度の高いグラフに

ポイント

  • FontFontMetrics を使ってタイトルを中央に配置
  • タイトルは Font.BOLD で強調
  • 軸ラベルや凡例と組み合わせることで、グラフの意味が直感的に伝わる

👉 これで「タイトル+凡例+グリッド線+X軸ラベル+縦書きY軸ラベル付き折れ線グラフ」が完成しました。

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