では、これまでの「入力 → 集計 → 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を使えばよりリッチな折れ線グラフが簡単に作れる
👉 これで「複数データセットを折れ線グラフで比較」できるようになりました。

