では、前回の「棒グラフ風セル付き統計表」をさらに発展させて、凡例(緑=平均以上、赤=平均未満)を追加するサンプルを紹介します。
サンプルコード:凡例付き PdfPTable
import java.io.FileOutputStream;
import java.util.*;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
public class ChartPDFWithBarCellsAndLegend {
public static void main(String[] args) {
// ダミーデータ
Map<String, List<Integer>> datasets = new LinkedHashMap<>();
datasets.put("データセット1", Arrays.asList(3, 5, 2, 7));
datasets.put("データセット2", Arrays.asList(2, 4, 6, 5));
try {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("chart_with_bar_cells_legend.pdf"));
document.open();
document.add(new Paragraph("=== 棒グラフ風セル付き統計表 ===\n\n"));
PdfPTable table = new PdfPTable(2); // 列数: ラベル, 棒グラフ風セル
table.setWidthPercentage(100);
// ヘッダー
PdfPCell h1 = new PdfPCell(new Phrase("データセット"));
h1.setBackgroundColor(BaseColor.LIGHT_GRAY);
table.addCell(h1);
PdfPCell h2 = new PdfPCell(new Phrase("値の可視化"));
h2.setBackgroundColor(BaseColor.LIGHT_GRAY);
table.addCell(h2);
// 最大値を全体から取得(スケーリング用)
int globalMax = datasets.values().stream()
.flatMap(List::stream)
.max(Integer::compareTo)
.orElse(1);
// 各データセットを行として追加
for (Map.Entry<String, List<Integer>> entry : datasets.entrySet()) {
String label = entry.getKey();
List<Integer> values = entry.getValue();
table.addCell(label);
// 棒グラフ風のサブテーブル
PdfPTable barTable = new PdfPTable(values.size());
double avg = values.stream().mapToInt(Integer::intValue).average().orElse(0);
for (int val : values) {
PdfPCell cell = new PdfPCell(new Phrase(String.valueOf(val)));
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
// 平均以上は緑、未満は赤
if (val >= avg) {
cell.setBackgroundColor(new BaseColor(144, 238, 144)); // ライトグリーン
} else {
cell.setBackgroundColor(new BaseColor(255, 182, 193)); // ライトピンク
}
// 値に応じてセルの高さを調整(棒グラフ風)
float barHeight = (float) val / globalMax * 30f;
cell.setMinimumHeight(barHeight + 15);
barTable.addCell(cell);
}
PdfPCell barCell = new PdfPCell(barTable);
table.addCell(barCell);
}
document.add(table);
// --- 凡例を追加 ---
document.add(new Paragraph("\n=== 凡例 ==="));
PdfPTable legend = new PdfPTable(2);
legend.setWidthPercentage(50);
PdfPCell greenBox = new PdfPCell(new Phrase("平均以上"));
greenBox.setBackgroundColor(new BaseColor(144, 238, 144));
legend.addCell(greenBox);
PdfPCell redBox = new PdfPCell(new Phrase("平均未満"));
redBox.setBackgroundColor(new BaseColor(255, 182, 193));
legend.addCell(redBox);
document.add(legend);
document.close();
System.out.println("chart_with_bar_cells_legend.pdf に保存しました。");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java✅ 実行結果
- chart_with_bar_cells_legend.pdf が生成されます
- 各データセットの行に「棒グラフ風セル」が表示され、平均以上は緑、未満は赤で色分け
- 下部に 凡例(緑=平均以上、赤=平均未満) が追加され、意味が明確に
ポイント
- 凡例も
PdfPTableを使って簡単に表形式で追加可能 - 色付きセルにラベルを付けることで、視覚的に直感的な理解が可能
- 表と凡例を組み合わせることで、より完成度の高いレポートに
👉 これで「棒グラフ風セル+凡例付き統計表のPDF出力」が完成しました。

