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

Java Java
スポンサーリンク

では、前回の「棒グラフ風セル付き統計表」をさらに発展させて、凡例(緑=平均以上、赤=平均未満)を追加するサンプルを紹介します。

サンプルコード:凡例付き 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出力」が完成しました。

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