では、前回の「凡例+グリッド線+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軸ラベル、グリッド線、凡例も引き続き表示され、より完成度の高いグラフに
ポイント
FontとFontMetricsを使ってタイトルを中央に配置- タイトルは
Font.BOLDで強調 - 軸ラベルや凡例と組み合わせることで、グラフの意味が直感的に伝わる
👉 これで「タイトル+凡例+グリッド線+X軸ラベル+縦書きY軸ラベル付き折れ線グラフ」が完成しました。

