<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0" xml:lang="ja">
<channel>
<title>みんなのデータサイト</title>
<link>http://minnanods.net/</link>
<atom:link href="https://minnanods.net/rss2.xml" rel="self" type="application/rss+xml" />
<description></description>
<language>ja</language>
<copyright>Copyright (C) 2026 みんなのデータサイト All rights reserved.</copyright>
<lastBuildDate>Sun, 13 Sep 2026 14:57:06 +0900</lastBuildDate>
<generator>a-blog cms</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<item>
<dc:creator>みんなのデータサイト</dc:creator>
<title>月間降下物量（気象庁気象研究所出典版）超長期推移</title>
<link>https://minnanods.net/learn/contamination-level-of-japan/entry-1839.html</link>
<description><![CDATA[




<!-- テキスト -->

<div id="top"></div>










































<hr class="clearHidden">





<!-- 画像 -->
<div class="column-image-center js_notStyle acms-col-sm-12">
<img class="columnImage"
 src="https://minnanods.net/archives/001/202609/97b6a96ac7a90102.png"
 alt=""
 width="823"
 height="512">
<p class="caption">データ出典：気象庁気象研究所</p>
</div>




































<hr class="clearHidden">

<!-- テキスト -->

<h2 >降下物</h2>











































<!-- テキスト -->

<p>正式には放射性降下物のことで、一般にフォールアウトとも呼ばれる。大気圏における核爆発や原子炉の事故における放射性物質の事故による大気中への放出などが原因になり、核分裂生成物を含む放射性の粒状物質が大気中（または成層圏中）に飛散し、これが生活環境に降下したものである。<br />
「原子力百科事典 ATOMICA」より</p>











































<!-- テキスト -->

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>月間降下物量 (気象庁気象研究所出典版) 超長期推移</title>

  <!-- CSV解析 -->
  <script src="https://cdn.jsdelivr.net/npm/papaparse@5.4.1/papaparse.min.js"></script>
  <!-- Chart.js -->
  <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.7/dist/chart.umd.min.js"></script>
  <!-- ピンチ操作用 -->
  <script src="https://cdn.jsdelivr.net/npm/hammerjs@2.0.8/hammer.min.js"></script>
  <!-- Chart.js Zoom Plugin -->
  <script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-zoom@2.2.0/dist/chartjs-plugin-zoom.min.js"></script>
  <!-- Chart.js Annotation Plugin (注釈用) -->
  <script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-annotation@3.0.1/dist/chartjs-plugin-annotation.min.js"></script>

  <style>
    :root {
      --header-green: #79bc00;
      --header-green-dark: #69a900;
      --mito-color: #df2735;
      --tsukuba-color: #16a34a;
      --chiyoda-color: #2c63e6;
      --nakano-color: #f59e0b;
      --text-color: #16243a;
      --sub-text-color: #667085;
      --border-color: #d9e2ec;
      --panel-background: #ffffff;
      --soft-background: #f7f9fc;
      --button-border: #cbd6e2;
      --button-hover: #f0f5fa;
      --shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
    }

    * { box-sizing: border-box; }

    html {
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Yu Gothic UI", "Yu Gothic", Meiryo, sans-serif;
      color: var(--text-color);
      background: #ffffff;
    }

    body { margin: 0; padding: 0; background: #ffffff; }
    button, select { font: inherit; }

    .page {
      width: min(1200px, 100%);
      margin: 0 auto;
      padding: 18px;
    }

    /* ヘッダー */
    .hero {
      position: relative;
      overflow: hidden;
      padding: 20px 22px 17px;
      color: #ffffff;
      background: linear-gradient(135deg, var(--header-green), var(--header-green-dark));
      border-radius: 8px;
    }
    .hero::before {
      content: "";
      position: absolute;
      top: 15px;
      left: 17px;
      width: 18px;
      height: 48px;
      border-radius: 9px;
      background: rgba(255, 255, 255, 0.07);
    }
    .hero-title {
      position: relative;
      margin: 0;
      padding-left: 22px;
      font-size: clamp(18px, 3vw, 25px);
      line-height: 1.4;
      font-weight: 700;
    }
    .hero-divider {
      position: relative;
      height: 4px;
      margin: 8px 0 7px 22px;
      background: rgba(255, 255, 255, 0.06);
    }
    .hero-subtitle {
      position: relative;
      margin: 0;
      padding-left: 0;
      font-size: 12px;
      font-weight: 600;
    }

    /* 操作領域 */
    .controls {
      display: flex;
      flex-wrap: wrap;
      align-items: end;
      gap: 9px;
      margin: 14px 0 7px;
    }
    .control-group {
      display: flex;
      align-items: center;
      gap: 6px;
    }
    .control-label {
      font-size: 14px;
      font-weight: 700;
      color: #344054;
    }
    select {
      min-width: 88px;
      height: 40px;
      padding: 0 34px 0 12px;
      color: #243248;
      font-weight: 600;
      background: #ffffff;
      border: 1px solid var(--button-border);
      border-radius: 6px;
      cursor: pointer;
    }
    select:focus {
      outline: 2px solid rgba(121, 188, 0, 0.3);
      border-color: var(--header-green);
    }
    .action-button {
      min-height: 40px;
      padding: 8px 14px;
      color: #263750;
      font-weight: 700;
      background: #ffffff;
      border: 1px solid var(--button-border);
      border-radius: 6px;
      cursor: pointer;
      transition: background-color 0.15s ease, border-color 0.15s ease, transform 0.05s ease;
    }
    .action-button:hover {
      background: var(--button-hover);
      border-color: #aebdcd;
    }
    .action-button:active {
      transform: translateY(1px);
    }
    .status-line {
      min-height: 22px;
      margin: 7px 0;
      color: var(--sub-text-color);
      font-size: 12px;
    }
    .status-line.is-error {
      color: #b42318;
      font-weight: 700;
    }

    /* 選択年月 */
    .selected-month-title {
      margin: 8px 0 10px;
      text-align: center;
      font-size: 20px;
      line-height: 1.4;
      font-weight: 700;
    }

    /* 地点カード */
    .site-cards {
      display: grid;
      grid-template-columns: repeat(4, minmax(0, 1fr));
      gap: 12px;
      margin-bottom: 15px;
    }
    .site-card {
      min-height: 137px;
      padding: 15px 16px 14px;
      background: var(--panel-background);
      border: 1px solid var(--border-color);
      border-top-width: 4px;
      border-radius: 8px;
      box-shadow: var(--shadow);
    }
    .site-card.mito { border-top-color: var(--mito-color); }
    .site-card.tsukuba { border-top-color: var(--tsukuba-color); }
    .site-card.chiyoda { border-top-color: var(--chiyoda-color); }
    .site-card.nakano { border-top-color: var(--nakano-color); }

    .site-name { margin: 0 0 5px; font-size: 16px; font-weight: 700; }
    .site-source {
      min-height: 18px; margin: 0 0 7px; overflow-wrap: anywhere;
      color: var(--sub-text-color); font-size: 11px; line-height: 1.45;
    }
    .site-value {
      margin: 0 0 4px; overflow-wrap: anywhere;
      color: #101828; font-size: clamp(20px, 2.4vw, 26px); line-height: 1.25; font-weight: 750;
    }
    .site-description { margin: 0; color: #53647b; font-size: 11px; line-height: 1.45; }

    /* グラフ領域 */
    .chart-panel {
      padding: 15px 14px 10px;
      background: var(--panel-background);
      border: 1px solid var(--border-color);
      border-radius: 8px;
      box-shadow: var(--shadow);
    }
    .chart-container { position: relative; width: 100%; height: 520px; }
    .chart-help { margin: 10px 0 1px; color: #718096; font-size: 11px; text-align: center; }
    .chart-help strong { color: #4b78b8; }

    /* データの扱い */
    .notes { margin-top: 16px; padding: 17px 18px; background: var(--soft-background); border-radius: 8px; }
    .notes-title { display: flex; align-items: center; gap: 8px; margin: 0 0 9px; font-size: 15px; }
    .notes-mark {
      display: inline-block; width: 22px; height: 22px; border-radius: 50%;
      background: linear-gradient(135deg, #c5df72 0 47%, #8fbd24 48% 100%);
    }
    .notes ul { margin: 0; padding-left: 21px; color: #4a5d77; font-size: 13px; line-height: 1.8; }

    /* デバッグ情報 */
    .diagnostics { margin-top: 14px; border: 1px solid var(--border-color); border-radius: 8px; }
    .diagnostics summary { padding: 12px 14px; font-size: 13px; font-weight: 700; cursor: pointer; }
    .diagnostics-content { padding: 0 14px 14px; color: #475467; font-size: 12px; line-height: 1.6; }
    .diagnostics-table-wrapper { overflow-x: auto; }
    .diagnostics table { width: 100%; border-collapse: collapse; }
    .diagnostics th, .diagnostics td { padding: 7px 8px; text-align: left; white-space: nowrap; border-bottom: 1px solid #e8edf3; }
    .diagnostics th { background: #f7f9fc; }

    /* レスポンシブ */
    @media (max-width: 900px) { .site-cards { grid-template-columns: repeat(2, 1fr); } }
    @media (max-width: 760px) {
      .page { padding: 10px; }
      .hero { padding: 17px 15px 15px; }
      .site-card { min-height: 0; }
      .chart-container { height: 430px; }
      .controls { align-items: stretch; }
      .control-group { flex: 1 1 auto; }
      select { flex: 1; }
      .action-button { flex: 1 1 auto; }
    }
    @media (max-width: 450px) {
      .site-cards { grid-template-columns: 1fr; }
      .chart-container { height: 380px; }
      .controls { display: grid; grid-template-columns: 1fr 1fr; }
      .action-button { width: 100%; }
      .nuclide-group { grid-column: 1 / -1; }
    }
  </style>
<meta name="csrf-token" content="f4bf7985e90d336d4099838689a48da3cff51b8b56629966153a48313badeafd"></head>
<body>
  <main class="page">
    <header class="hero">
      <h1 class="hero-title">月間降下物量 (気象庁気象研究所出典版) 超長期推移</h1>
      <div class="hero-divider"></div>
      <p id="periodLabel" class="hero-subtitle">CSVを読み込んでいます</p>
    </header>

    <section class="controls" aria-label="表示年月とグラフ操作">
      <div class="control-group nuclide-group">
        <label class="control-label" for="nuclideSelect">核種</label>
        <select id="nuclideSelect" aria-label="表示する核種">
          <option value="Sr-90" selected>Sr-90</option>
          <option value="Cs-137">Cs-137</option>
        </select>
      </div>

      <div class="control-group">
        <label class="control-label" for="yearSelect">年</label>
        <select id="yearSelect" aria-label="表示する年"></select>
      </div>

      <div class="control-group">
        <label class="control-label" for="monthSelect">月</label>
        <select id="monthSelect" aria-label="表示する月"></select>
      </div>

      <button id="resetViewButton" class="action-button" type="button">↻ 全体表示</button>
      <button id="zoomViewButton" class="action-button" type="button">⛶ 拡大表示</button>
    </section>

    <div id="statusLine" class="status-line" aria-live="polite"></div>
    <h2 id="selectedMonthTitle" class="selected-month-title">―</h2>

    <section class="site-cards" aria-label="選択年月の地点別測定結果">
      <article id="card-mito" class="site-card mito">
        <h3 class="site-name">水戸市</h3>
        <p id="source-mito" class="site-source">採取：―</p>
        <p id="value-mito" class="site-value">―</p>
        <p id="description-mito" class="site-description">CSVを読み込んでいます</p>
      </article>

      <article id="card-tsukuba" class="site-card tsukuba">
        <h3 class="site-name">つくば市</h3>
        <p id="source-tsukuba" class="site-source">採取：―</p>
        <p id="value-tsukuba" class="site-value">―</p>
        <p id="description-tsukuba" class="site-description">CSVを読み込んでいます</p>
      </article>

      <article id="card-chiyoda" class="site-card chiyoda">
        <h3 class="site-name">千代田区</h3>
        <p id="source-chiyoda" class="site-source">採取：―</p>
        <p id="value-chiyoda" class="site-value">―</p>
        <p id="description-chiyoda" class="site-description">CSVを読み込んでいます</p>
      </article>

      <article id="card-nakano" class="site-card nakano">
        <h3 class="site-name">中野区</h3>
        <p id="source-nakano" class="site-source">採取：―</p>
        <p id="value-nakano" class="site-value">―</p>
        <p id="description-nakano" class="site-description">CSVを読み込んでいます</p>
      </article>
    </section>

    <section class="chart-panel">
      <div class="chart-container">
        <canvas id="falloutChart" aria-label="月間降下物量の長期推移"></canvas>
      </div>
      <p class="chart-help">
        <strong>グラフ操作：</strong> マウスホイール／ピンチで横方向に拡大・縮小、ドラッグで表示範囲を移動できます。
      </p>
    </section>

    <section class="notes">
      <h2 class="notes-title">
        <span class="notes-mark" aria-hidden="true"></span>
        データの扱い
      </h2>
      <ul>
        <li>環境放射線データベースから取得した月間降下物測定結果を表示しています。</li>
        <li>CSVに記録された実測値だけを表示しています。</li>
        <li>データが存在しない月は「欠測」とし、前後の実測値を線で結んで補間しません。</li>
        <li>同じ年月に複数の実測記録がある場合は、平均化せずにカードへすべての数値を表示しますが、対数グラフ上には最大値のみを描画します。</li>
        <li>ND（不検出・検出限界未満）はカードへ表示しますが、対数グラフ上には数値として描画しません。</li>
        <li>縦軸は対数表示です。CSV内の全実測値から表示範囲を自動計算します。</li>
      </ul>
    </section>

    <details class="diagnostics">
      <summary>読み込み診断</summary>
      <div class="diagnostics-content">
        <p id="diagnosticsSummary">CSVを読み込んでいます。</p>
        <div class="diagnostics-table-wrapper">
          <table>
            <thead>
              <tr>
                <th>地点</th>
                <th>全件</th>
                <th>実測値</th>
                <th>ND</th>
                <th>最初の月</th>
                <th>最後の月</th>
                <th>最大値</th>
              </tr>
            </thead>
            <tbody id="diagnosticsBody"></tbody>
          </table>
        </div>
      </div>
    </details>
  </main>

  <script>
    "use strict";

    const CSV_FILE = "https://fukushima-30year-project.org/wp-content/uploads/2026/08/kisho_fallout_optimized.csv";
    const SITE_ORDER = ["mito", "tsukuba", "chiyoda", "nakano"];
    const SELECTABLE_START_MONTH = "1963-03";

    const SITE_CONFIG = {
      mito: { label: "水戸市", color: "#df2735" },
      tsukuba: { label: "つくば市", color: "#16a34a" },
      chiyoda: { label: "千代田区", color: "#2c63e6" },
      nakano: { label: "中野区", color: "#f59e0b" }
    };

    let allRecords = [];
    let falloutChart = null;
    let dataStartMonth = "";
    let dataEndMonth = "";
    let fullXMinimum = 0;
    let fullXMaximum = 1;
    let fullYMinimum = 0.01;
    let fullYMaximum = 100;

    const nuclideSelect = document.getElementById("nuclideSelect");
    const yearSelect = document.getElementById("yearSelect");
    const monthSelect = document.getElementById("monthSelect");
    const resetViewButton = document.getElementById("resetViewButton");
    const zoomViewButton = document.getElementById("zoomViewButton");
    const periodLabel = document.getElementById("periodLabel");
    const statusLine = document.getElementById("statusLine");
    const selectedMonthTitle = document.getElementById("selectedMonthTitle");
    const diagnosticsSummary = document.getElementById("diagnosticsSummary");
    const diagnosticsBody = document.getElementById("diagnosticsBody");

    function normalizeText(value) {
      if (value === null || value === undefined) return "";
      return String(value).replace(/^\uFEFF/, "").trim();
    }

    function parsePositiveNumber(rawValue) {
      if (rawValue === null || rawValue === undefined || rawValue === "") return null;
      const normalized = String(rawValue).replace(/,/g, "").replace(/[　\s]/g, "").trim();
      const numericValue = Number(normalized);
      if (!Number.isFinite(numericValue) || numericValue <= 0) return null;
      return numericValue;
    }

    function formatValue(value) {
      if (value === null || value === undefined || !Number.isFinite(value)) return "";
      return value.toLocaleString("ja-JP", { maximumFractionDigits: 8 });
    }

    function isValidMonthText(value) { return /^\d{4}-\d{2}$/.test(value); }

    function monthToIndex(monthText) {
      if (!isValidMonthText(monthText)) return null;
      const [yearText, monthNumberText] = monthText.split("-");
      const year = Number(yearText);
      const monthNumber = Number(monthNumberText);
      if (!Number.isInteger(year) || !Number.isInteger(monthNumber) || monthNumber < 1 || monthNumber > 12) return null;
      return year * 12 + monthNumber - 1;
    }

    function indexToMonth(monthIndex) {
      const roundedIndex = Math.round(monthIndex);
      const year = Math.floor(roundedIndex / 12);
      const monthNumber = (roundedIndex % 12) + 1;
      return `${String(year).padStart(4, "0")}-${String(monthNumber).padStart(2, "0")}`;
    }

    function displayMonth(monthText) {
      if (!isValidMonthText(monthText)) return monthText;
      const [year, month] = monthText.split("-");
      return `${Number(year)}年${Number(month)}月`;
    }

    function enumerateMonths(startMonth, endMonth) {
      const startIndex = monthToIndex(startMonth);
      const endIndex = monthToIndex(endMonth);
      if (startIndex === null || endIndex === null || startIndex > endIndex) return [];
      const months = [];
      for (let index = startIndex; index <= endIndex; index += 1) {
        months.push(indexToMonth(index));
      }
      return months;
    }

    function normalizeRecord(record) {
      const month = normalizeText(record.month);
      const siteId = normalizeText(record.site_id).toLowerCase();
      const status = normalizeText(record.status).toLowerCase();
      const numericValue = parsePositiveNumber(record.value_bq_m2_month);

      return {
        ...record,
        month,
        site_id: siteId,
        site_name: normalizeText(record.site_name),
        nuclide: normalizeText(record.nuclide),
        status,
        value_bq_m2_month: normalizeText(record.value_bq_m2_month),
        sampling_location: normalizeText(record.sampling_location),
        sampling_organization: normalizeText(record.sampling_organization),
        detection_limit_bq_m2_month: normalizeText(record.detection_limit_bq_m2_month),
        record_key: normalizeText(record.record_key),
        numericValue: (status === "value" ? numericValue : null)
      };
    }

    async function loadCsvRecords() {
      const requestUrl = `${CSV_FILE}?v=${Date.now()}`;
      const response = await fetch(requestUrl, { cache: "no-store" });
      if (!response.ok) throw new Error(`CSVの読み込みに失敗しました。 HTTP ${response.status}`);
      
      const csvText = await response.text();
      const parsed = Papa.parse(csvText, {
        header: true,
        skipEmptyLines: true,
        transformHeader(header) { return normalizeText(header); }
      });

      const normalizedRecords = parsed.data
        .map(normalizeRecord)
        .filter((record) => {
          return (
            isValidMonthText(record.month) &&
            SITE_ORDER.includes(record.site_id) &&
            (record.nuclide === "Sr-90" || record.nuclide === "Cs-137")
          );
        });

      if (normalizedRecords.length === 0) {
        throw new Error("CSVから対象レコードを読み込めませんでした。");
      }
      return normalizedRecords;
    }

    function getRecordsForMonth(siteId, month) {
      const currentNuclide = nuclideSelect.value;
      return allRecords
        .filter((record) => record.site_id === siteId && record.month === month && record.nuclide === currentNuclide)
        .sort((left, right) => {
          const leftValue = (left.numericValue ?? Number.POSITIVE_INFINITY);
          const rightValue = (right.numericValue ?? Number.POSITIVE_INFINITY);
          if (leftValue !== rightValue) return leftValue - rightValue;
          return (left.record_key || "").localeCompare(right.record_key || "");
        });
    }

    function makeSourceText(records) {
      const organizations = [...new Set(records.map((r) => r.sampling_organization || r.sampling_location).filter(Boolean))];
      if (organizations.length === 0) return "採取：記録なし";
      if (organizations.length === 1) return `採取：${organizations[0]}`;
      return "採取：" + organizations.join("／");
    }

    function buildCardResult(records) {
      const measuredRecords = records.filter((r) => r.status === "value" && r.numericValue !== null);
      if (measuredRecords.length > 0) {
        const values = measuredRecords.map((r) => r.numericValue);
        return {
          valueText: values.map(formatValue).join("／"),
          description: (measuredRecords.length > 1 ? "同じ年月に複数の実測記録があります（Bq/m²・月）" : "Bq/m²・月・実測値")
        };
      }

      const ndRecords = records.filter((r) => r.status === "nd");
      if (ndRecords.length > 0) {
        const detectionLimits = [...new Set(ndRecords.map((r) => parsePositiveNumber(r.detection_limit_bq_m2_month)).filter((v) => v !== null).map(formatValue))];
        return {
          valueText: "ND",
          description: (detectionLimits.length > 0 ? "不検出・検出限界：" + detectionLimits.join("／") + " Bq/m²・月" : "不検出または検出限界未満")
        };
      }

      return { valueText: "欠測", description: "CSVに該当する測定記録がありません" };
    }

    function updateSiteCard(siteId, month) {
      const records = getRecordsForMonth(siteId, month);
      document.getElementById(`source-${siteId}`).textContent = makeSourceText(records);
      const result = buildCardResult(records);
      document.getElementById(`value-${siteId}`).textContent = result.valueText;
      document.getElementById(`description-${siteId}`).textContent = result.description;
    }

    function updateSelectedMonthCards(zoomToMonth = false) {
      const year = Number(yearSelect.value);
      const monthNumber = Number(monthSelect.value);
      if (!Number.isInteger(year) || !Number.isInteger(monthNumber)) return;
      const month = `${String(year).padStart(4, "0")}-${String(monthNumber).padStart(2, "0")}`;
      
      selectedMonthTitle.textContent = displayMonth(month);
      
      for (const siteId of SITE_ORDER) {
        updateSiteCard(siteId, month);
      }

      // zoomToMonth が true の場合のみグラフをズームする
      if (zoomToMonth) {
        const monthIndex = monthToIndex(month);
        if (falloutChart && monthIndex !== null) {
          const windowSize = 12; // 前後12ヶ月
          let newMin = monthIndex - windowSize;
          let newMax = monthIndex + windowSize;

          if (newMin < fullXMinimum) newMin = fullXMinimum;
          if (newMax > fullXMaximum) newMax = fullXMaximum;

          falloutChart.options.scales.x.min = newMin;
          falloutChart.options.scales.x.max = newMax;
          falloutChart.update();
        }
      }
    }

    function createYearMonthSelectors() {
      const startIndex = monthToIndex(SELECTABLE_START_MONTH);
      const endIndex = monthToIndex(dataEndMonth);
      yearSelect.innerHTML = "";
      
      if (startIndex === null || endIndex === null || startIndex > endIndex) return;
      
      const startYear = Math.floor(startIndex / 12);
      const endYear = Math.floor(endIndex / 12);
      
      for (let year = startYear; year <= endYear; year += 1) {
        const option = document.createElement("option");
        option.value = String(year);
        option.textContent = `${year}年`;
        yearSelect.appendChild(option);
      }

      monthSelect.innerHTML = "";
      for (let monthNumber = 1; monthNumber <= 12; monthNumber += 1) {
        const option = document.createElement("option");
        option.value = String(monthNumber);
        option.textContent = `${monthNumber}月`;
        monthSelect.appendChild(option);
      }

      const defaultMonth = chooseDefaultMonth();
      const [defaultYear, defaultMonthNumber] = defaultMonth.split("-");
      yearSelect.value = String(Number(defaultYear));
      monthSelect.value = String(Number(defaultMonthNumber));
    }

    function chooseDefaultMonth() {
      const initialMonth = "2011-03";
      if (allRecords.some((r) => r.month === initialMonth)) return initialMonth;
      return SELECTABLE_START_MONTH;
    }

    function buildDatasetPoints(siteId) {
      const months = enumerateMonths(dataStartMonth, dataEndMonth);
      const recordsByMonth = new Map();
      const currentNuclide = nuclideSelect.value;

      for (const record of allRecords) {
        if (record.site_id !== siteId || record.nuclide !== currentNuclide) continue;
        if (!recordsByMonth.has(record.month)) recordsByMonth.set(record.month, []);
        recordsByMonth.get(record.month).push(record);
      }

      const points = [];
      for (const month of months) {
        const monthIndex = monthToIndex(month);
        const monthRecords = recordsByMonth.get(month) || [];
        const measuredRecords = monthRecords
          .filter((r) => r.status === "value" && r.numericValue !== null)
          .sort((left, right) => left.numericValue - right.numericValue);

        if (measuredRecords.length === 0) {
          points.push({ x: monthIndex, y: null, month, record: null });
          continue;
        }
        const maxRecord = measuredRecords[measuredRecords.length - 1];
        points.push({ x: monthIndex, y: maxRecord.numericValue, month, record: maxRecord });
      }
      return points;
    }

    function buildChartDatasets() {
      return SITE_ORDER.map((siteId) => {
        const config = SITE_CONFIG[siteId];
        return {
          label: config.label,
          data: buildDatasetPoints(siteId),
          parsing: false,
          borderColor: config.color,
          backgroundColor: config.color,
          borderWidth: 1.4,
          pointRadius: 1.2,
          pointHoverRadius: 5,
          pointHitRadius: 8,
          showLine: true,
          spanGaps: false,
          tension: 0,
          segment: {
            borderColor(context) {
              const left = context.p0.raw;
              const right = context.p1.raw;
              if (!left || !right || left.y === null || right.y === null) return "rgba(0,0,0,0)";
              if ((right.x - left.x) > 1) return "rgba(0,0,0,0)";
              return config.color;
            }
          }
        };
      });
    }

    function calculateLogarithmicBounds() {
      const currentNuclide = nuclideSelect.value;
      const values = allRecords
        .filter((r) => r.nuclide === currentNuclide)
        .map((r) => r.numericValue)
        .filter((v) => v !== null && Number.isFinite(v) && v > 0);

      if (values.length === 0) return { minimum: 0.01, maximum: 100 };

      const smallest = Math.min(...values);
      const largest = Math.max(...values);
      let minimum = 10 ** Math.floor(Math.log10(smallest));
      let maximum = 10 ** Math.ceil(Math.log10(largest));

      if (maximum <= largest) maximum *= 10;
      minimum = Math.min(minimum, 0.01);
      if (!Number.isFinite(minimum) || minimum <= 0) minimum = 0.01;
      if (!Number.isFinite(maximum) || maximum <= minimum) maximum = minimum * 10000;

      return { minimum, maximum };
    }

    function isPowerOfTen(value) {
      if (!Number.isFinite(value) || value <= 0) return false;
      const logarithm = Math.log10(value);
      return Math.abs(logarithm - Math.round(logarithm)) < 1e-9;
    }

    function createChart() {
      const canvas = document.getElementById("falloutChart");
      if (!canvas) return;

      const datasets = buildChartDatasets();
      const logarithmicBounds = calculateLogarithmicBounds();
      const currentNuclide = nuclideSelect.value;

      fullXMinimum = monthToIndex(dataStartMonth);
      fullXMaximum = monthToIndex(dataEndMonth);
      fullYMinimum = logarithmicBounds.minimum;
      fullYMaximum = logarithmicBounds.maximum;

      if (falloutChart) {
        falloutChart.destroy();
        falloutChart = null;
      }

      const moveDateIndex = monthToIndex("1980-03");

      falloutChart = new Chart(canvas.getContext("2d"), {
        type: "line",
        data: { datasets },
        options: {
          responsive: true,
          maintainAspectRatio: false,
          animation: false,
          normalized: true,
          interaction: { mode: "nearest", intersect: false, axis: "xy" },
          scales: {
            x: {
              type: "linear",
              min: fullXMinimum,
              max: fullXMaximum,
              grid: { display: false },
              ticks: {
                maxTicksLimit: 14,
                callback(value) {
                  const month = indexToMonth(value);
                  return `${Number(month.slice(0, 4))}年`;
                }
              }
            },
            y: {
              type: "logarithmic",
              min: fullYMinimum,
              max: fullYMaximum,
              beginAtZero: false,
              title: {
                display: true,
                text: `${currentNuclide}（Bq/m²・月）`
              },
              ticks: {
                callback(value) {
                  const numericValue = Number(value);
                  if (!isPowerOfTen(numericValue)) return "";
                  return numericValue.toLocaleString("ja-JP");
                }
              }
            }
          },
          plugins: {
            legend: {
              display: true,
              position: "top",
              labels: { boxWidth: 15, boxHeight: 15, usePointStyle: true, pointStyle: "rectRounded", padding: 20, font: { size: 13, weight: "bold" } }
            },
            tooltip: {
              callbacks: {
                title(context) {
                  if (!context || context.length === 0) return "";
                  return displayMonth(context[0].raw.month);
                },
                label(context) {
                  const record = context.raw.record;
                  if (!record) return `${context.dataset.label}: データなし`;
                  return `${context.dataset.label}: ${formatValue(record.numericValue)} Bq/m²・月`;
                }
              }
            },
            zoom: {
              pan: { enabled: true, mode: "x" },
              zoom: { wheel: { enabled: true }, pinch: { enabled: true }, mode: "x" }
            },
            annotation: {
              annotations: {
                line1: {
                  type: 'line',
                  xMin: moveDateIndex,
                  xMax: moveDateIndex,
                  borderColor: 'rgba(80, 80, 80, 0.6)',
                  borderWidth: 2,
                  borderDash: [5, 5],
                  label: {
                    display: true,
                    content: '◀ 東京(中野区/高円寺) / つくば ▶ (1980年移転)',
                    position: 'start',
                    backgroundColor: 'rgba(255, 255, 255, 0.9)',
                    color: '#333',
                    font: { size: 11, weight: 'bold' },
                    padding: 4
                  }
                }
              }
            }
          }
        }
      });
    }

    function updateDiagnostics() {
      const currentNuclide = nuclideSelect.value;
      const filteredRecords = allRecords.filter(r => r.nuclide === currentNuclide);
      
      diagnosticsSummary.textContent = `全レコード数: ${filteredRecords.length}件 (${currentNuclide})`;
      diagnosticsBody.innerHTML = "";

      for (const siteId of SITE_ORDER) {
        const siteRecords = filteredRecords.filter((r) => r.site_id === siteId);
        const measured = siteRecords.filter((r) => r.status === "value");
        const nd = siteRecords.filter((r) => r.status === "nd");
        
        let firstMonth = "―";
        let lastMonth = "―";
        let maxValue = "―";

        if (siteRecords.length > 0) {
          const sortedMonths = [...new Set(siteRecords.map((r) => r.month))].sort();
          firstMonth = sortedMonths[0];
          lastMonth = sortedMonths[sortedMonths.length - 1];
        }

        if (measured.length > 0) {
          const max = Math.max(...measured.map((r) => r.numericValue).filter((v) => v !== null));
          maxValue = formatValue(max);
        }

        const tr = document.createElement("tr");
        tr.innerHTML = `
          <td>${SITE_CONFIG[siteId].label}</td>
          <td>${siteRecords.length}</td>
          <td>${measured.length}</td>
          <td>${nd.length}</td>
          <td>${firstMonth}</td>
          <td>${lastMonth}</td>
          <td>${maxValue}</td>
        `;
        diagnosticsBody.appendChild(tr);
      }
    }

    function resetView() {
      if (falloutChart) {
        falloutChart.resetZoom();
        falloutChart.options.scales.x.min = fullXMinimum;
        falloutChart.options.scales.x.max = fullXMaximum;
        falloutChart.update();
      }
    }

    function zoomToRecent() {
      if (falloutChart) {
        const recentStartMonth = "2011-03";
        let recentStartIndex = monthToIndex(recentStartMonth);
        if (recentStartIndex === null || recentStartIndex < fullXMinimum) {
          recentStartIndex = fullXMinimum;
        }
        falloutChart.options.scales.x.min = recentStartIndex;
        falloutChart.options.scales.x.max = fullXMaximum;
        falloutChart.update();
      }
    }

    async function initializeApp() {
      try {
        statusLine.textContent = "CSVデータを読み込んでいます...";
        statusLine.className = "status-line";
        
        allRecords = await loadCsvRecords();
        
        const allMonths = allRecords.map((r) => r.month).sort();
        dataStartMonth = allMonths[0];
        dataEndMonth = allMonths[allMonths.length - 1];

        periodLabel.textContent = `データ期間: ${displayMonth(dataStartMonth)} 〜 ${displayMonth(dataEndMonth)}`;
        
        createYearMonthSelectors();
        createChart();
        
        // ★初期表示時はズームさせない (falseを渡す)
        updateSelectedMonthCards(false);
        
        updateDiagnostics();

        statusLine.textContent = "";

        // ★ドロップダウン変更時はズームさせる (trueを渡す)
        yearSelect.addEventListener("change", () => updateSelectedMonthCards(true));
        monthSelect.addEventListener("change", () => updateSelectedMonthCards(true));
        
        resetViewButton.addEventListener("click", resetView);
        zoomViewButton.addEventListener("click", zoomToRecent);
        
        nuclideSelect.addEventListener("change", () => {
          createChart();
          // 核種切り替え時はズームさせない
          updateSelectedMonthCards(false);
          updateDiagnostics();
        });

      } catch (error) {
        console.error(error);
        statusLine.textContent = `エラー: ${error.message}`;
        statusLine.className = "status-line is-error";
        periodLabel.textContent = "データの読み込みに失敗しました";
      }
    }

    document.addEventListener("DOMContentLoaded", initializeApp);
  </script>
</body>
</html>










































<hr class="clearHidden">
































<hr class="custom-hr">







<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<p class="separator" style="clear: both; text-align: center;"><img src="https://minnanods.net/media/001/202505/marinari.png" alt="" width="23" height="23" class="aligncenter size-full " /><font size="5"><a href="#top">　トップへ戻る　</a></font><img src="https://minnanods.net/media/001/202505/marinari.png" alt="" width="23" height="23" class="aligncenter size-full " /></p>










































]]></description>
<category>日本の放射能汚染の現状</category>
<guid isPermaLink="true">https://minnanods.net/learn/contamination-level-of-japan/entry-1839.html</guid>
<pubDate>Sun, 13 Sep 2026 14:42:19 +0900</pubDate>
</item>
<item>
<dc:creator>みんなのデータサイト</dc:creator>
<title>【実施報告】原子力防災「放射線被ばく防護士」養成講座　第３期(2026年5月〜2026年7月）</title>
<link>https://minnanods.net/bougoshi/entry-1837.html</link>
<description><![CDATA[




<!-- テキスト -->

<h3 >講座の目的</h3>











































<!-- テキスト -->

<p>2011年の福島第一原発事故。あのとき多くの人々が、放射性物質とはなんなのか？単位の意味すらも理解していないひとが多かったと思います。大きな混乱のなか錯綜した情報が飛び交い、何が本当で何は嘘なのかを見分けられなかったかもしれません。災害時にどのように情報が伝達されるのか、されないのか、できないのか、といった混乱も目の当たりにしてきました。<br />
こうした経験をへて私たちは、「自ら知り・判断できる知識と経験を持つこと」がいざというとき被ばくを防ぐこと、命を守る力になると考えました。行政の発信をただ受け身で待つのではなく、自ら判断し、行動できる市民を育てる。<br />
それが、3.11を教訓として未来へ防災意識をつなげることになる。そんな思いから「放射線被ばく防護士」養成講座は始まりました。</p>










































<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<h3 >放射線被ばく防護士とは</h3>











































<!-- テキスト -->

<p>みんなのデータサイト独自の資格で、原子力災害時に放射線被ばくから自分や周囲の身を守ることができる総合的な知識を身につけることを目指しています。座学と実地研修双方を履修し、課題を提出し、試験に合格することで放射線被ばく防護士として認定されます。</p>










































<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<h3 >第３期の実施概要</h3>










































<hr class="clearHidden">



<!-- テーブル -->
<hr class="clearHidden">
<div class="column-table-">
  <div class="entry-container">
  <table class="table-">
<tr>
<td>区分</td>
<td>内容</td>
</tr>
<tr>
<td>事前基礎研修（オンライン）</td>
<td>2026年5月16、23日、6月13、20、27、7月4日</td>
</tr>
<tr>
<td>実地研修（宿泊型）</td>
<td>2026年6月6、7日</td>
</tr>
<tr>
<td>口頭試問</td>
<td>2026年7月11、18日</td>
</tr>
<tr>
<td>参加者数</td>
<td>16人（オンライン研修のみの参加者を含む）</td>
</tr>
<tr>
<td>参加者の地域分布</td>
<td>関東・中部・関西・北陸・東北</td>
</tr>
<tr>
<td>修了・認定者数</td>
<td>5人</td>
</tr>
</table>

  </div>
</div>






































<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<h3 >第３期の特徴</h3>











































<!-- テキスト -->

<p>これまでの１期・２期の参加者からのフィードバックを踏まえ、実地研修をオンライン研修の最中に配置し、前後をオンライン研修で挟むかたちにした。<br />
実地研修に行く前に最低限の放射線・放射能の基礎知識や機器の操作方法等を学び、実地研修で見聞きして自分ごととなったのちに、オンライン研修のみの参加者の皆さんへの報告と、理論的な話や法体系等を学ぶことでモチベーション高く、より深く知識を身につけることを目指した。</p>










































<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<h2 >浪江町津島地区 </h2>











































<!-- テキスト -->

<p>今回も、津島活性化センターで今野秀則さん・今野邦彦さんとお会いして、津島の状況、裁判のこと、今のお気持ちなど貴重なお話を、資料も用意していただいてたくさん伺いました。ありがとうございました。 <br />
<br />
その後、秀則さん・邦彦さんもご一緒いただき防護服を着てスクリーニングセンター経由で帰還困難区域へ入りました。無念にも解体された邦彦さんのご自宅跡地。先祖代々の家を解体する時は必ず連絡してほしいとお願いしていたのに、解体に立ち会えなかった無念。門には立ち入り禁止のゲートがありますが、その横は何もなくて低い段差を乗り越えれば簡単に敷地内に入れる不思議。今でもきちんと草刈りをされていて土地への愛着を感じました。 <br />
<br />
解体をしないと決めた秀則さんの松本屋旅館の前では、集合写真を撮りました。　どんな判断をするにもすごく苦しい・・・。お二人のお話を伺うにつけ、このような苦悩をしなくてはいけない状況そのものも、被害であると強く思います。</p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/715811829_10243350818048230_414128213015515612_n.jpg?v=20260831114825" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-715811829_10243350818048230_414128213015515612_n.jpg?v=20260831114825"
 alt="">
</a>


</div>






















<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/717048224_10243350876209684_7020864775834468638_n.jpg?v=20260831114923" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-717048224_10243350876209684_7020864775834468638_n.jpg?v=20260831114923"
 alt="">
</a>


</div>























<!-- テキスト -->

<p>今回新たに伺ったお話では、元JAがあったところに「世界初のベニザケの陸上養殖場」を建設予定とのこと。<br />
帰還困難区域の山の中に人工海水魚の養殖場？と、みんなびっくり。<br />
これもイノベーションコースト構想の一環だそうです</p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/720329583_3387445338094494_2274408412341477473_n.jpg?v=20260831115230" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-720329583_3387445338094494_2274408412341477473_n.jpg?v=20260831115230"
 alt="">
</a>


</div>























<!-- テキスト -->

<p>また、私たちが訪れた次の週（6/13, 14）は、「ツール・ド・ふくしま」という自転車ロードレースが開催される予定でした。<br />
<br />
驚くことに、この津島エリアもそのコースに組み込まれており、通行止めになるという看板を道中で何回も時折目にしました。<br />
<br />
2023年から開催しているこのレースの大会公式サイトには、「沿岸部に新しく生まれた道でペダルを漕ぎ、避難が解除されたばかりの帰宅困難区域を駆け抜け、浜風を感じながら福島復興の今を感じてもらいたい。そして、復興に向けて歩みを進める福島の現在の姿を国内外に発信してもらいたい」とのメッセージがありました。<br />
帰還困難区域の放射能汚染に対する注意喚起等はまったくみあたりませんでした。</p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/720920225_3387444518094576_6515938450710868556_n.jpg?v=20260831120941" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-720920225_3387444518094576_6515938450710868556_n.jpg?v=20260831120941"
 alt="">
</a>


</div>






















<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/717016441_10243350878929752_9119558611445111338_n.jpg?v=20260831115726" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-717016441_10243350878929752_9119558611445111338_n.jpg?v=20260831115726"
 alt="">
</a>


</div>























<!-- テキスト -->

<p>防護服に身を包み、測定実習。<br />
足カバーはバスに乗降するたびに新しいものに付け替えます。<br />
<br />
見学と実習が終わり、スクリーニングセンターでバスや、靴の裏の汚染を汚染計でチェック。<br />
防護服を自分を汚染させないように脱ぎ、代表の人がつけていたガラスバッジから、滞在中の累積被曝量を確認してもらいます。</p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/717994434_10243350877089706_1055272652176385032_n.jpg?v=20260831120734" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-717994434_10243350877089706_1055272652176385032_n.jpg?v=20260831120734"
 alt="">
</a>


</div>






















<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/721089341_3387445438094484_5283931704906305731_n.jpg?v=20260831120144" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-721089341_3387445438094484_5283931704906305731_n.jpg?v=20260831120144"
 alt="">
</a>


</div>






















<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<h2 >宿泊と交流 </h2>











































<!-- テキスト -->

<p>今回も小高の双葉屋旅館さんにお世話になりました。美味しい晩ごはんを囲みながらの交流会は、おれたちの伝承館の中筋純さんも飛び入り参加。<br />
女将の小林友子さん、いつもありがとうございます！ <br />
また、参加者同士で　常時からの空間モニタリングの全国的なネットワークができたらいいね、などのアイデアも出て、これから　検討していけたらと考えています。</p>










































<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<h2 >おれたちの伝承館 </h2>











































<!-- テキスト -->

<p>２日目の朝、旅館前で記念撮影後、歩いて5分ほどの「おれたちの伝承館」へ。おれ伝アーティストの前川加奈さんは今回この研修に参加してくださったため、ご本人に作品についてのお話を聞くこともできました。<br />
その他、これからいく浪江町のストリートビュー写真（7メートル長の町並みを写した写真）を見せてもらったり、１つ１つの作品をじっくりみたりと時間を過ごしました。 </p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/717016425_10243350939611269_72786148357851075_n.jpg?v=20260831115520" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-717016425_10243350939611269_72786148357851075_n.jpg?v=20260831115520"
 alt="">
</a>


</div>























<!-- テキスト -->

<p>同じ敷地内になる市民放射能測定室「とどけ鳥」の見学もさせていただきました。あいにく所長の白髭さんはご不在のタイミングでしたが、食品の測定に使用する測定器や測定結果などを今野寿美雄さんに見せていただきました。 <br />
<br />
　特にこの近くで取れたという野生のキノコは空間線量計を近づけるだけでも反応するほど汚染が高いものがあり、皆さん驚きました。 <br />
<br />
　お庭にあるアート作品には、福島原発を指す巨大な矢印や、広島・長崎・ビキニ・チェルノブイリ等過去の核被害との接続を試みる作品もあります。おれたちの伝承館は、作品数が多くまた１つ１つの作品にじっくり触れていただきたいので、機会がありましたらぜひ実際に足を運んでいただけたらと思います。 </p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/717115865_10243350937331212_1245727616048236435_n.jpg?v=20260831115928" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-717115865_10243350937331212_1245727616048236435_n.jpg?v=20260831115928"
 alt="">
</a>


</div>






















<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<h2 >イノベーションコースト構想の海沿いへ </h2>











































<!-- テキスト -->

<p>海沿いへ、そして南下していきます。津波で建物も田んぼも流されて人が住んでいない閑散とした南相馬市から浪江町に入るその境界線から、いきなり様相が変わり近未来的な施設が現れてきます。水素エネルギーフィールド、太陽光発電パネル、集成材加工工場（大阪万博でも使われたらしい）の見える丘で寿美雄さんに解説してもらいました。 <br />
<br />
近隣には、ドローン実験場（飛行場のような滑走路）もあります。ドローンというと小型のおもちゃのようなものをつい想像しますが、実際には人が乗れるほどのサイズの飛行機みたいなものもあるそうです。またロケットを飛ばす実験場とか、シャインコーストファームというIT牧場（ほとんど人手をかけずに乳牛を大量に飼育・搾乳する施設）も建設中だそうです。 <br />
</p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/716610651_10243350963571868_1704448728504069392_n.jpg?v=20260831115554" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-716610651_10243350963571868_1704448728504069392_n.jpg?v=20260831115554"
 alt="">
</a>


</div>






















<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<h2 >震災遺構請戸小学校</h2>











































<!-- テキスト -->

<p>震災の記憶がどんどん薄れ、また建物も壊されてなくなっていく中、この請戸小学校はますます貴重な場所になってきているように感じます。<br />
<br />
壊れた校舎などを目の当たりにして津波の恐ろしいまでの威力を再認識できることに加え、２階の展示室では、震災前後の町を俯瞰した写真や、津波後の救助が困難を極めた話、そして原発事故により立ち入りができなくなったことで救助を諦めざるを得なくなったことなど、当時の状況が図や写真も使ってしっかりと説明されているからです。<br />
なかなかゆっくりと時間を取れず駆け足になってしまうのが残念なのですが、改めて訪れていただけたらと思います。<br />
<br />
それにしてもこの震災遺構の真隣に市民の憩いの場となる「パークゴルフ場」なるものが作られつつあり、これもまた驚きました。 </p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/716841504_10243350965611919_2072072444986264124_n.jpg?v=20260831115633" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-716841504_10243350965611919_2072072444986264124_n.jpg?v=20260831115633"
 alt="">
</a>


</div>






















<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<h2 >新しく完成した福島県復興祈念公園へ </h2>











































<!-- テキスト -->

<p>全体としてはとても広い敷地で、全部を見て回ることはできないので、この日は寿美雄さんおすすめの１ヶ所だけを見学しました。その場所は、道路のセンターラインが大きくずれている場所です。地震の断層かと思われましたが、津波の引き波でずれたようです。左下の写真で黄色いセンターラインが１車線分大きくずれているのがわかります（ずれた亀裂に草が生えています）。下右の写真の遠く丘の上に見える「国営 追悼・祈念施設」へは伝承館から橋を渡って歩いていくことができるそう。丘の向こう側に伝承館があります。 </p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/719032888_10243350963411864_6901080180794537265_n.jpg?v=20260831120035" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-719032888_10243350963411864_6901080180794537265_n.jpg?v=20260831120035"
 alt="">
</a>


</div>






















<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/719772232_3387459331426428_706673915748779237_n.jpg?v=20260831120008" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-719772232_3387459331426428_706673915748779237_n.jpg?v=20260831120008"
 alt="">
</a>


</div>






















<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<h2 >東日本大震災・原子力災害伝承館</h2>











































<!-- テキスト -->

<p>昼食にB級グルメのなみえ焼きそば（800円に値上げですが、ボリュームあり！お肉も厚いまま）をいただいた後は、東日本大震災原子力災害伝承館へ。今野寿美雄さんの解説付きなので、見落としてしまいそうなところをしっかり見られるのもよかったです。個人的には原発が市民にとってどれだけ「夢」であり東京電力の影響が大きかったのかに注目しました。習字が「原子力の利用」という標語だったり。次のページ右上の写真は最後の方、最先端のロボット技術で未来の安心をアピール？　「この伝承館自体がイノベーションコースト構想の一部なんだよ」という寿美雄さんの指摘がありました。なるほど確かにホームーページを検索してみれば、イノベーションコースト構想の文字がありました。 <br />
</p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/717169126_10243352531771072_833812397422605631_n.jpg?v=20260831120704" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-717169126_10243352531771072_833812397422605631_n.jpg?v=20260831120704"
 alt="">
</a>


</div>






















<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/716922571_10243352537451214_4859117236212765713_n.jpg?v=20260831121452" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-716922571_10243352537451214_4859117236212765713_n.jpg?v=20260831121452"
 alt="">
</a>


</div>






















<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<h2 >浪江駅前〜谷津田ソーラー発電所 </h2>











































<!-- テキスト -->

<p>浪江駅前は、壮大な駅および周辺の再開発事業という名の工事が進行中。駅周辺はだいぶ工事が進んでいて、駅前や駅舎も風前の灯といった感じ。隈研吾などが手がける、大変お金のかかった立派な駅になるようです。 <br />
<br />
そんな工事中の駅を通り、谷津田ソーラー発電所へ。　バスの両側見渡す限りソーラーパネルの波・波・なみ・・・　みんなため息。　これもまた東京へ送られる電気。放射線量が高いため、営農を断念するしかなく、ひたすらソーラーパネルの波。一部お墓のところだけは残っていました。 <br />
</p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/719492545_3387462391426122_7876269063774697446_n.jpg?v=20260831121311" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-719492545_3387462391426122_7876269063774697446_n.jpg?v=20260831121311"
 alt="">
</a>


</div>






















<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<h2 >大堀地区（特定再生復興拠点区域内） 陶芸の杜　おおぼり </h2>











































<!-- テキスト -->

<p>この日ちょうど、「大せとまつり」が開かれていました。各窯元による出展販売と　飲食の屋台です。 <br />
<br />
立ち寄ったのがすでに午後だったので、ほぼ屋台は終わっていて、陶器販売はまだやっていた感じでした。<br />
駐車場に車を停めてこの場所を訪れ、談笑したり陶器をみたりしているお客さんたちがいます。<br />
しかしこの敷地は端っこの方に行くとかなり線量が高く、このような場所でイベントをやっていることに驚きました。 <br />
<br />
私たちが訪れるのはせいぜい年に数回。　<br />
しかしそれ以外の日常も、放射性物質が未だ残っているホットスポットで、このようなお祭りや地域活動が　盛んに行われて「復興」が演出されているのではないか、そこを訪れる人たちや、その活動に関わる住民たちも、実際の汚染の実情を知らずに　活動をしているのではないかと心配になりました。<br />
</p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/716962569_10243352538371237_2165335339264321219_n.jpg?v=20260831121556" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-716962569_10243352538371237_2165335339264321219_n.jpg?v=20260831121556"
 alt="">
</a>


</div>























<!-- テキスト -->

<p>事故前からあったのかな？　建物の外壁にあった、かつての窯の数々を示す、焼き物で作られたタイルの地図。<br />
地元の土と地元の釉薬をつかって焼き物を何代もにわたって作り続けてこられていた方がたくさんいたのに、原発事故はそれらを全て奪ってしまいました。<br />
<br />
今、別の場所で再開をしたり、あるいは、戻ってこようという方も少しいらっしゃるそうですが・・・。</p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/718131967_10243352532971102_2716903358504126002_n.jpg?v=20260831121930" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-718131967_10243352532971102_2716903358504126002_n.jpg?v=20260831121930"
 alt="">
</a>


</div>























<!-- テキスト -->

<h2 >震災遺構ギャラリー「松永陶芸館」 </h2>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/718390528_10243352538571242_3962326618585015215_n.jpg?v=20260831121857" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-718390528_10243352538571242_3962326618585015215_n.jpg?v=20260831121857"
 alt="">
</a>


</div>






















<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/720032985_3387462534759441_2602975233444590583_n.jpg?v=20260831121431" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-720032985_3387462534759441_2602975233444590583_n.jpg?v=20260831121431"
 alt="">
</a>


</div>






















<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/717006711_10243352540411288_617616253439932607_n.jpg?v=20260831121514" data-rel="SmartPhoto[1837]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-717006711_10243352540411288_617616253439932607_n.jpg?v=20260831121514"
 alt="">
</a>


</div>























<!-- テキスト -->

<p>ここは震災遺構として入れるのですが（要予約）、無人で、防犯カメラがついています。一応除染をしてあることが案内に記載されていますが、案内の最後に個人の被ばく線量の目安があり、大体１時間あたりの空間線量が0.4〜0.5マイクロシーベルト程度でした。決してそこに住める値ではありませんが、30分くらいチラっと見るにはしょうがないかなという感じか。この感覚は個人差が大きいと思います。絶対近寄りたくない人もいますよね。入りたい人はシューズカバーなどをつけて入りました。地震の時のままの時が止まった店内という感じでした。 <br />
<br />
津島の活性化センターなどは相当除染されて線量が低いのと比べると、同じ復興再生拠点区域内でも全体的に汚染が高い感じがしました。 <br />
<br />
この大堀地区は、経産省の助成金がたくさん出て、若いアーティストなどによるワークショップが行われるなどしていると聞いたことがあって気になっていたエリアでした。<br />
やっぱり汚染が相当高いです。<br />
このような環境で、若者が滞在してアートを作ったり発表したり、そこへ人々が集う構図は、とんでもない事業だと思いました。 <br />
目に見えない放射能の危険性をしっかり伝えない行政の作為的な方針に、人権軽視の恐怖を覚えます。<br />
<br />
このように、かなりの駆け足でしたが１泊２日の研修旅行が終わりました。<br />
道中、空間線量をチェックして記録し、その数値をあとから計算して被ばく線量を推計する課題をこなしながらの研修でした。</p>










































]]></description>
<category>原子力防災講座</category>
<guid isPermaLink="true">https://minnanods.net/bougoshi/entry-1837.html</guid>
<pubDate>Mon, 31 Aug 2026 12:23:47 +0900</pubDate>
</item>
<item>
<dc:creator>みんなのデータサイト</dc:creator>
<title>第２期のテキストを無償公開します</title>
<link>https://minnanods.net/bougoshi/entry-1838.html</link>
<description><![CDATA[




<!-- テキスト -->

<p><a href="https://www.dropbox.com/scl/fi/cly0ez9xvsdgv8q17zw4o/2.pdf?rlkey=jcb6ajrmhlvrwqay24uzss117&amp;st=74mfnyqv&amp;dl=0" target="_blank" rel="noopener noreferrer">こちらからPDFをダウンロードしていただけます。</a></p>










































]]></description>
<category>原子力防災講座</category>
<guid isPermaLink="true">https://minnanods.net/bougoshi/entry-1838.html</guid>
<pubDate>Fri, 28 Aug 2026 13:49:51 +0900</pubDate>
</item>
<item>
<dc:creator>みんなのデータサイト</dc:creator>
<title>これまでの学習会・講演会等の録画</title>
<link>https://minnanods.net/archive/entry-1835.html</link>
<description><![CDATA[


















<!-- Video -->
<div class="column-video-auto js_notStyle acms-col-sm-12">
<div class="column-iframe acms-placeholder-movie">
<iframe width="858" height="482" src="https://www.youtube.com/embed/6KD2vekxnwM?wmode=transparent&rel=0" frameborder="0" allowfullscreen></iframe>
</div>
</div>


























<hr class="clearHidden">
































<hr class="custom-hr">







<hr class="clearHidden">















<!-- Video -->
<div class="column-video-auto js_notStyle acms-col-sm-12">
<div class="column-iframe acms-placeholder-movie">
<iframe width="858" height="482" src="https://www.youtube.com/embed/rk6afQlbJhI?wmode=transparent&rel=0" frameborder="0" allowfullscreen></iframe>
</div>
</div>


























<hr class="clearHidden">
































<hr class="custom-hr">







<hr class="clearHidden">















<!-- Video -->
<div class="column-video-auto js_notStyle acms-col-sm-12">
<div class="column-iframe acms-placeholder-movie">
<iframe width="858" height="482" src="https://www.youtube.com/embed/RU1Mu18ensk?wmode=transparent&rel=0" frameborder="0" allowfullscreen></iframe>
</div>
</div>


























<hr class="clearHidden">
































<hr class="custom-hr">







<hr class="clearHidden">















<!-- Video -->
<div class="column-video-auto js_notStyle acms-col-sm-12">
<div class="column-iframe acms-placeholder-movie">
<iframe width="858" height="482" src="https://www.youtube.com/embed/GfHnj-S2r58?wmode=transparent&rel=0" frameborder="0" allowfullscreen></iframe>
</div>
</div>


























<hr class="clearHidden">
































<hr class="custom-hr">







<hr class="clearHidden">















<!-- Video -->
<div class="column-video-auto js_notStyle acms-col-sm-12">
<div class="column-iframe acms-placeholder-movie">
<iframe width="858" height="482" src="https://www.youtube.com/embed/vqRsJ5hBakw?wmode=transparent&rel=0" frameborder="0" allowfullscreen></iframe>
</div>
</div>


























<hr class="clearHidden">
































<hr class="custom-hr">







<hr class="clearHidden">















<!-- Video -->
<div class="column-video-auto js_notStyle acms-col-sm-12">
<div class="column-iframe acms-placeholder-movie">
<iframe width="858" height="482" src="https://www.youtube.com/embed/emfAOnxa2RA?wmode=transparent&rel=0" frameborder="0" allowfullscreen></iframe>
</div>
</div>


























<hr class="clearHidden">
































<hr class="custom-hr">







<hr class="clearHidden">















<!-- Video -->
<div class="column-video-auto js_notStyle acms-col-sm-12">
<div class="column-iframe acms-placeholder-movie">
<iframe width="858" height="482" src="https://www.youtube.com/embed/MeBqVkHnl4M?wmode=transparent&rel=0" frameborder="0" allowfullscreen></iframe>
</div>
</div>


























<hr class="clearHidden">
































<hr class="custom-hr">







]]></description>
<category>録画をみる</category>
<guid isPermaLink="true">https://minnanods.net/archive/entry-1835.html</guid>
<pubDate>Fri, 28 Aug 2026 13:14:00 +0900</pubDate>
</item>
<item>
<dc:creator>みんなのデータサイト</dc:creator>
<title>ハウスダストプロジェクトの参加者募集中</title>
<link>https://minnanods.net/housedust/entry-1833.html</link>
<description><![CDATA[




<!-- テキスト -->

<p>みんなのデータサイトでは、ご自宅などの掃除機のゴミの測定による　放射能環境調査を実施しています。<br />
測定料は無料です！　ぜひあなたも　ご自宅のゴミを集めて測ってみませんか？</p>











































<!-- テキスト -->

<h2 >なぜ掃除機のゴミの測定を呼びかけるのか</h2>











































<!-- テキスト -->

<p>福島第一原発事故で放出された放射能で汚染された地域に帰還する方、移住された方、住み続けておられる方、時々訪問される方などにとって、もっとも警戒しなければならない核種はセシウム-137 です。その半減期は 30年なので、事故直後と比べて、まだ 73%(2024年10月時点)が残留しているのです。これから 16 年後の 2041 年になっても、まだ 50%が残留しています。<br />
このセシウム-137 は、土埃や未除染の森林から運ばれてくる落ち葉や花粉などに付着して、家の中に入ってきます。それを吸い込んだり、飲食の時に摂取したりすれば、体内被曝の原因になります。もちろん外部被ばくの原因にもなります。とりわけ小さなお子さんがいる家庭では、セシウム-137 に対する警戒が必要です。<br />
<br />
生活空間に侵入したセシウム-137 を検知する最も手軽な方法は、掃除機ゴミ(ハウスダスト)の測定です。年間数回測定すれば、ライフスタイルや生活習慣を見直す指針を得ることが出来ます。全国 26 カ所の市⺠放射能測定室のネットワークである「みんなのデータサイト」では、ハウスダスト無料測定を始めました。</p>











































<!-- テキスト -->

<h2 >掃除機ゴミの集め方</h2>











































<!-- テキスト -->

<p>掃除機が紙パック式の場合は、掃除機から取り外した紙パックをビニール袋等で密封した後に梱包して送ってください。また、紙パックの無いサイクロン式掃除機の場合は、クリアビン内のゴミをビニール袋等に集めて、お送りください。<br />
いずれも、ゴミの容量（紙パックや密封用ビニール袋を除く）で100グラム程度あると詳しく測定ができます。<br />
環境によりますが、数ヶ月はあつめるのにかかると思います。<br />
<br />
集め終わった日付はみなさんお分かりになるのですが、集め始めの日付が不明な方が多いです。<br />
収集期間が正確にわかるとよりよいので、あらかじめゴミパックをセットする時に、ゴミパックの段ボール部分や、サイクロン式の収集用ビニール袋に開始日付と空のときの重さを記載しておくと大変便利です。<br />
<br />
検体送付時には、必ず下記にある「ハウスダスト呼びかけチラシ」PDFの2ページ目にある採取記録表にご記入・同封の上、下記住所宛てにお送りください。<br />
<br />
<strong>●測定試料送付先●<br />
〒467-0058 愛知県名古屋市瑞穂区関取町 146<br />
未来につなげる・東海ネット 市⺠放射能測定センター(C-ラボ)<br />
TEL: 052-836-3116</strong><br />
<br />
＊当方に送付する際の送料についてはご負担いただくようお願いします。<br />
<br />
厚さ3cm以内であればレターパックライト(430 円)または、厚さ制限 のないレターパックプラス(600 円)に押し込んで送ることが出来ます。<br />
測定結果は、採取記録表にご記入いただいたメールアドレス宛にお知らせします。<br />
</p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="/media-download/587/d8a4f53704189266/PDF/" target="_blank">
<img class="column-media-pdf-image" src="/media/001/202608/e61ff29942292002.jpg" alt="">

</a>


</div>






















<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="/media-download/588/9649a3c0ce0c02f9/DOCX/" target="_blank">
<img class="columnIcon" src="https://minnanods.net/themes/system/images/fileicon/docx.svg" alt="" width="70" height="81">

</a>


</div>























<!-- テキスト -->

<h2 >2026年8月に行った、ハウスダストプロジェクト説明会のアーカイブ</h2>











































<!-- テキスト -->

<p>プロジェクトの意義や、これまでの約3年間で集まった先行測定の５０検体の測定結果等ご覧いただけます。</p>










































<hr class="clearHidden">















<!-- Video -->
<div class="column-video-auto js_notStyle acms-col-sm-12">
<div class="column-iframe acms-placeholder-movie">
<iframe width="858" height="482" src="https://www.youtube.com/embed/6KD2vekxnwM?wmode=transparent&rel=0" frameborder="0" allowfullscreen></iframe>
</div>
</div>


























<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<p>このプロジェクトのお問い合わせ先<br />
〒960-0201 福島県福島市飯坂町字一本松 11-7<br />
NPO 法人みんなのデータサイト<br />
TEL: 024-573-5761<br />
FAX: 024-573-5698<br />
メールアドレス:　minnanods@gmail.com</p>











































<!-- テキスト -->

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">

  <meta
    name="viewport"
    content="width=device-width, initial-scale=1.0"
  >

  <title>
    月間降下物量（セシウム137）長期推移
  </title>

  <!--
    CSV解析
  -->
  <script
    src="https://cdn.jsdelivr.net/npm/papaparse@5.4.1/papaparse.min.js"
  ></script>

  <!--
    Chart.js
  -->
  <script
    src="https://cdn.jsdelivr.net/npm/chart.js@4.4.7/dist/chart.umd.min.js"
  ></script>

  <!--
    ピンチ操作用
  -->
  <script
    src="https://cdn.jsdelivr.net/npm/hammerjs@2.0.8/hammer.min.js"
  ></script>

  <!--
    Chart.js Zoom Plugin
  -->
  <script
    src="https://cdn.jsdelivr.net/npm/chartjs-plugin-zoom@2.2.0/dist/chartjs-plugin-zoom.min.js"
  ></script>

  <style>
    :root {
      --header-green: #79bc00;
      --header-green-dark: #69a900;

      --okuma-color: #df2735;
      --fukushima-color: #16a34a;
      --tokyo-color: #2c63e6;

      --text-color: #16243a;
      --sub-text-color: #667085;

      --border-color: #d9e2ec;
      --panel-background: #ffffff;
      --soft-background: #f7f9fc;

      --button-border: #cbd6e2;
      --button-hover: #f0f5fa;

      --shadow:
        0 1px 2px rgba(16, 24, 40, 0.04);
    }

    * {
      box-sizing: border-box;
    }

    html {
      font-family:
        -apple-system,
        BlinkMacSystemFont,
        "Segoe UI",
        "Yu Gothic UI",
        "Yu Gothic",
        Meiryo,
        sans-serif;

      color: var(--text-color);
      background: #ffffff;
    }

    body {
      margin: 0;
      padding: 0;
      background: #ffffff;
    }

    button,
    select {
      font: inherit;
    }

    .page {
      width: min(1200px, 100%);
      margin: 0 auto;
      padding: 18px;
    }

    /* =====================================================
       ヘッダー
       ===================================================== */

    .hero {
      position: relative;

      overflow: hidden;

      padding: 20px 22px 17px;

      color: #ffffff;

      background:
        linear-gradient(
          135deg,
          var(--header-green),
          var(--header-green-dark)
        );

      border-radius: 8px;
    }

    .hero::before {
      content: "";

      position: absolute;
      top: 15px;
      left: 17px;

      width: 18px;
      height: 48px;

      border-radius: 9px;

      background: rgba(255, 255, 255, 0.07);
    }

    .hero-title {
      position: relative;

      margin: 0;
      padding-left: 22px;

      font-size: clamp(18px, 3vw, 25px);
      line-height: 1.4;
      font-weight: 700;
    }

    .hero-divider {
      position: relative;

      height: 4px;
      margin: 8px 0 7px 22px;

      background: rgba(255, 255, 255, 0.06);
    }

    .hero-subtitle {
      position: relative;

      margin: 0;
      padding-left: 0;

      font-size: 12px;
      font-weight: 600;
    }

    /* =====================================================
       操作領域
       ===================================================== */

    .controls {
      display: flex;
      flex-wrap: wrap;
      align-items: end;
      gap: 9px;

      margin: 14px 0 7px;
    }

    .control-group {
      display: flex;
      align-items: center;
      gap: 6px;
    }

    .control-label {
      font-size: 14px;
      font-weight: 700;
      color: #344054;
    }

    select {
      min-width: 88px;
      height: 40px;

      padding: 0 34px 0 12px;

      color: #243248;
      font-weight: 600;

      background: #ffffff;

      border: 1px solid var(--button-border);
      border-radius: 6px;

      cursor: pointer;
    }

    select:focus {
      outline: 2px solid rgba(121, 188, 0, 0.3);
      border-color: var(--header-green);
    }

    .action-button {
      min-height: 40px;
      padding: 8px 14px;

      color: #263750;
      font-weight: 700;

      background: #ffffff;

      border: 1px solid var(--button-border);
      border-radius: 6px;

      cursor: pointer;

      transition:
        background-color 0.15s ease,
        border-color 0.15s ease,
        transform 0.05s ease;
    }

    .action-button:hover {
      background: var(--button-hover);
      border-color: #aebdcd;
    }

    .action-button:active {
      transform: translateY(1px);
    }

    .status-line {
      min-height: 22px;
      margin: 7px 0;

      color: var(--sub-text-color);
      font-size: 12px;
    }

    .status-line.is-error {
      color: #b42318;
      font-weight: 700;
    }

    /* =====================================================
       選択年月
       ===================================================== */

    .selected-month-title {
      margin: 8px 0 10px;

      text-align: center;

      font-size: 20px;
      line-height: 1.4;
      font-weight: 700;
    }

    /* =====================================================
       地点カード
       ===================================================== */

    .site-cards {
      display: grid;
      grid-template-columns: repeat(3, minmax(0, 1fr));
      gap: 12px;

      margin-bottom: 15px;
    }

    .site-card {
      min-height: 137px;
      padding: 15px 16px 14px;

      background: var(--panel-background);

      border: 1px solid var(--border-color);
      border-top-width: 4px;
      border-radius: 8px;

      box-shadow: var(--shadow);
    }

    .site-card.okuma {
      border-top-color: var(--okuma-color);
    }

    .site-card.fukushima {
      border-top-color: var(--fukushima-color);
    }

    .site-card.tokyo {
      border-top-color: var(--tokyo-color);
    }

    .site-name {
      margin: 0 0 5px;

      font-size: 16px;
      font-weight: 700;
    }

    .site-source {
      min-height: 18px;
      margin: 0 0 7px;

      overflow-wrap: anywhere;

      color: var(--sub-text-color);
      font-size: 11px;
      line-height: 1.45;
    }

    .site-value {
      margin: 0 0 4px;

      overflow-wrap: anywhere;

      color: #101828;
      font-size: clamp(20px, 2.4vw, 26px);
      line-height: 1.25;
      font-weight: 750;
    }

    .site-description {
      margin: 0;

      color: #53647b;
      font-size: 11px;
      line-height: 1.45;
    }

    /* =====================================================
       グラフ領域
       ===================================================== */

    .chart-panel {
      padding: 15px 14px 10px;

      background: var(--panel-background);

      border: 1px solid var(--border-color);
      border-radius: 8px;

      box-shadow: var(--shadow);
    }

    .chart-container {
      position: relative;

      width: 100%;
      height: 520px;
    }

    .chart-help {
      margin: 10px 0 1px;

      color: #718096;
      font-size: 11px;
      text-align: center;
    }

    .chart-help strong {
      color: #4b78b8;
    }

    /* =====================================================
       データの扱い
       ===================================================== */

    .notes {
      margin-top: 16px;
      padding: 17px 18px;

      background: var(--soft-background);

      border-radius: 8px;
    }

    .notes-title {
      display: flex;
      align-items: center;
      gap: 8px;

      margin: 0 0 9px;

      font-size: 15px;
    }

    .notes-mark {
      display: inline-block;

      width: 22px;
      height: 22px;

      border-radius: 50%;

      background:
        linear-gradient(
          135deg,
          #c5df72 0 47%,
          #8fbd24 48% 100%
        );
    }

    .notes ul {
      margin: 0;
      padding-left: 21px;

      color: #4a5d77;
      font-size: 13px;
      line-height: 1.8;
    }

    /* =====================================================
       デバッグ情報
       ===================================================== */

    .diagnostics {
      margin-top: 14px;

      border: 1px solid var(--border-color);
      border-radius: 8px;
    }

    .diagnostics summary {
      padding: 12px 14px;

      font-size: 13px;
      font-weight: 700;

      cursor: pointer;
    }

    .diagnostics-content {
      padding: 0 14px 14px;

      color: #475467;
      font-size: 12px;
      line-height: 1.6;
    }

    .diagnostics-table-wrapper {
      overflow-x: auto;
    }

    .diagnostics table {
      width: 100%;
      border-collapse: collapse;
    }

    .diagnostics th,
    .diagnostics td {
      padding: 7px 8px;

      text-align: left;
      white-space: nowrap;

      border-bottom: 1px solid #e8edf3;
    }

    .diagnostics th {
      background: #f7f9fc;
    }

    /* =====================================================
       レスポンシブ対応
       ===================================================== */

    @media (max-width: 760px) {
      .page {
        padding: 10px;
      }

      .hero {
        padding: 17px 15px 15px;
      }

      .site-cards {
        grid-template-columns: 1fr;
      }

      .site-card {
        min-height: 0;
      }

      .chart-container {
        height: 430px;
      }

      .controls {
        align-items: stretch;
      }

      .control-group {
        flex: 1 1 auto;
      }

      select {
        flex: 1;
      }

      .action-button {
        flex: 1 1 auto;
      }
    }

    @media (max-width: 450px) {
      .chart-container {
        height: 380px;
      }

      .controls {
        display: grid;
        grid-template-columns: 1fr 1fr;
      }

      .action-button {
        width: 100%;
      }
    }
  </style>
<meta name="csrf-token" content="f4bf7985e90d336d4099838689a48da3cff51b8b56629966153a48313badeafd"></head>

<body>
  <main class="page">
    <header class="hero">
      <h1 class="hero-title">
        月間降下物量（セシウム137）長期推移
      </h1>

      <div class="hero-divider"></div>

      <p
        id="periodLabel"
        class="hero-subtitle"
      >
        CSVを読み込んでいます
      </p>
    </header>

    <section
      class="controls"
      aria-label="表示年月とグラフ操作"
    >
      <div class="control-group">
        <label
          class="control-label"
          for="yearSelect"
        >
          年
        </label>

        <select
          id="yearSelect"
          aria-label="表示する年"
        ></select>
      </div>

      <div class="control-group">
        <label
          class="control-label"
          for="monthSelect"
        >
          月
        </label>

        <select
          id="monthSelect"
          aria-label="表示する月"
        ></select>
      </div>

      <button
        id="resetViewButton"
        class="action-button"
        type="button"
      >
        ↻ 全体表示
      </button>

      <button
        id="zoomViewButton"
        class="action-button"
        type="button"
      >
        ⛶ 拡大表示
      </button>
    </section>

    <div
      id="statusLine"
      class="status-line"
      aria-live="polite"
    ></div>

    <h2
      id="selectedMonthTitle"
      class="selected-month-title"
    >
      ―
    </h2>

    <section
      class="site-cards"
      aria-label="選択年月の地点別測定結果"
    >
      <article
        id="card-okuma"
        class="site-card okuma"
      >
        <h3 class="site-name">
          大熊町
        </h3>

        <p
          id="source-okuma"
          class="site-source"
        >
          採取：―
        </p>

        <p
          id="value-okuma"
          class="site-value"
        >
          ―
        </p>

        <p
          id="description-okuma"
          class="site-description"
        >
          CSVを読み込んでいます
        </p>
      </article>

      <article
        id="card-fukushima"
        class="site-card fukushima"
      >
        <h3 class="site-name">
          福島市
        </h3>

        <p
          id="source-fukushima"
          class="site-source"
        >
          採取：―
        </p>

        <p
          id="value-fukushima"
          class="site-value"
        >
          ―
        </p>

        <p
          id="description-fukushima"
          class="site-description"
        >
          CSVを読み込んでいます
        </p>
      </article>

      <article
        id="card-tokyo"
        class="site-card tokyo"
      >
        <h3 class="site-name">
          東京都新宿区
        </h3>

        <p
          id="source-tokyo"
          class="site-source"
        >
          採取：―
        </p>

        <p
          id="value-tokyo"
          class="site-value"
        >
          ―
        </p>

        <p
          id="description-tokyo"
          class="site-description"
        >
          CSVを読み込んでいます
        </p>
      </article>
    </section>

    <section class="chart-panel">
      <div class="chart-container">
        <canvas
          id="falloutChart"
          aria-label="セシウム137月間降下物量の長期推移"
        ></canvas>
      </div>

      <p class="chart-help">
        <strong>グラフ操作：</strong>
        マウスホイール／ピンチで横方向に拡大・縮小、
        ドラッグで表示範囲を移動できます。
      </p>
    </section>

    <section class="notes">
      <h2 class="notes-title">
        <span
          class="notes-mark"
          aria-hidden="true"
        ></span>

        データの扱い
      </h2>

      <ul>
         <li>
          環境放射線データベースから取得した
          Cs-137の月間降下物測定結果を表示しています。
        </li>

        <li>
          CSVに記録された実測値だけを表示しています。
        </li>

        <li>
          データが存在しない月は「欠測」とし、
          前後の実測値を線で結んで補間しません。
        </li>

        <li>
          同じ年月に複数の実測記録がある場合は、
          平均化せずにカードへすべての数値を表示しますが、対数グラフ上には最大値のみを描画します。
        </li>

        <li>
          ND（不検出・検出限界未満）はカードへ表示しますが、
          対数グラフ上には数値として描画しません。
        </li>

        <li>
          縦軸は対数表示です。大熊町の事故後の高値を含め、
          CSV内の全実測値から表示範囲を自動計算します。
        </li>
      </ul>
    </section>

    <details class="diagnostics">
      <summary>
        読み込み診断
      </summary>

      <div class="diagnostics-content">
        <p id="diagnosticsSummary">
          CSVを読み込んでいます。
        </p>

        <div class="diagnostics-table-wrapper">
          <table>
            <thead>
              <tr>
                <th>地点</th>
                <th>全件</th>
                <th>実測値</th>
                <th>ND</th>
                <th>最初の月</th>
                <th>最後の月</th>
                <th>最大値</th>
              </tr>
            </thead>

            <tbody id="diagnosticsBody"></tbody>
          </table>
        </div>
      </div>
    </details>
  </main>

  <script>
    "use strict";

    /* =====================================================
       基本設定
       ===================================================== */

    const CSV_FILE =
      "https://fukushima-30year-project.org/wp-content/uploads/2026/08/monthly-fallout-cs137-optimized.csv";

    const SITE_ORDER = [
      "okuma",
      "fukushima",
      "tokyo"
    ];

    const SELECTABLE_START_MONTH = "2010-09";
    const DEFAULT_VIEW_START_MONTH = "2010-09"; // 全体表示時の開始月
    const DEFAULT_SITE_ID = "tokyo";

    const SITE_CONFIG = {
      okuma: {
        label: "大熊町",
        color: "#df2735"
      },

      fukushima: {
        label: "福島市",
        color: "#16a34a"
      },

      tokyo: {
        label: "東京都新宿区",
        color: "#2c63e6"
      }
    };

    let allRecords = [];
    let falloutChart = null;

    let dataStartMonth = "";
    let dataEndMonth = "";

    let fullXMinimum = 0;
    let fullXMaximum = 1;

    let fullYMinimum = 0.01;
    let fullYMaximum = 100;

    /* =====================================================
       DOM取得
       ===================================================== */

    const yearSelect = document.getElementById(
      "yearSelect"
    );

    const monthSelect = document.getElementById(
      "monthSelect"
    );

    const resetViewButton =
      document.getElementById(
        "resetViewButton"
      );

    const zoomViewButton =
      document.getElementById(
        "zoomViewButton"
      );

    const periodLabel = document.getElementById(
      "periodLabel"
    );

    const statusLine = document.getElementById(
      "statusLine"
    );

    const selectedMonthTitle =
      document.getElementById(
        "selectedMonthTitle"
      );

    /* =====================================================
       文字列・数値処理
       ===================================================== */

    function normalizeText(value) {
      if (
        value === null ||
        value === undefined
      ) {
        return "";
      }

      return String(value)
        .replace(/^\uFEFF/, "")
        .trim();
    }

    function parsePositiveNumber(rawValue) {
      if (
        rawValue === null ||
        rawValue === undefined ||
        rawValue === ""
      ) {
        return null;
      }

      const normalized = String(rawValue)
        .replace(/,/g, "")
        .replace(/[　\s]/g, "")
        .trim();

      const numericValue = Number(normalized);

      if (
        !Number.isFinite(numericValue) ||
        numericValue <= 0
      ) {
        return null;
      }

      return numericValue;
    }

    function formatValue(value) {
      if (
        value === null ||
        value === undefined ||
        !Number.isFinite(value)
      ) {
        return "";
      }

      return value.toLocaleString(
        "ja-JP",
        {
          maximumFractionDigits: 8
        }
      );
    }

    function escapeHtml(value) {
      return String(value)
        .replace(/&/g, "&amp;")
        .replace(/</g, "&lt;")
        .replace(/>/g, "&gt;")
        .replace(/"/g, "&quot;")
        .replace(/'/g, "&#039;");
    }

    /* =====================================================
       年月処理
       ===================================================== */

    function isValidMonthText(value) {
      return /^\d{4}-\d{2}$/.test(value);
    }

    function monthToIndex(monthText) {
      if (!isValidMonthText(monthText)) {
        return null;
      }

      const [
        yearText,
        monthNumberText
      ] = monthText.split("-");

      const year = Number(yearText);
      const monthNumber = Number(
        monthNumberText
      );

      if (
        !Number.isInteger(year) ||
        !Number.isInteger(monthNumber) ||
        monthNumber < 1 ||
        monthNumber > 12
      ) {
        return null;
      }

      return year * 12 + monthNumber - 1;
    }

    function indexToMonth(monthIndex) {
      const roundedIndex = Math.round(
        monthIndex
      );

      const year = Math.floor(
        roundedIndex / 12
      );

      const monthNumber = (
        roundedIndex % 12
      ) + 1;

      return (
        `${String(year).padStart(4, "0")}-` +
        `${String(monthNumber).padStart(2, "0")}`
      );
    }

    function displayMonth(monthText) {
      if (!isValidMonthText(monthText)) {
        return monthText;
      }

      const [year, month] =
        monthText.split("-");

      return (
        `${Number(year)}年` +
        `${Number(month)}月`
      );
    }

    function enumerateMonths(
      startMonth,
      endMonth
    ) {
      const startIndex = monthToIndex(
        startMonth
      );

      const endIndex = monthToIndex(
        endMonth
      );

      if (
        startIndex === null ||
        endIndex === null ||
        startIndex > endIndex
      ) {
        return [];
      }

      const months = [];

      for (
        let index = startIndex;
        index <= endIndex;
        index += 1
      ) {
        months.push(indexToMonth(index));
      }

      return months;
    }

    /* =====================================================
       CSVレコード正規化
       ===================================================== */

    function normalizeRecord(record) {
      const month = normalizeText(
        record.month
      );

      const siteId = normalizeText(
        record.site_id
      ).toLowerCase();

      const status = normalizeText(
        record.status
      ).toLowerCase();

      const numericValue =
        parsePositiveNumber(
          record.value_bq_m2_month
        );

      return {
        ...record,

        month,
        site_id: siteId,
        site_name: normalizeText(
          record.site_name
        ),

        status,

        value_bq_m2_month:
          normalizeText(
            record.value_bq_m2_month
          ),

        sampling_location:
          normalizeText(
            record.sampling_location
          ),

        sampling_organization:
          normalizeText(
            record.sampling_organization
          ),

        analysis_organization:
          normalizeText(
            record.analysis_organization
          ),

        detection_limit_bq_m2_month:
          normalizeText(
            record
              .detection_limit_bq_m2_month
          ),

        record_key: normalizeText(
          record.record_key
        ),

        numericValue: (
          status === "value"
            ? numericValue
            : null
        )
      };
    }

    /* =====================================================
       データ取得
       ===================================================== */

    async function loadCsvRecords() {
      /*
       * キャッシュされた古いCSVを読まないよう、
       * タイムスタンプを付けます。
       */
      const requestUrl = (
        `${CSV_FILE}?v=${Date.now()}`
      );

      const response = await fetch(
        requestUrl,
        {
          cache: "no-store"
        }
      );

      if (!response.ok) {
        throw new Error(
          "CSVの読み込みに失敗しました。" +
          ` HTTP ${response.status}`
        );
      }

      const csvText = await response.text();

      const parsed = Papa.parse(
        csvText,
        {
          header: true,
          skipEmptyLines: true,

          transformHeader(header) {
            return normalizeText(header);
          }
        }
      );

      if (
        parsed.errors &&
        parsed.errors.length > 0
      ) {
        console.warn(
          "CSV解析時の警告:",
          parsed.errors
        );
      }

      const normalizedRecords = parsed.data
        .map(normalizeRecord)
        .filter((record) => {
          return (
            isValidMonthText(record.month) &&
            SITE_ORDER.includes(
              record.site_id
            )
          );
        });

      if (normalizedRecords.length === 0) {
        throw new Error(
          "CSVから対象レコードを" +
          "読み込めませんでした。" +
          "month、site_id、status、" +
          "value_bq_m2_month列を" +
          "確認してください。"
        );
      }

      return normalizedRecords;
    }

    /* =====================================================
       月別データ取得
       ===================================================== */

    function getRecordsForMonth(
      siteId,
      month
    ) {
      return allRecords
        .filter((record) => {
          return (
            record.site_id === siteId &&
            record.month === month
          );
        })
        .sort((left, right) => {
          const leftValue = (
            left.numericValue ??
            Number.POSITIVE_INFINITY
          );

          const rightValue = (
            right.numericValue ??
            Number.POSITIVE_INFINITY
          );

          if (leftValue !== rightValue) {
            return leftValue - rightValue;
          }

          return (
            left.record_key ||
            ""
          ).localeCompare(
            right.record_key || ""
          );
        });
    }

    function makeSourceText(records) {
      const organizations = [
        ...new Set(
          records
            .map((record) => {
              return (
                record.sampling_organization ||
                record.sampling_location
              );
            })
            .filter(Boolean)
          )
      ];

      if (organizations.length === 0) {
        return "採取：記録なし";
      }

      if (organizations.length === 1) {
        return (
          `採取：${organizations[0]}`
        );
      }

      return (
        "採取：" +
        organizations.join("／")
      );
    }

    function buildCardResult(records) {
      const measuredRecords = records.filter(
        (record) => {
          return (
            record.status === "value" &&
            record.numericValue !== null
          );
        }
      );

      if (measuredRecords.length > 0) {
        const values = measuredRecords.map(
          (record) => record.numericValue
        );

        return {
          valueText: values
            .map(formatValue)
            .join("／"),

          description: (
            measuredRecords.length > 1
              ? "同じ年月に複数の実測記録があります（Bq/m²・月）"
              : "Bq/m²・月・実測値"
          )
        };
      }

      const ndRecords = records.filter(
        (record) => {
          return record.status === "nd";
        }
      );

      if (ndRecords.length > 0) {
        const detectionLimits = [
          ...new Set(
            ndRecords
              .map((record) => {
                return parsePositiveNumber(
                  record
                    .detection_limit_bq_m2_month
                );
              })
              .filter((value) => {
                return value !== null;
              })
              .map(formatValue)
          )
        ];

        return {
          valueText: "ND",

          description: (
            detectionLimits.length > 0
              ? (
                "不検出・検出限界：" +
                detectionLimits.join("／") +
                " Bq/m²・月"
              )
              : "不検出または検出限界未満"
          )
        };
      }

      return {
        valueText: "欠測",
        description:
          "CSVに該当する測定記録がありません"
      };
    }

    function updateSiteCard(
      siteId,
      month
    ) {
      const records = getRecordsForMonth(
        siteId,
        month
      );

      const sourceElement =
        document.getElementById(
          `source-${siteId}`
        );

      const valueElement =
        document.getElementById(
          `value-${siteId}`
        );

      const descriptionElement =
        document.getElementById(
          `description-${siteId}`
        );

      const result = buildCardResult(
        records
      );

      sourceElement.textContent =
        makeSourceText(records);

      valueElement.textContent =
        result.valueText;

      descriptionElement.textContent =
        result.description;
    }

    function updateSelectedMonthCards() {
      const year = Number(
        yearSelect.value
      );

      const monthNumber = Number(
        monthSelect.value
      );

      if (
        !Number.isInteger(year) ||
        !Number.isInteger(monthNumber)
      ) {
        return;
      }

      const month = (
        `${String(year).padStart(4, "0")}-` +
        `${String(monthNumber).padStart(2, "0")}`
      );

      selectedMonthTitle.textContent =
        displayMonth(month);

      for (const siteId of SITE_ORDER) {
        updateSiteCard(siteId, month);
      }
    }

/* =====================================================
   年月選択欄
   ===================================================== */

function createYearMonthSelectors() {
  const startIndex = monthToIndex(
    SELECTABLE_START_MONTH
  );

  const endIndex = monthToIndex(
    dataEndMonth
  );

  console.log(
    "年月セレクト作成範囲:",
    SELECTABLE_START_MONTH,
    dataEndMonth,
    startIndex,
    endIndex
  );

  yearSelect.innerHTML = "";

  if (
    startIndex === null ||
    endIndex === null ||
    startIndex > endIndex
  ) {
    console.warn(
      "年月セレクトを作成できません:",
      SELECTABLE_START_MONTH,
      dataEndMonth
    );

    return;
  }

  const startYear = Math.floor(
    startIndex / 12
  );

  const endYear = Math.floor(
    endIndex / 12
  );

  for (
    let year = startYear;
    year <= endYear;
    year += 1
  ) {
    const option = document.createElement(
      "option"
    );

    option.value = String(year);
    option.textContent = `${year}年`;

    yearSelect.appendChild(option);
  }

  monthSelect.innerHTML = "";

  for (
    let monthNumber = 1;
    monthNumber <= 12;
    monthNumber += 1
  ) {
    const option = document.createElement(
      "option"
    );

    option.value = String(monthNumber);
    option.textContent =
      `${monthNumber}月`;

    monthSelect.appendChild(option);
  }

  const defaultMonth = chooseDefaultMonth();

  const [
    defaultYear,
    defaultMonthNumber
  ] = defaultMonth.split("-");

  yearSelect.value = String(
    Number(defaultYear)
  );

  monthSelect.value = String(
    Number(defaultMonthNumber)
  );

  console.log(
    "年月セレクト作成完了:",
    "先頭年=",
    yearSelect.options[0]?.value,
    "末尾年=",
    yearSelect.options[
      yearSelect.options.length - 1
    ]?.value,
    "初期選択=",
    yearSelect.value,
    monthSelect.value
  );
}

function chooseDefaultMonth() {
  const initialMonth = "2011-03";

  if (
    allRecords.some((record) => {
      return record.month === initialMonth;
    })
  ) {
    return initialMonth;
  }

  return SELECTABLE_START_MONTH;
}


    /* =====================================================
       グラフ用データ
       ===================================================== */

    function buildDatasetPoints(siteId) {
      const months = enumerateMonths(
        dataStartMonth,
        dataEndMonth
      );

      const recordsByMonth = new Map();

      for (const record of allRecords) {
        if (record.site_id !== siteId) {
          continue;
        }

        if (!recordsByMonth.has(record.month)) {
          recordsByMonth.set(
            record.month,
            []
          );
        }

        recordsByMonth
          .get(record.month)
          .push(record);
      }

      const points = [];

      for (const month of months) {
        const monthIndex = monthToIndex(
          month
        );

        const monthRecords = (
          recordsByMonth.get(month) || []
        );

        const measuredRecords =
          monthRecords
            .filter((record) => {
              return (
                record.status === "value" &&
                record.numericValue !== null
              );
            })
            .sort((left, right) => {
              return (
                left.numericValue -
                right.numericValue
              );
            });

        if (measuredRecords.length === 0) {
          /*
           * null点を明示的に挿入します。
           * spanGaps:false と組み合わせることで、
           * 欠測期間を線で結びません。
           */
          points.push({
            x: monthIndex,
            y: null,
            month,
            record: null
          });

          continue;
        }

          /*
         * 同じ月に複数の測定値がある場合、
         * 最大値（一番高い数値）のみをグラフに描画します。
         */
        const maxRecord = measuredRecords[measuredRecords.length - 1];
        points.push({
          x: monthIndex,
          y: maxRecord.numericValue,
          month,
          record: maxRecord
        });
        }

      return points;
    }

    function buildChartDatasets() {
      return SITE_ORDER.map((siteId) => {
        const config = SITE_CONFIG[siteId];

        return {
          label: config.label,

          data: buildDatasetPoints(
            siteId
          ),

          parsing: false,

          borderColor: config.color,
          backgroundColor: config.color,

          borderWidth: 1.4,

          pointRadius: 1.2,
          pointHoverRadius: 5,
          pointHitRadius: 8,

          showLine: true,
          spanGaps: false,

          tension: 0,

          /*
           * 欠測をまたぐ線だけでなく、
           * 離れた月を直接結ぶ事故も防止します。
           */
          segment: {
            borderColor(context) {
              const left = context.p0.raw;
              const right = context.p1.raw;

              if (
                !left ||
                !right ||
                left.y === null ||
                right.y === null
              ) {
                return "rgba(0,0,0,0)";
              }

              const monthDifference = (
                right.x - left.x
              );

              if (monthDifference > 1) {
                return "rgba(0,0,0,0)";
              }

              return config.color;
            }
          }
        };
      });
    }

    /* =====================================================
       対数軸範囲
       ===================================================== */

    function calculateLogarithmicBounds() {
      const values = allRecords
        .map((record) => {
          return record.numericValue;
        })
        .filter((value) => {
          return (
            value !== null &&
            Number.isFinite(value) &&
            value > 0
          );
        });

      if (values.length === 0) {
        return {
          minimum: 0.01,
          maximum: 100
        };
      }

      const smallest = Math.min(...values);
      const largest = Math.max(...values);

      let minimum = 10 ** Math.floor(
        Math.log10(smallest)
      );

      let maximum = 10 ** Math.ceil(
        Math.log10(largest)
      );

      /*
       * 最大値が10の累乗と一致した場合も、
       * 上端に張り付かないよう1桁広げます。
       */
      if (maximum <= largest) {
        maximum *= 10;
      }

      /*
       * 小さい値の表示余地を確保します。
       * 元データがさらに小さい場合は、
       * その値に合わせて下がります。
       */
      minimum = Math.min(
        minimum,
        0.01
      );

      if (
        !Number.isFinite(minimum) ||
        minimum <= 0
      ) {
        minimum = 0.01;
      }

      if (
        !Number.isFinite(maximum) ||
        maximum <= minimum
      ) {
        maximum = minimum * 10000;
      }

      return {
        minimum,
        maximum
      };
    }

    function isPowerOfTen(value) {
      if (
        !Number.isFinite(value) ||
        value <= 0
      ) {
        return false;
      }

      const logarithm = Math.log10(value);

      return (
        Math.abs(
          logarithm -
          Math.round(logarithm)
        ) < 1e-9
      );
    }

    /* =====================================================
       Chart.js作成
       ===================================================== */

    function createChart() {
      const canvas = document.getElementById(
        "falloutChart"
      );

      if (!canvas) {
        throw new Error(
          "グラフ用canvasが見つかりません。"
        );
      }

      const datasets = buildChartDatasets();

      const logarithmicBounds =
        calculateLogarithmicBounds();

      fullXMinimum = monthToIndex(
        dataStartMonth
      );

      fullXMaximum = monthToIndex(
        dataEndMonth
      );

      fullYMinimum =
        logarithmicBounds.minimum;

      fullYMaximum =
        logarithmicBounds.maximum;

      if (falloutChart) {
        falloutChart.destroy();
        falloutChart = null;
      }

      falloutChart = new Chart(
        canvas.getContext("2d"),
        {
          type: "line",

          data: {
            datasets
          },

          options: {
            responsive: true,
            maintainAspectRatio: false,

            animation: false,

            normalized: true,

            interaction: {
              mode: "nearest",
              intersect: false,
              axis: "xy"
            },

            scales: {
              x: {
                type: "linear",

                // 初期表示の開始位置を2010年9月に設定
                min: monthToIndex(DEFAULT_VIEW_START_MONTH),
                max: fullXMaximum,

                grid: {
                  display: false
                },

                ticks: {
                  maxTicksLimit: 14,
                  maxRotation: 0,
                  minRotation: 0,

                  callback(value) {
                    const month =
                      indexToMonth(value);

                    const year = Number(
                      month.slice(0, 4)
                    );

                    return `${year}年`;
                  }
                }
              },

              y: {
                type: "logarithmic",

                min: fullYMinimum,
                max: fullYMaximum,

                beginAtZero: false,

                title: {
                  display: true,
                  text:
                    "Cs-137（Bq/m²・月）"
                },

                ticks: {
                  callback(value) {
                    const numericValue =
                      Number(value);

                    if (
                      !isPowerOfTen(
                        numericValue
                      )
                    ) {
                      return "";
                    }

                    return numericValue
                      .toLocaleString(
                        "ja-JP"
                      );
                  }
                }
              }
            },

            plugins: {
              legend: {
                display: true,
                position: "top",

                labels: {
                  boxWidth: 15,
                  boxHeight: 12,
                  padding: 12
                }
              },

              tooltip: {
                filter(context) {
                  return (
                    context.raw &&
                    context.raw.y !== null &&
                    context.raw.record
                  );
                },

                callbacks: {
                  title(items) {
                    if (
                      !items ||
                      items.length === 0
                    ) {
                      return "";
                    }

                    const raw =
                      items[0].raw;

                    return displayMonth(
                      raw.month
                    );
                  },

                  label(context) {
                    const raw = context.raw;

                    return (
                      `${context.dataset.label}: ` +
                      `${formatValue(raw.y)} ` +
                      "Bq/m²・月"
                    );
                  },

                  afterLabel(context) {
                    const record =
                      context.raw.record;

                    if (!record) {
                      return [];
                    }

                    const lines = [];

                    if (
                      record.sampling_location
                    ) {
                      lines.push(
                        "採取地点：" +
                        record
                          .sampling_location
                      );
                    }

                    if (
                      record
                        .sampling_organization
                    ) {
                      lines.push(
                        "採取機関：" +
                        record
                          .sampling_organization
                      );
                    }

                    if (
                      record
                        .analysis_organization
                    ) {
                      lines.push(
                        "分析機関：" +
                        record
                          .analysis_organization
                      );
                    }

                    return lines;
                  }
                }
              },

              zoom: {
                limits: {
                  x: {
                    // スクロール限界は1963年まで許可
                    min: fullXMinimum,
                    max: fullXMaximum,
                    minRange: 3
                  },

                  y: {
                    min: fullYMinimum,
                    max: fullYMaximum
                  }
                },

                pan: {
                  enabled: true,
                  mode: "x"
                },

                zoom: {
                  wheel: {
                    enabled: true,
                    speed: 0.08
                  },

                  pinch: {
                    enabled: true
                  },

                  /*
                   * 縦軸の拡大を禁止します。
                   * 大熊町の高値が画面外へ消えるのを
                   * 防ぐためです。
                   */
                  mode: "x"
                }
              }
            }
          }
        }
      );
    }

    /* =====================================================
       グラフ操作
       ===================================================== */

    function restoreYAxis() {
      if (!falloutChart) {
        return;
      }

      falloutChart.options.scales.y.min =
        fullYMinimum;

      falloutChart.options.scales.y.max =
        fullYMaximum;

      const zoomOptions = (
        falloutChart.options
          .plugins
          ?.zoom
      );

      if (zoomOptions?.limits?.y) {
        zoomOptions.limits.y.min =
          fullYMinimum;

        zoomOptions.limits.y.max =
          fullYMaximum;
      }
    }

    function resetChartView() {
      if (!falloutChart) {
        return;
      }

      if (
        typeof falloutChart.resetZoom ===
        "function"
      ) {
        falloutChart.resetZoom();
      }

      // 全体表示ボタンを押した時は 2010年9月 に戻す
      falloutChart.options.scales.x.min =
        monthToIndex(DEFAULT_VIEW_START_MONTH);

      falloutChart.options.scales.x.max =
        fullXMaximum;

      restoreYAxis();

      falloutChart.update("none");
    }

    function zoomToSelectedMonth() {
      if (!falloutChart) {
        return;
      }

      const year = Number(
        yearSelect.value
      );

      const monthNumber = Number(
        monthSelect.value
      );

      const selectedMonth = (
        `${String(year).padStart(4, "0")}-` +
        `${String(monthNumber).padStart(2, "0")}`
      );

      const center = monthToIndex(
        selectedMonth
      );

      if (center === null) {
        return;
      }

      /*
       * 選択月の前後2年を表示します。
       */
      const requestedMinimum =
        center - 6;

      const requestedMaximum =
        center + 6;

      falloutChart.options.scales.x.min =
        Math.max(
          fullXMinimum,
          requestedMinimum
        );

      falloutChart.options.scales.x.max =
        Math.min(
          fullXMaximum,
          requestedMaximum
        );

      restoreYAxis();

      falloutChart.update("none");
    }

    /* =====================================================
       診断表示
       ===================================================== */

    function updateDiagnostics() {
      const diagnosticsSummary =
        document.getElementById(
          "diagnosticsSummary"
        );

      const diagnosticsBody =
        document.getElementById(
          "diagnosticsBody"
        );

      const numericValues = allRecords
        .map((record) => {
          return record.numericValue;
        })
        .filter((value) => {
          return value !== null;
        });

      const globalMaximum = (
        numericValues.length > 0
          ? Math.max(...numericValues)
          : null
      );

      diagnosticsSummary.textContent = (
        `読み込み件数：` +
        `${allRecords.length.toLocaleString("ja-JP")}件、` +
        `期間：${displayMonth(dataStartMonth)}～` +
        `${displayMonth(dataEndMonth)}、` +
        `最大実測値：` +
        (
          globalMaximum !== null
            ? `${formatValue(globalMaximum)} Bq/m²・月`
            : "なし"
        ) +
        `、縦軸上限：` +
        `${formatValue(fullYMaximum)}`
      );

      diagnosticsBody.innerHTML = "";

      for (const siteId of SITE_ORDER) {
        const config = SITE_CONFIG[siteId];

        const siteRecords = allRecords.filter(
          (record) => {
            return record.site_id === siteId;
          }
        );

        const measuredRecords =
          siteRecords.filter((record) => {
            return (
              record.status === "value" &&
              record.numericValue !== null
            );
          });

        const ndRecords = siteRecords.filter(
          (record) => {
            return record.status === "nd";
          }
        );

        const months = [
          ...new Set(
            siteRecords.map((record) => {
              return record.month;
            })
          )
        ].sort();

        const values = measuredRecords.map(
          (record) => record.numericValue
        );

        const maximum = (
          values.length > 0
            ? Math.max(...values)
            : null
        );

        const row = document.createElement(
          "tr"
        );

        row.innerHTML = `
          <td>${escapeHtml(config.label)}</td>
          <td>${siteRecords.length.toLocaleString("ja-JP")}</td>
          <td>${measuredRecords.length.toLocaleString("ja-JP")}</td>
          <td>${ndRecords.length.toLocaleString("ja-JP")}</td>
          <td>${
            months.length > 0
              ? escapeHtml(months[0])
              : "―"
          }</td>
          <td>${
            months.length > 0
              ? escapeHtml(
                  months[months.length - 1]
                )
              : "―"
          }</td>
          <td>${
            maximum !== null
              ? escapeHtml(
                  formatValue(maximum)
                )
              : "―"
          }</td>
        `;

        diagnosticsBody.appendChild(row);
      }

      printConsoleDiagnostics();
    }

    function printConsoleDiagnostics() {
      console.group(
        "月間降下物CSV読み込み診断"
      );

      console.log(
        "全レコード数:",
        allRecords.length
      );

      console.log(
        "表示期間:",
        dataStartMonth,
        "～",
        dataEndMonth
      );

      console.log(
        "縦軸範囲:",
        fullYMinimum,
        "～",
        fullYMaximum
      );

      for (const targetMonth of [
        "2011-03",
        "2013-03",
        "2020-03"
      ]) {
        console.group(targetMonth);

        for (const siteId of SITE_ORDER) {
          const selectedRecords =
            getRecordsForMonth(
              siteId,
              targetMonth
            );

          console.log(
            siteId,
            selectedRecords.map(
              (record) => {
                return {
                  month: record.month,
                  status: record.status,
                  rawValue:
                    record
                      .value_bq_m2_month,
                  numericValue:
                    record.numericValue,
                  samplingLocation:
                    record
                      .sampling_location,
                  samplingOrganization:
                    record
                      .sampling_organization
                };
              }
            )
          );
        }

        console.groupEnd();
      }

      console.groupEnd();
    }

    /* =====================================================
       初期化
       ===================================================== */

    async function initializePage() {
      try {
        statusLine.classList.remove(
          "is-error"
        );

        statusLine.textContent =
          "CSVを読み込んでいます。";

        allRecords = await loadCsvRecords();

        allRecords.sort(
          (left, right) => {
            const monthDifference = (
              monthToIndex(left.month) -
              monthToIndex(right.month)
            );

            if (monthDifference !== 0) {
              return monthDifference;
            }

            const siteDifference = (
              SITE_ORDER.indexOf(
                left.site_id
              ) -
              SITE_ORDER.indexOf(
                right.site_id
              )
            );

            if (siteDifference !== 0) {
              return siteDifference;
            }

            return (
              left.numericValue ?? 0
            ) - (
              right.numericValue ?? 0
            );
          }
        );

        const allMonths = [
          ...new Set(
            allRecords.map((record) => {
              return record.month;
            })
          )
        ].sort();

dataStartMonth = SELECTABLE_START_MONTH;

dataEndMonth = (
  allMonths[allMonths.length - 1]
);

        periodLabel.textContent = (
          `${displayMonth(dataStartMonth)}～` +
          `${displayMonth(dataEndMonth)}・実測値`
        );

       createYearMonthSelectors();
createChart();
updateSelectedMonthCards();

// 初期表示を全体表示（2010年9月〜最新）にする
resetChartView();

updateDiagnostics();

        statusLine.textContent = (
          `${allRecords.length.toLocaleString("ja-JP")}件の` +
          "レコードを読み込みました。"
        );
      } catch (error) {
        console.error(error);

        statusLine.classList.add(
          "is-error"
        );

        statusLine.textContent = (
          error instanceof Error
            ? error.message
            : String(error)
        );

        periodLabel.textContent =
          "CSVを読み込めませんでした";

        selectedMonthTitle.textContent =
          "読み込みエラー";

        for (const siteId of SITE_ORDER) {
          document.getElementById(
            `value-${siteId}`
          ).textContent = "―";

          document.getElementById(
            `description-${siteId}`
          ).textContent =
            "CSVの読み込みに失敗しました";
        }
      }
    }

    /* =====================================================
       イベント
       ===================================================== */

  yearSelect.addEventListener(
  "change",
  () => {
    updateSelectedMonthCards();
    zoomToSelectedMonth();
  }
);

monthSelect.addEventListener(
  "change",
  () => {
    updateSelectedMonthCards();
    zoomToSelectedMonth();
  }
);

    resetViewButton.addEventListener(
      "click",
      resetChartView
    );

    zoomViewButton.addEventListener(
      "click",
      zoomToSelectedMonth
    );

    document.addEventListener(
      "DOMContentLoaded",
      initializePage
    );
  </script>
</body>
</html>










































]]></description>
<category>ハウスダスト</category>
<guid isPermaLink="true">https://minnanods.net/housedust/entry-1833.html</guid>
<pubDate>Fri, 28 Aug 2026 12:53:51 +0900</pubDate>
</item>
<item>
<dc:creator>みんなのデータサイト</dc:creator>
<title>月間降下物量（セシウム137）超長期推移</title>
<link>https://minnanods.net/learn/contamination-level-of-japan/entry-1831.html</link>
<description><![CDATA[




<!-- テキスト -->

<div id="top"></div>











































<!-- テキスト -->

<h2 >降下物</h2>











































<!-- テキスト -->

<p>正式には放射性降下物のことで、一般にフォールアウトとも呼ばれる。大気圏における核爆発や原子炉の事故における放射性物質の事故による大気中への放出などが原因になり、核分裂生成物を含む放射性の粒状物質が大気中（または成層圏中）に飛散し、これが生活環境に降下したものである。<br />
「原子力百科事典 ATOMICA」より</p>











































<!-- テキスト -->

<h2 ><em>グラフの見どころ（歴史的背景）</em></h2>











































<!-- テキスト -->

<p>ドロップダウンで以下の年月を指定していただくと、歴史的な放射能フォールアウトの変遷を数値で確認できます。<br />
<br />
1. <em>1963年5月</em>: 米ソ等の大気圏内核実験による「グローバルフォールアウト」の歴史的最大ピーク（東京で約 303 Bq/m²）。<br />
2 <em>1986年5月</em>: チョルノーヴィリ(チェルノブイリ)原発事故の影響が日本に到達した月（東京で約 178 Bq/m²）。<br />
3. <em>2000年代</em>: ほぼ検出限界未満（ND）で推移していた平穏な時期。<br />
4. <em>2011年3月</em>（初期表示）: 福島第一原発事故による未曾有の降下量。<br />
<br />
このように超長期で俯瞰すると、2011年の事故がいかに突出した規模であったか、またそれ以前にも人類の活動によって環境中にセシウムが降下していた歴史（バックグラウンド）が視覚的に非常によく分かります。</p>











































<!-- テキスト -->

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">

  <meta
    name="viewport"
    content="width=device-width, initial-scale=1.0"
  >

  <title>
    月間降下物量（セシウム137）超長期推移
  </title>

  <!--
    CSV解析
  -->
  <script
    src="https://cdn.jsdelivr.net/npm/papaparse@5.4.1/papaparse.min.js"
  ></script>

  <!--
    Chart.js
  -->
  <script
    src="https://cdn.jsdelivr.net/npm/chart.js@4.4.7/dist/chart.umd.min.js"
  ></script>

  <!--
    ピンチ操作用
  -->
  <script
    src="https://cdn.jsdelivr.net/npm/hammerjs@2.0.8/hammer.min.js"
  ></script>

  <!--
    Chart.js Zoom Plugin
  -->
  <script
    src="https://cdn.jsdelivr.net/npm/chartjs-plugin-zoom@2.2.0/dist/chartjs-plugin-zoom.min.js"
  ></script>

  <style>
    :root {
      --header-green: #79bc00;
      --header-green-dark: #69a900;

      --okuma-color: #df2735;
      --fukushima-color: #16a34a;
      --tokyo-color: #2c63e6;

      --text-color: #16243a;
      --sub-text-color: #667085;

      --border-color: #d9e2ec;
      --panel-background: #ffffff;
      --soft-background: #f7f9fc;

      --button-border: #cbd6e2;
      --button-hover: #f0f5fa;

      --shadow:
        0 1px 2px rgba(16, 24, 40, 0.04);
    }

    * {
      box-sizing: border-box;
    }

    html {
      font-family:
        -apple-system,
        BlinkMacSystemFont,
        "Segoe UI",
        "Yu Gothic UI",
        "Yu Gothic",
        Meiryo,
        sans-serif;

      color: var(--text-color);
      background: #ffffff;
    }

    body {
      margin: 0;
      padding: 0;
      background: #ffffff;
    }

    button,
    select {
      font: inherit;
    }

    .page {
      width: min(1200px, 100%);
      margin: 0 auto;
      padding: 18px;
    }

    /* =====================================================
       ヘッダー
       ===================================================== */

    .hero {
      position: relative;

      overflow: hidden;

      padding: 20px 22px 17px;

      color: #ffffff;

      background:
        linear-gradient(
          135deg,
          var(--header-green),
          var(--header-green-dark)
        );

      border-radius: 8px;
    }

    .hero::before {
      content: "";

      position: absolute;
      top: 15px;
      left: 17px;

      width: 18px;
      height: 48px;

      border-radius: 9px;

      background: rgba(255, 255, 255, 0.07);
    }

    .hero-title {
      position: relative;

      margin: 0;
      padding-left: 22px;

      font-size: clamp(18px, 3vw, 25px);
      line-height: 1.4;
      font-weight: 700;
    }

    .hero-divider {
      position: relative;

      height: 4px;
      margin: 8px 0 7px 22px;

      background: rgba(255, 255, 255, 0.06);
    }

    .hero-subtitle {
      position: relative;

      margin: 0;
      padding-left: 0;

      font-size: 12px;
      font-weight: 600;
    }

    /* =====================================================
       操作領域
       ===================================================== */

    .controls {
      display: flex;
      flex-wrap: wrap;
      align-items: end;
      gap: 9px;

      margin: 14px 0 7px;
    }

    .control-group {
      display: flex;
      align-items: center;
      gap: 6px;
    }

    .control-label {
      font-size: 14px;
      font-weight: 700;
      color: #344054;
    }

    select {
      min-width: 88px;
      height: 40px;

      padding: 0 34px 0 12px;

      color: #243248;
      font-weight: 600;

      background: #ffffff;

      border: 1px solid var(--button-border);
      border-radius: 6px;

      cursor: pointer;
    }

    select:focus {
      outline: 2px solid rgba(121, 188, 0, 0.3);
      border-color: var(--header-green);
    }

    .action-button {
      min-height: 40px;
      padding: 8px 14px;

      color: #263750;
      font-weight: 700;

      background: #ffffff;

      border: 1px solid var(--button-border);
      border-radius: 6px;

      cursor: pointer;

      transition:
        background-color 0.15s ease,
        border-color 0.15s ease,
        transform 0.05s ease;
    }

    .action-button:hover {
      background: var(--button-hover);
      border-color: #aebdcd;
    }

    .action-button:active {
      transform: translateY(1px);
    }

    .status-line {
      min-height: 22px;
      margin: 7px 0;

      color: var(--sub-text-color);
      font-size: 12px;
    }

    .status-line.is-error {
      color: #b42318;
      font-weight: 700;
    }

    /* =====================================================
       選択年月
       ===================================================== */

    .selected-month-title {
      margin: 8px 0 10px;

      text-align: center;

      font-size: 20px;
      line-height: 1.4;
      font-weight: 700;
    }

    /* =====================================================
       地点カード
       ===================================================== */

    .site-cards {
      display: grid;
      grid-template-columns: repeat(3, minmax(0, 1fr));
      gap: 12px;

      margin-bottom: 15px;
    }

    .site-card {
      min-height: 137px;
      padding: 15px 16px 14px;

      background: var(--panel-background);

      border: 1px solid var(--border-color);
      border-top-width: 4px;
      border-radius: 8px;

      box-shadow: var(--shadow);
    }

    .site-card.okuma {
      border-top-color: var(--okuma-color);
    }

    .site-card.fukushima {
      border-top-color: var(--fukushima-color);
    }

    .site-card.tokyo {
      border-top-color: var(--tokyo-color);
    }

    .site-name {
      margin: 0 0 5px;

      font-size: 16px;
      font-weight: 700;
    }

    .site-source {
      min-height: 18px;
      margin: 0 0 7px;

      overflow-wrap: anywhere;

      color: var(--sub-text-color);
      font-size: 11px;
      line-height: 1.45;
    }

    .site-value {
      margin: 0 0 4px;

      overflow-wrap: anywhere;

      color: #101828;
      font-size: clamp(20px, 2.4vw, 26px);
      line-height: 1.25;
      font-weight: 750;
    }

    .site-description {
      margin: 0;

      color: #53647b;
      font-size: 11px;
      line-height: 1.45;
    }

    /* =====================================================
       グラフ領域
       ===================================================== */

    .chart-panel {
      padding: 15px 14px 10px;

      background: var(--panel-background);

      border: 1px solid var(--border-color);
      border-radius: 8px;

      box-shadow: var(--shadow);
    }

    .chart-container {
      position: relative;

      width: 100%;
      height: 520px;
    }

    .chart-help {
      margin: 10px 0 1px;

      color: #718096;
      font-size: 11px;
      text-align: center;
    }

    .chart-help strong {
      color: #4b78b8;
    }

    /* =====================================================
       データの扱い
       ===================================================== */

    .notes {
      margin-top: 16px;
      padding: 17px 18px;

      background: var(--soft-background);

      border-radius: 8px;
    }

    .notes-title {
      display: flex;
      align-items: center;
      gap: 8px;

      margin: 0 0 9px;

      font-size: 15px;
    }

    .notes-mark {
      display: inline-block;

      width: 22px;
      height: 22px;

      border-radius: 50%;

      background:
        linear-gradient(
          135deg,
          #c5df72 0 47%,
          #8fbd24 48% 100%
        );
    }

    .notes ul {
      margin: 0;
      padding-left: 21px;

      color: #4a5d77;
      font-size: 13px;
      line-height: 1.8;
    }

    /* =====================================================
       デバッグ情報
       ===================================================== */

    .diagnostics {
      margin-top: 14px;

      border: 1px solid var(--border-color);
      border-radius: 8px;
    }

    .diagnostics summary {
      padding: 12px 14px;

      font-size: 13px;
      font-weight: 700;

      cursor: pointer;
    }

    .diagnostics-content {
      padding: 0 14px 14px;

      color: #475467;
      font-size: 12px;
      line-height: 1.6;
    }

    .diagnostics-table-wrapper {
      overflow-x: auto;
    }

    .diagnostics table {
      width: 100%;
      border-collapse: collapse;
    }

    .diagnostics th,
    .diagnostics td {
      padding: 7px 8px;

      text-align: left;
      white-space: nowrap;

      border-bottom: 1px solid #e8edf3;
    }

    .diagnostics th {
      background: #f7f9fc;
    }

    /* =====================================================
       レスポンシブ対応
       ===================================================== */

    @media (max-width: 760px) {
      .page {
        padding: 10px;
      }

      .hero {
        padding: 17px 15px 15px;
      }

      .site-cards {
        grid-template-columns: 1fr;
      }

      .site-card {
        min-height: 0;
      }

      .chart-container {
        height: 430px;
      }

      .controls {
        align-items: stretch;
      }

      .control-group {
        flex: 1 1 auto;
      }

      select {
        flex: 1;
      }

      .action-button {
        flex: 1 1 auto;
      }
    }

    @media (max-width: 450px) {
      .chart-container {
        height: 380px;
      }

      .controls {
        display: grid;
        grid-template-columns: 1fr 1fr;
      }

      .action-button {
        width: 100%;
      }
    }
  </style>
<meta name="csrf-token" content="f4bf7985e90d336d4099838689a48da3cff51b8b56629966153a48313badeafd"></head>

<body>
  <main class="page">
    <header class="hero">
      <h1 class="hero-title">
        月間降下物量（セシウム137）超長期推移
      </h1>

      <div class="hero-divider"></div>

      <p
        id="periodLabel"
        class="hero-subtitle"
      >
        CSVを読み込んでいます
      </p>
    </header>

    <section
      class="controls"
      aria-label="表示年月とグラフ操作"
    >
      <div class="control-group">
        <label
          class="control-label"
          for="yearSelect"
        >
          年
        </label>

        <select
          id="yearSelect"
          aria-label="表示する年"
        ></select>
      </div>

      <div class="control-group">
        <label
          class="control-label"
          for="monthSelect"
        >
          月
        </label>

        <select
          id="monthSelect"
          aria-label="表示する月"
        ></select>
      </div>

      <button
        id="resetViewButton"
        class="action-button"
        type="button"
      >
        ↻ 全体表示
      </button>

      <button
        id="zoomViewButton"
        class="action-button"
        type="button"
      >
        ⛶ 拡大表示
      </button>
    </section>

    <div
      id="statusLine"
      class="status-line"
      aria-live="polite"
    ></div>

    <h2
      id="selectedMonthTitle"
      class="selected-month-title"
    >
      ―
    </h2>

    <section
      class="site-cards"
      aria-label="選択年月の地点別測定結果"
    >
      <article
        id="card-okuma"
        class="site-card okuma"
      >
        <h3 class="site-name">
          大熊町
        </h3>

        <p
          id="source-okuma"
          class="site-source"
        >
          採取：―
        </p>

        <p
          id="value-okuma"
          class="site-value"
        >
          ―
        </p>

        <p
          id="description-okuma"
          class="site-description"
        >
          CSVを読み込んでいます
        </p>
      </article>

      <article
        id="card-fukushima"
        class="site-card fukushima"
      >
        <h3 class="site-name">
          福島市
        </h3>

        <p
          id="source-fukushima"
          class="site-source"
        >
          採取：―
        </p>

        <p
          id="value-fukushima"
          class="site-value"
        >
          ―
        </p>

        <p
          id="description-fukushima"
          class="site-description"
        >
          CSVを読み込んでいます
        </p>
      </article>

      <article
        id="card-tokyo"
        class="site-card tokyo"
      >
        <h3 class="site-name">
          東京都新宿区
        </h3>

        <p
          id="source-tokyo"
          class="site-source"
        >
          採取：―
        </p>

        <p
          id="value-tokyo"
          class="site-value"
        >
          ―
        </p>

        <p
          id="description-tokyo"
          class="site-description"
        >
          CSVを読み込んでいます
        </p>
      </article>
    </section>

    <section class="chart-panel">
      <div class="chart-container">
        <canvas
          id="falloutChart"
          aria-label="セシウム137月間降下物量の長期推移"
        ></canvas>
      </div>

      <p class="chart-help">
        <strong>グラフ操作：</strong>
        マウスホイール／ピンチで横方向に拡大・縮小、
        ドラッグで表示範囲を移動できます。
      </p>
    </section>

    <section class="notes">
      <h2 class="notes-title">
        <span
          class="notes-mark"
          aria-hidden="true"
        ></span>

        データの扱い
      </h2>

      <ul>
         <li>
          環境放射線データベースから取得した
          Cs-137の月間降下物測定結果を表示しています。
        </li>

        <li>
          CSVに記録された実測値だけを表示しています。
        </li>

        <li>
          データが存在しない月は「欠測」とし、
          前後の実測値を線で結んで補間しません。
        </li>

        <li>
          同じ年月に複数の実測記録がある場合は、
          平均化せずにカードへすべての数値を表示しますが、対数グラフ上には最大値のみを描画します。
        </li>

        <li>
          ND（不検出・検出限界未満）はカードへ表示しますが、
          対数グラフ上には数値として描画しません。
        </li>

        <li>
          縦軸は対数表示です。大熊町の事故後の高値を含め、
          CSV内の全実測値から表示範囲を自動計算します。
        </li>
      </ul>
    </section>

    <details class="diagnostics">
      <summary>
        読み込み診断
      </summary>

      <div class="diagnostics-content">
        <p id="diagnosticsSummary">
          CSVを読み込んでいます。
        </p>

        <div class="diagnostics-table-wrapper">
          <table>
            <thead>
              <tr>
                <th>地点</th>
                <th>全件</th>
                <th>実測値</th>
                <th>ND</th>
                <th>最初の月</th>
                <th>最後の月</th>
                <th>最大値</th>
              </tr>
            </thead>

            <tbody id="diagnosticsBody"></tbody>
          </table>
        </div>
      </div>
    </details>
  </main>

  <script>
    "use strict";

    /* =====================================================
       基本設定
       ===================================================== */

    const CSV_FILE =
      "https://fukushima-30year-project.org/wp-content/uploads/2026/08/monthly-fallout-cs137-optimized.csv";

    const SITE_ORDER = [
      "okuma",
      "fukushima",
      "tokyo"
    ];

const SELECTABLE_START_MONTH = "1963-03";
    const DEFAULT_SITE_ID = "tokyo";

    const SITE_CONFIG = {
      okuma: {
        label: "大熊町",
        color: "#df2735"
      },

      fukushima: {
        label: "福島市",
        color: "#16a34a"
      },

      tokyo: {
        label: "東京都新宿区",
        color: "#2c63e6"
      }
    };

    let allRecords = [];
    let falloutChart = null;

    let dataStartMonth = "";
    let dataEndMonth = "";

    let fullXMinimum = 0;
    let fullXMaximum = 1;

    let fullYMinimum = 0.01;
    let fullYMaximum = 100;

    /* =====================================================
       DOM取得
       ===================================================== */

    const yearSelect = document.getElementById(
      "yearSelect"
    );

    const monthSelect = document.getElementById(
      "monthSelect"
    );

    const resetViewButton =
      document.getElementById(
        "resetViewButton"
      );

    const zoomViewButton =
      document.getElementById(
        "zoomViewButton"
      );

    const periodLabel = document.getElementById(
      "periodLabel"
    );

    const statusLine = document.getElementById(
      "statusLine"
    );

    const selectedMonthTitle =
      document.getElementById(
        "selectedMonthTitle"
      );

    /* =====================================================
       文字列・数値処理
       ===================================================== */

    function normalizeText(value) {
      if (
        value === null ||
        value === undefined
      ) {
        return "";
      }

      return String(value)
        .replace(/^\uFEFF/, "")
        .trim();
    }

    function parsePositiveNumber(rawValue) {
      if (
        rawValue === null ||
        rawValue === undefined ||
        rawValue === ""
      ) {
        return null;
      }

      const normalized = String(rawValue)
        .replace(/,/g, "")
        .replace(/[　\s]/g, "")
        .trim();

      const numericValue = Number(normalized);

      if (
        !Number.isFinite(numericValue) ||
        numericValue <= 0
      ) {
        return null;
      }

      return numericValue;
    }

    function formatValue(value) {
      if (
        value === null ||
        value === undefined ||
        !Number.isFinite(value)
      ) {
        return "";
      }

      return value.toLocaleString(
        "ja-JP",
        {
          maximumFractionDigits: 8
        }
      );
    }

    function escapeHtml(value) {
      return String(value)
        .replace(/&/g, "&amp;")
        .replace(/</g, "&lt;")
        .replace(/>/g, "&gt;")
        .replace(/"/g, "&quot;")
        .replace(/'/g, "&#039;");
    }

    /* =====================================================
       年月処理
       ===================================================== */

    function isValidMonthText(value) {
      return /^\d{4}-\d{2}$/.test(value);
    }

    function monthToIndex(monthText) {
      if (!isValidMonthText(monthText)) {
        return null;
      }

      const [
        yearText,
        monthNumberText
      ] = monthText.split("-");

      const year = Number(yearText);
      const monthNumber = Number(
        monthNumberText
      );

      if (
        !Number.isInteger(year) ||
        !Number.isInteger(monthNumber) ||
        monthNumber < 1 ||
        monthNumber > 12
      ) {
        return null;
      }

      return year * 12 + monthNumber - 1;
    }

    function indexToMonth(monthIndex) {
      const roundedIndex = Math.round(
        monthIndex
      );

      const year = Math.floor(
        roundedIndex / 12
      );

      const monthNumber = (
        roundedIndex % 12
      ) + 1;

      return (
        `${String(year).padStart(4, "0")}-` +
        `${String(monthNumber).padStart(2, "0")}`
      );
    }

    function displayMonth(monthText) {
      if (!isValidMonthText(monthText)) {
        return monthText;
      }

      const [year, month] =
        monthText.split("-");

      return (
        `${Number(year)}年` +
        `${Number(month)}月`
      );
    }

    function enumerateMonths(
      startMonth,
      endMonth
    ) {
      const startIndex = monthToIndex(
        startMonth
      );

      const endIndex = monthToIndex(
        endMonth
      );

      if (
        startIndex === null ||
        endIndex === null ||
        startIndex > endIndex
      ) {
        return [];
      }

      const months = [];

      for (
        let index = startIndex;
        index <= endIndex;
        index += 1
      ) {
        months.push(indexToMonth(index));
      }

      return months;
    }

    /* =====================================================
       CSVレコード正規化
       ===================================================== */

    function normalizeRecord(record) {
      const month = normalizeText(
        record.month
      );

      const siteId = normalizeText(
        record.site_id
      ).toLowerCase();

      const status = normalizeText(
        record.status
      ).toLowerCase();

      const numericValue =
        parsePositiveNumber(
          record.value_bq_m2_month
        );

      return {
        ...record,

        month,
        site_id: siteId,
        site_name: normalizeText(
          record.site_name
        ),

        status,

        value_bq_m2_month:
          normalizeText(
            record.value_bq_m2_month
          ),

        sampling_location:
          normalizeText(
            record.sampling_location
          ),

        sampling_organization:
          normalizeText(
            record.sampling_organization
          ),

        analysis_organization:
          normalizeText(
            record.analysis_organization
          ),

        detection_limit_bq_m2_month:
          normalizeText(
            record
              .detection_limit_bq_m2_month
          ),

        record_key: normalizeText(
          record.record_key
        ),

        numericValue: (
          status === "value"
            ? numericValue
            : null
        )
      };
    }

    /* =====================================================
       データ取得
       ===================================================== */

    async function loadCsvRecords() {
      /*
       * キャッシュされた古いCSVを読まないよう、
       * タイムスタンプを付けます。
       */
      const requestUrl = (
        `${CSV_FILE}?v=${Date.now()}`
      );

      const response = await fetch(
        requestUrl,
        {
          cache: "no-store"
        }
      );

      if (!response.ok) {
        throw new Error(
          "CSVの読み込みに失敗しました。" +
          ` HTTP ${response.status}`
        );
      }

      const csvText = await response.text();

      const parsed = Papa.parse(
        csvText,
        {
          header: true,
          skipEmptyLines: true,

          transformHeader(header) {
            return normalizeText(header);
          }
        }
      );

      if (
        parsed.errors &&
        parsed.errors.length > 0
      ) {
        console.warn(
          "CSV解析時の警告:",
          parsed.errors
        );
      }

      const normalizedRecords = parsed.data
        .map(normalizeRecord)
        .filter((record) => {
          return (
            isValidMonthText(record.month) &&
            SITE_ORDER.includes(
              record.site_id
            )
          );
        });

      if (normalizedRecords.length === 0) {
        throw new Error(
          "CSVから対象レコードを" +
          "読み込めませんでした。" +
          "month、site_id、status、" +
          "value_bq_m2_month列を" +
          "確認してください。"
        );
      }

      return normalizedRecords;
    }

    /* =====================================================
       月別データ取得
       ===================================================== */

    function getRecordsForMonth(
      siteId,
      month
    ) {
      return allRecords
        .filter((record) => {
          return (
            record.site_id === siteId &&
            record.month === month
          );
        })
        .sort((left, right) => {
          const leftValue = (
            left.numericValue ??
            Number.POSITIVE_INFINITY
          );

          const rightValue = (
            right.numericValue ??
            Number.POSITIVE_INFINITY
          );

          if (leftValue !== rightValue) {
            return leftValue - rightValue;
          }

          return (
            left.record_key ||
            ""
          ).localeCompare(
            right.record_key || ""
          );
        });
    }

    function makeSourceText(records) {
      const organizations = [
        ...new Set(
          records
            .map((record) => {
              return (
                record.sampling_organization ||
                record.sampling_location
              );
            })
            .filter(Boolean)
        )
      ];

      if (organizations.length === 0) {
        return "採取：記録なし";
      }

      if (organizations.length === 1) {
        return (
          `採取：${organizations[0]}`
        );
      }

      return (
        "採取：" +
        organizations.join("／")
      );
    }

    function buildCardResult(records) {
      const measuredRecords = records.filter(
        (record) => {
          return (
            record.status === "value" &&
            record.numericValue !== null
          );
        }
      );

      if (measuredRecords.length > 0) {
        const values = measuredRecords.map(
          (record) => record.numericValue
        );

        return {
          valueText: values
            .map(formatValue)
            .join("／"),

          description: (
            measuredRecords.length > 1
              ? "同じ年月に複数の実測記録があります（Bq/m²・月）"
              : "Bq/m²・月・実測値"
          )
        };
      }

      const ndRecords = records.filter(
        (record) => {
          return record.status === "nd";
        }
      );

      if (ndRecords.length > 0) {
        const detectionLimits = [
          ...new Set(
            ndRecords
              .map((record) => {
                return parsePositiveNumber(
                  record
                    .detection_limit_bq_m2_month
                );
              })
              .filter((value) => {
                return value !== null;
              })
              .map(formatValue)
          )
        ];

        return {
          valueText: "ND",

          description: (
            detectionLimits.length > 0
              ? (
                "不検出・検出限界：" +
                detectionLimits.join("／") +
                " Bq/m²・月"
              )
              : "不検出または検出限界未満"
          )
        };
      }

      return {
        valueText: "欠測",
        description:
          "CSVに該当する測定記録がありません"
      };
    }

    function updateSiteCard(
      siteId,
      month
    ) {
      const records = getRecordsForMonth(
        siteId,
        month
      );

      const sourceElement =
        document.getElementById(
          `source-${siteId}`
        );

      const valueElement =
        document.getElementById(
          `value-${siteId}`
        );

      const descriptionElement =
        document.getElementById(
          `description-${siteId}`
        );

      const result = buildCardResult(
        records
      );

      sourceElement.textContent =
        makeSourceText(records);

      valueElement.textContent =
        result.valueText;

      descriptionElement.textContent =
        result.description;
    }

    function updateSelectedMonthCards() {
      const year = Number(
        yearSelect.value
      );

      const monthNumber = Number(
        monthSelect.value
      );

      if (
        !Number.isInteger(year) ||
        !Number.isInteger(monthNumber)
      ) {
        return;
      }

      const month = (
        `${String(year).padStart(4, "0")}-` +
        `${String(monthNumber).padStart(2, "0")}`
      );

      selectedMonthTitle.textContent =
        displayMonth(month);

      for (const siteId of SITE_ORDER) {
        updateSiteCard(siteId, month);
      }
    }

/* =====================================================
   年月選択欄
   ===================================================== */

function createYearMonthSelectors() {
  const startIndex = monthToIndex(
    SELECTABLE_START_MONTH
  );

  const endIndex = monthToIndex(
    dataEndMonth
  );

  console.log(
    "年月セレクト作成範囲:",
    SELECTABLE_START_MONTH,
    dataEndMonth,
    startIndex,
    endIndex
  );

  yearSelect.innerHTML = "";

  if (
    startIndex === null ||
    endIndex === null ||
    startIndex > endIndex
  ) {
    console.warn(
      "年月セレクトを作成できません:",
      SELECTABLE_START_MONTH,
      dataEndMonth
    );

    return;
  }

  const startYear = Math.floor(
    startIndex / 12
  );

  const endYear = Math.floor(
    endIndex / 12
  );

  for (
    let year = startYear;
    year <= endYear;
    year += 1
  ) {
    const option = document.createElement(
      "option"
    );

    option.value = String(year);
    option.textContent = `${year}年`;

    yearSelect.appendChild(option);
  }

  monthSelect.innerHTML = "";

  for (
    let monthNumber = 1;
    monthNumber <= 12;
    monthNumber += 1
  ) {
    const option = document.createElement(
      "option"
    );

    option.value = String(monthNumber);
    option.textContent =
      `${monthNumber}月`;

    monthSelect.appendChild(option);
  }

  const defaultMonth = chooseDefaultMonth();

  const [
    defaultYear,
    defaultMonthNumber
  ] = defaultMonth.split("-");

  yearSelect.value = String(
    Number(defaultYear)
  );

  monthSelect.value = String(
    Number(defaultMonthNumber)
  );

  console.log(
    "年月セレクト作成完了:",
    "先頭年=",
    yearSelect.options[0]?.value,
    "末尾年=",
    yearSelect.options[
      yearSelect.options.length - 1
    ]?.value,
    "初期選択=",
    yearSelect.value,
    monthSelect.value
  );
}

function chooseDefaultMonth() {
  const initialMonth = "2011-03";

  if (
    allRecords.some((record) => {
      return record.month === initialMonth;
    })
  ) {
    return initialMonth;
  }

  return SELECTABLE_START_MONTH;
}


    /* =====================================================
       グラフ用データ
       ===================================================== */

    function buildDatasetPoints(siteId) {
      const months = enumerateMonths(
        dataStartMonth,
        dataEndMonth
      );

      const recordsByMonth = new Map();

      for (const record of allRecords) {
        if (record.site_id !== siteId) {
          continue;
        }

        if (!recordsByMonth.has(record.month)) {
          recordsByMonth.set(
            record.month,
            []
          );
        }

        recordsByMonth
          .get(record.month)
          .push(record);
      }

      const points = [];

      for (const month of months) {
        const monthIndex = monthToIndex(
          month
        );

        const monthRecords = (
          recordsByMonth.get(month) || []
        );

        const measuredRecords =
          monthRecords
            .filter((record) => {
              return (
                record.status === "value" &&
                record.numericValue !== null
              );
            })
            .sort((left, right) => {
              return (
                left.numericValue -
                right.numericValue
              );
            });

        if (measuredRecords.length === 0) {
          /*
           * null点を明示的に挿入します。
           * spanGaps:false と組み合わせることで、
           * 欠測期間を線で結びません。
           */
          points.push({
            x: monthIndex,
            y: null,
            month,
            record: null
          });

          continue;
        }

         /*
         * 同じ月に複数の測定値がある場合、
         * 最大値（一番高い数値）のみをグラフに描画します。
         */
        const maxRecord = measuredRecords[measuredRecords.length - 1];
        points.push({
          x: monthIndex,
          y: maxRecord.numericValue,
          month,
          record: maxRecord
        });
      }
      return points;
    }

    function buildChartDatasets() {
      return SITE_ORDER.map((siteId) => {
        const config = SITE_CONFIG[siteId];

        return {
          label: config.label,

          data: buildDatasetPoints(
            siteId
          ),

          parsing: false,

          borderColor: config.color,
          backgroundColor: config.color,

          borderWidth: 1.4,

          pointRadius: 1.2,
          pointHoverRadius: 5,
          pointHitRadius: 8,

          showLine: true,
          spanGaps: false,

          tension: 0,

          /*
           * 欠測をまたぐ線だけでなく、
           * 離れた月を直接結ぶ事故も防止します。
           */
          segment: {
            borderColor(context) {
              const left = context.p0.raw;
              const right = context.p1.raw;

              if (
                !left ||
                !right ||
                left.y === null ||
                right.y === null
              ) {
                return "rgba(0,0,0,0)";
              }

              const monthDifference = (
                right.x - left.x
              );

              if (monthDifference > 1) {
                return "rgba(0,0,0,0)";
              }

              return config.color;
            }
          }
        };
      });
    }

    /* =====================================================
       対数軸範囲
       ===================================================== */

    function calculateLogarithmicBounds() {
      const values = allRecords
        .map((record) => {
          return record.numericValue;
        })
        .filter((value) => {
          return (
            value !== null &&
            Number.isFinite(value) &&
            value > 0
          );
        });

      if (values.length === 0) {
        return {
          minimum: 0.01,
          maximum: 100
        };
      }

      const smallest = Math.min(...values);
      const largest = Math.max(...values);

      let minimum = 10 ** Math.floor(
        Math.log10(smallest)
      );

      let maximum = 10 ** Math.ceil(
        Math.log10(largest)
      );

      /*
       * 最大値が10の累乗と一致した場合も、
       * 上端に張り付かないよう1桁広げます。
       */
      if (maximum <= largest) {
        maximum *= 10;
      }

      /*
       * 小さい値の表示余地を確保します。
       * 元データがさらに小さい場合は、
       * その値に合わせて下がります。
       */
      minimum = Math.min(
        minimum,
        0.01
      );

      if (
        !Number.isFinite(minimum) ||
        minimum <= 0
      ) {
        minimum = 0.01;
      }

      if (
        !Number.isFinite(maximum) ||
        maximum <= minimum
      ) {
        maximum = minimum * 10000;
      }

      return {
        minimum,
        maximum
      };
    }

    function isPowerOfTen(value) {
      if (
        !Number.isFinite(value) ||
        value <= 0
      ) {
        return false;
      }

      const logarithm = Math.log10(value);

      return (
        Math.abs(
          logarithm -
          Math.round(logarithm)
        ) < 1e-9
      );
    }

    /* =====================================================
       Chart.js作成
       ===================================================== */

    function createChart() {
      const canvas = document.getElementById(
        "falloutChart"
      );

      if (!canvas) {
        throw new Error(
          "グラフ用canvasが見つかりません。"
        );
      }

      const datasets = buildChartDatasets();

      const logarithmicBounds =
        calculateLogarithmicBounds();

      fullXMinimum = monthToIndex(
        dataStartMonth
      );

      fullXMaximum = monthToIndex(
        dataEndMonth
      );

      fullYMinimum =
        logarithmicBounds.minimum;

      fullYMaximum =
        logarithmicBounds.maximum;

      if (falloutChart) {
        falloutChart.destroy();
        falloutChart = null;
      }

      falloutChart = new Chart(
        canvas.getContext("2d"),
        {
          type: "line",

          data: {
            datasets
          },

          options: {
            responsive: true,
            maintainAspectRatio: false,

            animation: false,

            normalized: true,

            interaction: {
              mode: "nearest",
              intersect: false,
              axis: "xy"
            },

            scales: {
              x: {
                type: "linear",

                min: fullXMinimum,
                max: fullXMaximum,

                grid: {
                  display: false
                },

                ticks: {
                  maxTicksLimit: 14,
                  maxRotation: 0,
                  minRotation: 0,

                  callback(value) {
                    const month =
                      indexToMonth(value);

                    const year = Number(
                      month.slice(0, 4)
                    );

                    return `${year}年`;
                  }
                }
              },

              y: {
                type: "logarithmic",

                min: fullYMinimum,
                max: fullYMaximum,

                beginAtZero: false,

                title: {
                  display: true,
                  text:
                    "Cs-137（Bq/m²・月）"
                },

                ticks: {
                  callback(value) {
                    const numericValue =
                      Number(value);

                    if (
                      !isPowerOfTen(
                        numericValue
                      )
                    ) {
                      return "";
                    }

                    return numericValue
                      .toLocaleString(
                        "ja-JP"
                      );
                  }
                }
              }
            },

            plugins: {
              legend: {
                display: true,
                position: "top",

                labels: {
                  boxWidth: 15,
                  boxHeight: 12,
                  padding: 12
                }
              },

              tooltip: {
                filter(context) {
                  return (
                    context.raw &&
                    context.raw.y !== null &&
                    context.raw.record
                  );
                },

                callbacks: {
                  title(items) {
                    if (
                      !items ||
                      items.length === 0
                    ) {
                      return "";
                    }

                    const raw =
                      items[0].raw;

                    return displayMonth(
                      raw.month
                    );
                  },

                  label(context) {
                    const raw = context.raw;

                    return (
                      `${context.dataset.label}: ` +
                      `${formatValue(raw.y)} ` +
                      "Bq/m²・月"
                    );
                  },

                  afterLabel(context) {
                    const record =
                      context.raw.record;

                    if (!record) {
                      return [];
                    }

                    const lines = [];

                    if (
                      record.sampling_location
                    ) {
                      lines.push(
                        "採取地点：" +
                        record
                          .sampling_location
                      );
                    }

                    if (
                      record
                        .sampling_organization
                    ) {
                      lines.push(
                        "採取機関：" +
                        record
                          .sampling_organization
                      );
                    }

                    if (
                      record
                        .analysis_organization
                    ) {
                      lines.push(
                        "分析機関：" +
                        record
                          .analysis_organization
                      );
                    }

                    return lines;
                  }
                }
              },

              zoom: {
                limits: {
                  x: {
                    min: fullXMinimum,
                    max: fullXMaximum,
                    minRange: 3
                  },

                  y: {
                    min: fullYMinimum,
                    max: fullYMaximum
                  }
                },

                pan: {
                  enabled: true,
                  mode: "x"
                },

                zoom: {
                  wheel: {
                    enabled: true,
                    speed: 0.08
                  },

                  pinch: {
                    enabled: true
                  },

                  /*
                   * 縦軸の拡大を禁止します。
                   * 大熊町の高値が画面外へ消えるのを
                   * 防ぐためです。
                   */
                  mode: "x"
                }
              }
            }
          }
        }
      );
    }

    /* =====================================================
       グラフ操作
       ===================================================== */

    function restoreYAxis() {
      if (!falloutChart) {
        return;
      }

      falloutChart.options.scales.y.min =
        fullYMinimum;

      falloutChart.options.scales.y.max =
        fullYMaximum;

      const zoomOptions = (
        falloutChart.options
          .plugins
          ?.zoom
      );

      if (zoomOptions?.limits?.y) {
        zoomOptions.limits.y.min =
          fullYMinimum;

        zoomOptions.limits.y.max =
          fullYMaximum;
      }
    }

    function resetChartView() {
      if (!falloutChart) {
        return;
      }

      if (
        typeof falloutChart.resetZoom ===
        "function"
      ) {
        falloutChart.resetZoom();
      }

      falloutChart.options.scales.x.min =
        fullXMinimum;

      falloutChart.options.scales.x.max =
        fullXMaximum;

      restoreYAxis();

      falloutChart.update("none");
    }

    function zoomToSelectedMonth() {
      if (!falloutChart) {
        return;
      }

      const year = Number(
        yearSelect.value
      );

      const monthNumber = Number(
        monthSelect.value
      );

      const selectedMonth = (
        `${String(year).padStart(4, "0")}-` +
        `${String(monthNumber).padStart(2, "0")}`
      );

      const center = monthToIndex(
        selectedMonth
      );

      if (center === null) {
        return;
      }

      /*
       * 選択月の前後2年を表示します。
       */
      const requestedMinimum =
        center - 6;

      const requestedMaximum =
        center + 6;

      falloutChart.options.scales.x.min =
        Math.max(
          fullXMinimum,
          requestedMinimum
        );

      falloutChart.options.scales.x.max =
        Math.min(
          fullXMaximum,
          requestedMaximum
        );

      restoreYAxis();

      falloutChart.update("none");
    }

    /* =====================================================
       診断表示
       ===================================================== */

    function updateDiagnostics() {
      const diagnosticsSummary =
        document.getElementById(
          "diagnosticsSummary"
        );

      const diagnosticsBody =
        document.getElementById(
          "diagnosticsBody"
        );

      const numericValues = allRecords
        .map((record) => {
          return record.numericValue;
        })
        .filter((value) => {
          return value !== null;
        });

      const globalMaximum = (
        numericValues.length > 0
          ? Math.max(...numericValues)
          : null
      );

      diagnosticsSummary.textContent = (
        `読み込み件数：` +
        `${allRecords.length.toLocaleString("ja-JP")}件、` +
        `期間：${displayMonth(dataStartMonth)}～` +
        `${displayMonth(dataEndMonth)}、` +
        `最大実測値：` +
        (
          globalMaximum !== null
            ? `${formatValue(globalMaximum)} Bq/m²・月`
            : "なし"
        ) +
        `、縦軸上限：` +
        `${formatValue(fullYMaximum)}`
      );

      diagnosticsBody.innerHTML = "";

      for (const siteId of SITE_ORDER) {
        const config = SITE_CONFIG[siteId];

        const siteRecords = allRecords.filter(
          (record) => {
            return record.site_id === siteId;
          }
        );

        const measuredRecords =
          siteRecords.filter((record) => {
            return (
              record.status === "value" &&
              record.numericValue !== null
            );
          });

        const ndRecords = siteRecords.filter(
          (record) => {
            return record.status === "nd";
          }
        );

        const months = [
          ...new Set(
            siteRecords.map((record) => {
              return record.month;
            })
          )
        ].sort();

        const values = measuredRecords.map(
          (record) => record.numericValue
        );

        const maximum = (
          values.length > 0
            ? Math.max(...values)
            : null
        );

        const row = document.createElement(
          "tr"
        );

        row.innerHTML = `
          <td>${escapeHtml(config.label)}</td>
          <td>${siteRecords.length.toLocaleString("ja-JP")}</td>
          <td>${measuredRecords.length.toLocaleString("ja-JP")}</td>
          <td>${ndRecords.length.toLocaleString("ja-JP")}</td>
          <td>${
            months.length > 0
              ? escapeHtml(months[0])
              : "―"
          }</td>
          <td>${
            months.length > 0
              ? escapeHtml(
                  months[months.length - 1]
                )
              : "―"
          }</td>
          <td>${
            maximum !== null
              ? escapeHtml(
                  formatValue(maximum)
                )
              : "―"
          }</td>
        `;

        diagnosticsBody.appendChild(row);
      }

      printConsoleDiagnostics();
    }

    function printConsoleDiagnostics() {
      console.group(
        "月間降下物CSV読み込み診断"
      );

      console.log(
        "全レコード数:",
        allRecords.length
      );

      console.log(
        "表示期間:",
        dataStartMonth,
        "～",
        dataEndMonth
      );

      console.log(
        "縦軸範囲:",
        fullYMinimum,
        "～",
        fullYMaximum
      );

      for (const targetMonth of [
        "2011-03",
        "2013-03",
        "2020-03"
      ]) {
        console.group(targetMonth);

        for (const siteId of SITE_ORDER) {
          const selectedRecords =
            getRecordsForMonth(
              siteId,
              targetMonth
            );

          console.log(
            siteId,
            selectedRecords.map(
              (record) => {
                return {
                  month: record.month,
                  status: record.status,
                  rawValue:
                    record
                      .value_bq_m2_month,
                  numericValue:
                    record.numericValue,
                  samplingLocation:
                    record
                      .sampling_location,
                  samplingOrganization:
                    record
                      .sampling_organization
                };
              }
            )
          );
        }

        console.groupEnd();
      }

      console.groupEnd();
    }

    /* =====================================================
       初期化
       ===================================================== */

    async function initializePage() {
      try {
        statusLine.classList.remove(
          "is-error"
        );

        statusLine.textContent =
          "CSVを読み込んでいます。";

        allRecords = await loadCsvRecords();

        allRecords.sort(
          (left, right) => {
            const monthDifference = (
              monthToIndex(left.month) -
              monthToIndex(right.month)
            );

            if (monthDifference !== 0) {
              return monthDifference;
            }

            const siteDifference = (
              SITE_ORDER.indexOf(
                left.site_id
              ) -
              SITE_ORDER.indexOf(
                right.site_id
              )
            );

            if (siteDifference !== 0) {
              return siteDifference;
            }

            return (
              left.numericValue ?? 0
            ) - (
              right.numericValue ?? 0
            );
          }
        );

        const allMonths = [
          ...new Set(
            allRecords.map((record) => {
              return record.month;
            })
          )
        ].sort();

dataStartMonth = SELECTABLE_START_MONTH;

dataEndMonth = (
  allMonths[allMonths.length - 1]
);

        periodLabel.textContent = (
          `${displayMonth(dataStartMonth)}～` +
          `${displayMonth(dataEndMonth)}・実測値`
        );

       createYearMonthSelectors();
createChart();
updateSelectedMonthCards();

// 初期表示を全体表示にするため、ズーム処理を無効化
// zoomToSelectedMonth();

updateDiagnostics();

        statusLine.textContent = (
          `${allRecords.length.toLocaleString("ja-JP")}件の` +
          "レコードを読み込みました。"
        );
      } catch (error) {
        console.error(error);

        statusLine.classList.add(
          "is-error"
        );

        statusLine.textContent = (
          error instanceof Error
            ? error.message
            : String(error)
        );

        periodLabel.textContent =
          "CSVを読み込めませんでした";

        selectedMonthTitle.textContent =
          "読み込みエラー";

        for (const siteId of SITE_ORDER) {
          document.getElementById(
            `value-${siteId}`
          ).textContent = "―";

          document.getElementById(
            `description-${siteId}`
          ).textContent =
            "CSVの読み込みに失敗しました";
        }
      }
    }

    /* =====================================================
       イベント
       ===================================================== */

  yearSelect.addEventListener(
  "change",
  () => {
    updateSelectedMonthCards();
    zoomToSelectedMonth();
  }
);

monthSelect.addEventListener(
  "change",
  () => {
    updateSelectedMonthCards();
    zoomToSelectedMonth();
  }
);

    resetViewButton.addEventListener(
      "click",
      resetChartView
    );

    zoomViewButton.addEventListener(
      "click",
      zoomToSelectedMonth
    );

    document.addEventListener(
      "DOMContentLoaded",
      initializePage
    );
  </script>
</body>
</html>











































<hr class="clearHidden">
































<hr class="custom-hr">







<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<p class="separator" style="clear: both; text-align: center;"><img src="https://minnanods.net/media/001/202505/marinari.png" alt="" width="23" height="23" class="aligncenter size-full " /><font size="5"><a href="#top">　トップへ戻る　</a></font><img src="https://minnanods.net/media/001/202505/marinari.png" alt="" width="23" height="23" class="aligncenter size-full " /></p>










































]]></description>
<category>日本の放射能汚染の現状</category>
<guid isPermaLink="true">https://minnanods.net/learn/contamination-level-of-japan/entry-1831.html</guid>
<pubDate>Thu, 27 Aug 2026 21:17:35 +0900</pubDate>
</item>
<item>
<dc:creator>みんなのデータサイト</dc:creator>
<title>【オンライン講座】第五福竜丸のビキニ被曝と ゴジラの誕生ー核と人間と怪獣</title>
<link>https://minnanods.net/blog/entry-1832.html</link>
<description><![CDATA[






















<!-- media -->
<div class="column-media-center js_notStyle acms-col-sm-12">

<a href="https://peatix.com/event/5148434">
<img class="columnImage"
 src="https://minnanods.net/media/003/202608/mode3_w700-%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2026-08-27_13.34.24.png?v=20260827133637"
 alt="">
</a>
<p class="caption">詳細・申込は画像をクリック</p>


</div>






















<hr class="clearHidden">

<!-- テキスト -->

<p><a href="https://peatix.com/event/5148434" target="_blank" rel="noopener noreferrer">お申し込みはこちら（Peatixの申し込みページが開きます）</a><br />
Peatixを使った申し込みが難しい方は、minnanods@gmail.comへ、「9月ゴジラ学習会参加申し込み」、と題して、お問合せください。</p>










































<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<p>9月の月例オンライン講座は、ゴジラの専門家である山口さんをゲストにお迎えします。<br />
<br />
<br />
第五福竜丸のビキニ被曝とゴジラの誕生ー核と人間と怪獣<br />
<br />
ゴジラは、1954年3月1日の日本のマグロ漁船、アメリカによる水爆実験、第五福竜丸の被曝という出来事をきっかけに着想された怪獣であった。<br />
<br />
そもそも日本には、まだ「怪獣映画」という分野がなかったが、ゴジラの登場によって新しい領域が切り開かれ、70年以上も継続されることになった。<br />
<br />
ゴジラとは、人間が自然を完全に支配し制御しきれたとおもった瞬間に自然が、人間の科学文明に反逆を開始するという物語にかかわるなにものかである。<br />
<br />
以下のような構成で映像も交えながらこのゴジラについて考えてみたい。<br />
<br />
はじめに<br />
<br />
1．ゴジラ誕生の背景<br />
<br />
2．日本にとって第三の被曝としての第五福竜丸の被曝<br />
<br />
3．原点としての『ゴジラ』(1954)に着目するー戦争映画としての怪獣映画<br />
<br />
4．日米怪獣映画の比較ー核や放射能はどのように描かれているのか<br />
<br />
5．戦後民主主義の科学観と『ゴジラ』(1954)の科学観<br />
<br />
6．なぜゴジラは恐竜スタイルなのか<br />
<br />
7．ゴジラと破壊ー破壊的性格としてのゴジラ<br />
<br />
8．ウルトラベーコン的科学とゴジラ<br />
<br />
おわりに<br />
<br />
<br />
<br />
◎山口直樹さんプロフィール<br />
<br />
1991年、東北大学理学部物理学科卒業後、塾講師や新聞記者を経て東北大学大学院国際文化研究科、同経済学研究科修了。<br />
<br />
2003年北京大学科学と社会研究センターに研究留学、2009年に修了。専門は、近代日本植民地科学史研究、近現代中国科学史研究、現代中国科学技術社会論研究など。<br />
<br />
2008年には日中学術交流のための組織、北京日本人学術交流会を創設。現在まで北京で347回まで実施する。<br />
<br />
主要な論文に「蔡元培の学問観－科学史家の視点から」『葦牙』（42号,2016）「西光万吉とベンヤミンの思想における比較研究－田中愛子の絶筆の詩「今、光っていたい」の思想をてがかりに」『葦牙』（43号,2017）「満鉄中央試験所の化学技術者たちは、「満州」の資源をどのように認識していたのか」『人文社会論叢』（2019）『ゴジラの来る前夜にーゴジラと市民科学』『市民科学通信』（2020）「ゴジラの政治学」『現代の理論』（同時代社 2021年秋号）などがある。<br />
<br />
また、共著には『在中日本人108人のそれでも私たちが中国に住む理由』（阪急コミュニケーション,2013）『日中関係は本当に最悪なのか―政治対立下の経済発信力』（日本僑報社,2014）などがある。<br />
<br />
</p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/003/202608/%E5%B1%B1%E5%8F%A3%E7%9B%B4%E6%A8%B9_%E3%83%95%E3%82%9A%E3%83%AD%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E5%86%99%E7%9C%9F.png?v=20260827133752" data-rel="SmartPhoto[1832]">
<img class="columnImage"
 src="https://minnanods.net/media/003/202608/mode3_w600-%E5%B1%B1%E5%8F%A3%E7%9B%B4%E6%A8%B9_%E3%83%95%E3%82%9A%E3%83%AD%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E5%86%99%E7%9C%9F.png?v=20260827133752"
 alt="">
</a>


</div>






















<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<p>あのゴジラを通じて、核兵器開発の歴史、被曝について考察するまたとない機会となるでしょう。<br />
ぜひ奮ってご参加ください！<br />
</p>










































<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<p><a href="https://peatix.com/event/5148434" target="_blank" rel="noopener noreferrer">お申し込みはこちら（Peatixの申し込みページが開きます）</a><br />
Peatixを使った申し込みが難しい方は、minnanods@gmail.comへ、「9月ゴジラ学習会参加申し込み」、と題して、お問合せください。</p>










































]]></description>
<guid isPermaLink="true">https://minnanods.net/blog/entry-1832.html</guid>
<pubDate>Thu, 27 Aug 2026 13:27:48 +0900</pubDate>
</item>
<item>
<dc:creator>みんなのデータサイト</dc:creator>
<title>市民測定室のつくりかた｜現場ノート　Vol.11 用語集候補　放射線・放射能の基本概念　</title>
<link>https://minnanods.net/blog/entry-1830.html</link>
<description><![CDATA[




<!-- テキスト -->

<p>ガイドブックに掲載する用語集の検討も進めています。<br />
まだ増えると思いますし、基礎的な用語とちょっと専門的な用語が混在していますので、これを全部載せるかも検討していきますが、このような感じで、あまり説明が長すぎないようなできるだけ読みやすい用語集を作って掲載していきたいと考えています。<br />
<br />
今回は、放射線・放射能の基本概念の用語です。<br />
</p>











































<!-- テキスト -->

<h2 >1. 放射線・放射能の基本概念</h2>











































<!-- テキスト -->

<p><div style="margin: 0; padding: 0;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<table style="width: 100%; border-collapse: collapse; border-spacing: 0; margin: 0; padding: 0; font-size: 18px; line-height: 1.5;"><thead><tr><th style="width: 23%; border: 1px solid #000; padding: 8px; text-align: center; font-weight: bold;"><br />
用語<br />
</th><th style="width: 77%; border: 1px solid #000; padding: 8px; text-align: center; font-weight: bold;"><br />
読解上つまずきやすい点<br />
</th></tr></thead><tbody><tr><td style="border: 1px solid #000; padding: 8px; font-weight: bold;">放射線</td><td style="border: 1px solid #000; padding: 8px;"><br />
α線・β線・γ線・X線・中性子線などの総称。物質を透過したり電離したりする「飛んでくるもの」<br />
</td></tr><tr><td style="border: 1px solid #000; padding: 8px; font-weight: bold;">放射能</td><td style="border: 1px solid #000; padding: 8px;"><br />
放射性物質が放射線を出す能力。単位はBq（ベクレル）<br />
</td></tr><tr><td style="border: 1px solid #000; padding: 8px; font-weight: bold;">放射性物質</td><td style="border: 1px solid #000; padding: 8px;"><br />
放射線を出す原子核を含む物質<br />
</td></tr><tr><td style="border: 1px solid #000; padding: 8px; font-weight: bold;">放射性核種</td><td style="border: 1px solid #000; padding: 8px;"><br />
Cs-137（セシウム137）、I-131（ヨウ素131）、K-40（カリウム40）など、放射能をもつ核種<br />
</td></tr><tr><td style="border: 1px solid #000; padding: 8px; font-weight: bold;">核種</td><td style="border: 1px solid #000; padding: 8px;"><br />
原子核の種類。元素名とは異なり、陽子数・中性子数で区別される<br />
</td></tr><tr><td style="border: 1px solid #000; padding: 8px; font-weight: bold;">同位体</td><td style="border: 1px solid #000; padding: 8px;"><br />
同じ元素（陽子の数＝原子番号）だが中性子数が異なる核種<br />
</td></tr><tr><td style="border: 1px solid #000; padding: 8px; font-weight: bold;">崩壊</td><td style="border: 1px solid #000; padding: 8px;"><br />
不安定な原子核が別の核種に変わり、放射線を出すこと<br />
</td></tr><tr><td style="border: 1px solid #000; padding: 8px; font-weight: bold;">壊変</td><td style="border: 1px solid #000; padding: 8px;"><br />
崩壊とほぼ同じ意味で使われる<br />
</td></tr><tr><td style="border: 1px solid #000; padding: 8px; font-weight: bold;">半減期</td><td style="border: 1px solid #000; padding: 8px;"><br />
放射能が半分になるまでの時間。物質量が一気に消えるわけではない<br />
</td></tr><tr><td style="border: 1px solid #000; padding: 8px; font-weight: bold;">物理学的半減期</td><td style="border: 1px solid #000; padding: 8px;"><br />
核種そのものの崩壊による半減期<br />
</td></tr><tr><td style="border: 1px solid #000; padding: 8px; font-weight: bold;">生物学的半減期</td><td style="border: 1px solid #000; padding: 8px;"><br />
体内に入った物質が代謝・排泄で半分になる時間<br />
</td></tr><tr><td style="border: 1px solid #000; padding: 8px; font-weight: bold;">実効半減期</td><td style="border: 1px solid #000; padding: 8px;"><br />
物理学的半減期と生物学的半減期を合わせた体内での減り方<br />
</td></tr></tbody></table><br />
<br />
</div></p>










































]]></description>
<guid isPermaLink="true">https://minnanods.net/blog/entry-1830.html</guid>
<pubDate>Wed, 26 Aug 2026 18:22:41 +0900</pubDate>
</item>
<item>
<dc:creator>みんなのデータサイト</dc:creator>
<title>市民測定室のつくりかた｜現場ノート　Vol.10 第２章巻頭図解ページ（改）</title>
<link>https://minnanods.net/blog/entry-1828.html</link>
<description><![CDATA[




<!-- テキスト -->

<p>第２章　測定室をつくるの冒頭に、測定室を立ち上げるために必要なものを図解で記載したらわかりやすいのでは？ということで、作ってみました。<br />
<br />
詳しい説明は後ろのページですることにしてなるべく簡略化しています。　<br />
<br />
今回は、測定器、測定に使う容器（マリネリ容器）、その他測定に必要な物品、部屋と建物について　つくってみました。いかがでしょうか？<br />
<br />
更新履歴：2026年9月3日　２枚目の場所の図と３枚目の木造とコンクリート住宅の比較図を改良しました</p>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-center js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/003/202608/ChatGPT_Image_Aug_13%2C_2026%2C_07_26_57_PM.png?v=20260817223002" data-rel="SmartPhoto[1828]">
<img class="columnImage"
 src="https://minnanods.net/media/003/202608/mode3_w700-ChatGPT_Image_Aug_13%2C_2026%2C_07_26_57_PM.png?v=20260817223002"
 alt="">
</a>


</div>






















<hr class="clearHidden">



















<!-- media -->
<div class="column-media-center js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/003/202609/ChatGPT_Image_2026%E5%B9%B48%E6%9C%8828%E6%97%A5_01_00_08.png?v=20260903190635" data-rel="SmartPhoto[1828]">
<img class="columnImage"
 src="https://minnanods.net/media/003/202609/mode3_w700-ChatGPT_Image_2026%E5%B9%B48%E6%9C%8828%E6%97%A5_01_00_08.png?v=20260903190635"
 alt="">
</a>


</div>






















<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/003/202609/ChatGPT_Image_2026%E5%B9%B48%E6%9C%8828%E6%97%A5_01_24_36.png?v=20260903190652" data-rel="SmartPhoto[1828]">
<img class="columnImage"
 src="https://minnanods.net/media/003/202609/mode3_w700-ChatGPT_Image_2026%E5%B9%B48%E6%9C%8828%E6%97%A5_01_24_36.png?v=20260903190652"
 alt="">
</a>


</div>






















<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/003/202608/ChatGPT_Image_Aug_13%2C_2026%2C_10_06_27_PM.png?v=20260817223124" data-rel="SmartPhoto[1828]">
<img class="columnImage"
 src="https://minnanods.net/media/003/202608/mode3_w700-ChatGPT_Image_Aug_13%2C_2026%2C_10_06_27_PM.png?v=20260817223124"
 alt="">
</a>


</div>























<!-- テキスト -->

<p>感想やコメントがあればお気軽にお寄せください。</p>










































]]></description>
<guid isPermaLink="true">https://minnanods.net/blog/entry-1828.html</guid>
<pubDate>Mon, 17 Aug 2026 22:25:44 +0900</pubDate>
</item>
<item>
<dc:creator>みんなのデータサイト</dc:creator>
<title>2026たけのこ山菜PJ 放射性セシウム濃度散布図</title>
<link>https://minnanods.net/analyze/food-data/entry-1823.html</link>
<description><![CDATA[




<!-- テキスト -->

<div id="top"></div>










































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/%E3%82%B3%E3%82%B7%E3%82%A2%E3%83%96%E3%83%A9%E5%8E%9F%E7%89%A91.jpg?v=20260807144413" data-rel="SmartPhoto[1823]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-%E3%82%B3%E3%82%B7%E3%82%A2%E3%83%96%E3%83%A9%E5%8E%9F%E7%89%A91.jpg?v=20260807144413"
 alt="">
</a>
<p class="caption">コシアブラ</p>


</div>























<!-- テキスト -->

<p>2026たけのこ山菜プロジェクト[228件]の測定結果を散布図にまとめました。<br />
放射性セシウムが検出のサンプル99件と不検出サンプル129件のグラフです。<br />
検出グラフは放射性セシウム(セシウム134とセシウム137の合計値)、不検出グラフはセシウム137の検出下限値で作成。<br />
また、グラフは対数表示となっています。</p>











































<!-- テキスト -->

<!-- グラフウィジェットのスタイル（サイト全体に影響を与えないようクラスで限定） -->
<style>
  .cs-chart-widget {
    font-family: system-ui, -apple-system, sans-serif;
    background-color: #f5f7fa;
    padding: 20px;
    border-radius: 12px;
    box-sizing: border-box;
    width: 100%;
    margin-bottom: 30px;
  }
  .cs-chart-widget .widget-title {
    text-align: center;
    color: #222;
    margin-top: 0;
    margin-bottom: 20px;
    font-size: clamp(1.2rem, 4vw, 1.5rem);
    font-weight: bold;
    border: none;
  }
  .cs-chart-widget .charts-wrapper {
    display: flex;
    flex-wrap: wrap;
    gap: 20px;
  }
  .cs-chart-widget .chart-box {
    flex: 1 1 calc(50% - 10px);
    min-width: 280px; /* スマホ画面で自動的に縦並びにするための設定 */
    background: #fff;
    border: 1px solid #e2e8f0;
    border-radius: 8px;
    padding: 15px;
    box-sizing: border-box;
  }
  .cs-chart-widget .box-title {
    text-align: center;
    color: #475569;
    font-size: 1.1rem;
    margin: 0 0 5px 0;
    border: none;
  }
  .cs-chart-widget .chart-info {
    text-align: center;
    color: #64748b;
    font-size: 0.85rem;
    margin-bottom: 15px;
    line-height: 1.4;
  }
  .cs-chart-widget .zoom-bar {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    margin-bottom: 6px;
  }
  .cs-chart-widget .reset-btn {
    border: 1px solid #cbd5e1;
    background: #fff;
    color: #475569;
    border-radius: 6px;
    padding: 4px 12px;
    font-size: 12px;
    font-weight: bold;
    cursor: pointer;
  }
  .cs-chart-widget .reset-btn:active { background: #f1f5f9; }
  .cs-chart-widget .canvas-container {
    position: relative;
    width: 100%;
    height: 400px;
    touch-action: pan-y; /* 1本指スワイプはページスクロールを維持 */
  }
  .cs-chart-widget .zoom-warning {
    display: none;
    background: #fef2f2;
    border: 1px solid #fecaca;
    color: #b91c1c;
    border-radius: 6px;
    padding: 8px 12px;
    font-size: 12px;
    margin-bottom: 12px;
  }
  .cs-chart-widget .zoom-guide {
    background: #eff6ff;
    border: 1px solid #bfdbfe;
    border-radius: 8px;
    padding: 10px 12px;
    margin-top: 15px;
    font-size: 12px;
    color: #1e40af;
    line-height: 1.8;
  }
  .cs-chart-widget .zoom-guide summary {
    font-weight: bold;
    cursor: pointer;
  }
  .cs-chart-widget .zoom-guide ul {
    margin: 6px 0 0;
    padding-left: 18px;
  }
  .cs-chart-widget .zoom-guide li { margin-bottom: 2px; }
  /* スマホ表示用の高さ調整 */
  @media (max-width: 768px) {
    .cs-chart-widget {
      padding: 15px 10px;
    }
    .cs-chart-widget .canvas-container {
      height: 320px;
    }
    .cs-chart-widget .zoom-guide { font-size: 11px; }
  }
</style>

<!-- グラフの表示エリア -->
<div class="cs-chart-widget">
  <div class="widget-title">2026たけのこ山菜PJ 放射性セシウム濃度散布図</div>
  <div class="zoom-warning" id="csZoomWarning">⚠️ ズーム機能の読み込みに失敗しました。ページを再読み込みしてください。</div>
  <div class="charts-wrapper">
    <div class="chart-box">
      <div class="box-title">検出データ</div>
      <div class="chart-info">N=99<br>検出データ</div>
      <div class="zoom-bar">
        <button type="button" class="reset-btn" data-reset="detected">? リセット</button>
      </div>
      <div class="canvas-container">
        <canvas id="detectedChart"></canvas>
      </div>
    </div>
    <div class="chart-box">
      <div class="box-title">不検出データ（cs-137検出下限値）</div>
      <div class="chart-info">N=129<br>不検出データ</div>
      <div class="zoom-bar">
        <button type="button" class="reset-btn" data-reset="notDetected">? リセット</button>
      </div>
      <div class="canvas-container">
        <canvas id="notDetectedChart"></canvas>
      </div>
    </div>
  </div>

  <details class="zoom-guide" open>
    <summary>? グラフの操作方法</summary>
    <ul>
      <li><strong>スマホ・タブレット:</strong> 2本指のピンチ操作で縦方向に拡大・縮小、指でドラッグして表示範囲を移動できます。1本指の上下スワイプは通常のページスクロールです。</li>
      <li><strong>パソコン:</strong> グラフ上にマウスを置いてホイールを回すと拡大・縮小します（グラフ上ではページスクロールは効きません）。ドラッグで範囲を選択して拡大、<strong>Shiftキーを押しながらドラッグ</strong>で表示範囲を移動できます。</li>
      <li><strong>元に戻す:</strong> 各グラフ右上の「? リセット」ボタンで全体表示に戻ります。</li>
      <li>点にカーソル（タップ）を合わせると、品目名と測定値が表示されます。</li>
    </ul>
  </details>
</div>

<!-- グラフを描画するプログラム -->
<script>
(function () {
  // ==========================================================
  // ライブラリを順番に動的読み込みし、全部揃ってから初期化
  // ==========================================================
  var LIBS = [
    'https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js',
    'https://cdn.jsdelivr.net/npm/hammerjs@2.0.8/hammer.min.js',
    'https://cdn.jsdelivr.net/npm/chartjs-plugin-zoom@2.0.1/dist/chartjs-plugin-zoom.min.js'
  ];

  function loadScript(src) {
    return new Promise(function (resolve, reject) {
      if (document.querySelector('script[src="' + src + '"]')) { resolve(); return; }
      var s = document.createElement('script');
      s.src = src;
      s.onload = resolve;
      s.onerror = function () { reject(new Error('読み込み失敗: ' + src)); };
      document.head.appendChild(s);
    });
  }

  loadScript(LIBS[0])
    .then(function () { return loadScript(LIBS[1]); })
    .then(function () { return loadScript(LIBS[2]); })
    .then(function () {
      var zoomPlugin = window.ChartZoom || (window['chartjs-plugin-zoom'] && window['chartjs-plugin-zoom'].default);
      if (zoomPlugin) {
        Chart.register(zoomPlugin);
      } else {
        console.error('[cs-chart] ズームプラグインが見つかりません');
        document.getElementById('csZoomWarning').style.display = 'block';
      }
      initCharts(!!zoomPlugin);
    })
    .catch(function (err) {
      console.error('[cs-chart] ' + err.message);
      document.getElementById('csZoomWarning').style.display = 'block';
      if (window.Chart) initCharts(false);
    });

  // ==========================================================
  // グラフ本体
  // ==========================================================
  function initCharts(zoomEnabled) {

    // --- データ定義 ---
    const foodItemsDetected = ["\u30b3\u30b7\u30a2\u30d6\u30e9", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30bf\u30b1\u30ce\u30b3[\u7e01\u6545\u54c1]", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30bf\u30e9\u306e\u82bd", "\u305f\u3051\u306e\u3053", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9(\u4e7e\u71e5\u6c17\u5473)[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u305f\u3051\u306e\u3053", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30bf\u30b1\u30ce\u30b3", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u3010\u5929\u7136\u30cd\u30de\u30ac\u30ea\u30bf\u30b1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u305f\u3051\u306e\u3053", "\u30bf\u30e9\u306e\u82bd", "\u305f\u3051\u306e\u3053", "\u30bf\u30b1\u30ce\u30b3", "\u30bf\u30e9\u30ce\u30e1[\u7e01\u6545\u54c1]", "\u30ef\u30e9\u30d3", "\u3010\u5929\u7136\u3011\u30cd\u30de\u30ac\u30ea\u30bf\u30b1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u30bf\u30b1\u30ce\u30b3\uff08\u8339\u3067\uff09", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u30bf\u30b1\u30ce\u30b3(\u5869\u3086\u3067)[\u7e01\u6545\u54c1]", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u305f\u3051\u306e\u3053\uff08\u771f\u7af9\uff09", "\u30ef\u30e9\u30d3", "\u30bf\u30b1\u30ce\u30b3", "\u30bf\u30b1\u30ce\u30b3", "\u30d5\u30ad", "\u3010\u5929\u7136\u3011\u30cf\u30ea\u30ae\u30ea[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30bf\u30b1\u30ce\u30b3", "\u3010\u5929\u7136\u3011\u30cd\u30de\u30ac\u30ea\u30bf\u30b1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30cd\u30de\u30ac\u30ea\u30bf\u30b1", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30bf\u30e9\u30ce\u30e1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u3010\u5929\u7136\u3011\u30cd\u30de\u30ac\u30ea\u30bf\u30b1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30bf\u30b1\u30ce\u30b3[\u7e01\u6545\u54c1]", "\u30a6\u30c9[\u7e01\u6545\u54c1]", "\u30ef\u30e9\u30d3", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30cd\u30de\u30ac\u30ea\u30bf\u30b1", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30ef\u30e9\u30d3", "\u30bf\u30b1\u30ce\u30b3", "\u305f\u3051\u306e\u3053\uff08\u771f\u7af9\uff09", "\u30bf\u30b1\u30ce\u30b3", "\u305f\u3051\u306e\u3053", "\u30ef\u30e9\u30d3", "\u3010\u5929\u7136\u3011\u30ef\u30e9\u30d3[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30cd\u30de\u30ac\u30ea\u30bf\u30b1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u30ef\u30e9\u30d3", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u30ef\u30e9\u30d3", "\u3010\u5929\u7136\u3011\u30bf\u30b1\u30ce\u30b3(\u771f\u7af9\u7a42\u5148\u30ab\u30c3\u30c8)[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30e8\u30e2\u30ae[\u7e01\u6545\u54c1]", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30ef\u30e9\u30d3", "\u308f\u3089\u3073", "\u3010\u5929\u7136\u3011\u30bf\u30e9\u30ce\u30e1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30cd\u30de\u30ac\u30ea\u30bf\u30b1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u59eb\u30a6\u30b3\u30ae[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30cd\u30de\u30ac\u30ea\u30bf\u30b1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30bf\u30e9\u30ce\u30e1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u51b7\u51cd\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30d5\u30ad\u30ce\u30c8\u30a6[\u5e97\u982d\u8cfc\u5165\u54c1]", "\u3010\u5929\u7136\u3011\u30cd\u30de\u30ac\u30ea\u30bf\u30b1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u5c71\u30a6\u30c9", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30bf\u30b1\u30ce\u30b3(\u751f)[\u7e01\u6545\u54c1]", "\u30bf\u30b1\u30ce\u30b3", "\u3010\u683d\u57f9\u3011\u30bf\u30e9\u30ce\u30e1[\u5e97\u982d\u8cfc\u5165\u54c1]", "\u3010\u5929\u7136\u3011\u30bf\u30e9\u30ce\u30e1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u683d\u57f9\u3011\u30bf\u30e9\u30ce\u30e1[\u5e97\u982d\u8cfc\u5165\u54c1]", "\u3010\u5929\u7136\u3011\u30cd\u30de\u30ac\u30ea\u30bf\u30b1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30cd\u30de\u30ac\u30ea\u30bf\u30b1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30cd\u30de\u30ac\u30ea\u30bf\u30b1(\u6c34\u716e)[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30bf\u30e9\u30ce\u30e1[\u30cd\u30c3\u30c8\u901a\u8ca9]"];
    const sum_csDetected = [608.0, 408.0, 262.0, 235.53, 211.0, 183.0, 157.0, 127.0, 124.08, 115.0, 108.0, 91.27, 66.7, 65.7, 64.0, 63.9, 47.2, 46.0, 43.6, 43.3, 41.8, 40.8, 40.8, 36.2, 34.64, 32.7, 32.6, 31.94, 27.8, 24.41, 24.1, 21.42, 19.2, 17.5, 15.4, 15.1, 13.3, 12.7, 12.6, 12.6, 12.3, 11.8, 10.5, 10.2, 9.99, 9.69, 9.62, 9.33, 8.81, 8.57, 8.35, 7.85, 7.65, 7.4, 7.33, 7.25, 7.06, 7.0, 6.62, 6.31, 6.11, 5.8, 5.73, 5.6, 5.49, 5.44, 4.63, 4.44, 4.43, 4.32, 4.27, 4.26, 3.87, 3.69, 3.61, 3.57, 3.03, 2.8, 2.34, 2.28, 2.11, 2.02, 1.98, 1.74, 1.61, 1.58, 1.57, 1.32, 1.25, 1.23, 1.09, 0.99, 0.87, 0.83, 0.69, 0.45, 0.38, 0.36, 0.34];

    const foodItemsNotDetected = ["\u3075\u304d\u306e\u3068\u3046", "\u30bf\u30e9\u30ce\u30e1", "\u30bf\u30e9\u306e\u82bd", "\u30ef\u30e9\u30d3", "\u30bf\u30e9\u306e\u82bd", "\u30bf\u30b1\u30ce\u30b3", "\u30cf\u30c1\u30af\u30bf\u30b1\u30ce\u30b3", "\u30bf\u30b1\u30ce\u30b3", "\u30bf\u30e9\u306e\u82bd", "\u30bf\u30b1\u30ce\u30b3", "\u30d5\u30ad", "\u30bf\u30e9\u306e\u82bd", "\u30bf\u30b1\u30ce\u30b3", "\u30bf\u30b1\u30ce\u30b3", "\u30bf\u30b1\u30ce\u30b3", "\u5510\u7af9\u30bf\u30b1\u30ce\u30b3", "\u30cf\u30c1\u30af\u30bf\u30b1\u30ce\u30b3", "\u30bf\u30e9\u306e\u82bd", "\u30bf\u30b1\u30ce\u30b3", "\u30c4\u30af\u30b7", "\u30ef\u30e9\u30d3", "\u30bf\u30b1\u30ce\u30b3", "\u30bf\u30e9\u306e\u82bd", "\u30ab\u30f3\u30be\u30a6", "\u30bf\u30e9\u30ce\u30e1", "\u30ef\u30e9\u30d3", "\u30bf\u30b1\u30ce\u30b3", "\u5c71\u30a6\u30c9", "\u3010\u5929\u7136\u3011\u30bf\u30e9\u30ce\u30e1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30ef\u30e9\u30d3", "\u3010\u5929\u7136\u3011\u30bf\u30e9\u30ce\u30e1[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30b3\u30b4\u30df", "\u30bf\u30b1\u30ce\u30b3", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30bc\u30f3\u30de\u30a4", "\u30bf\u30e9\u30ce\u30e1", "\u30bf\u30e9\u30ce\u30e1", "\u5929\u7136\u30ab\u30e9\u30b7\u30ca", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30a4\u30bf\u30c9\u30ea", "\u5929\u7136\u30ca\u30ce\u30cf\u30ca", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30a6\u30eb\u30a4\uff08\u30ae\u30dc\u30a6\u30b7\uff09", "\u30df\u30ba", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30a6\u30eb\u30a4", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30d5\u30ad", "\u30d5\u30ad", "\u30bf\u30e9\u306e\u82bd", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30df\u30ba", "\u30a6\u30c9", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30df\u30ba", "\u30ef\u30e9\u30d3", "\u30d5\u30ad\u30ce\u30c8\u30a6", "\u30bf\u30e9\u306e\u82bd", "\u305f\u3051\u306e\u3053", "\u30bf\u30e9\u30ce\u30e1", "\u30ef\u30e9\u30d3", "\u30df\u30ba", "\u30d5\u30ad", "\u30a6\u30eb\u30a4\uff08\u30ae\u30dc\u30a6\u30b7\uff09", "\u30cd\u30de\u30ac\u30ea\u30bf\u30b1", "\u30ef\u30e9\u30d3", "\u30b3\u30b4\u30df", "\u30bf\u30e9\u306e\u82bd", "\u30bf\u30b1\u30ce\u30b3", "\u30ef\u30e9\u30d3", "\u30bf\u30b1\u30ce\u30b3", "\u30bf\u30e9\u306e\u82bd", "\u30bf\u30b1\u30ce\u30b3", "\u30d5\u30ad", "\u30bf\u30b1\u30ce\u30b3", "\u30bf\u30b1\u30ce\u30b3", "\u30a6\u30c9", "\u30b9\u30ae\u30ca[\u7e01\u6545\u54c1]", "\u305f\u3051\u306e\u3053", "\u305f\u3051\u306e\u3053", "\u307e\u3060\u3051", "\u30ef\u30e9\u30d3", "\u30ef\u30e9\u30d3", "\u30b3\u30b4\u30df", "\u30d5\u30ad", "\u305f\u3051\u306e\u3053", "\u30b3\u30b7\u30a2\u30d6\u30e9\uff08\u5929\u7136\uff09", "\u30bf\u30b1\u30ce\u30b3", "\u30a6\u30c9", "\u30bb\u30ea[\u7e01\u6545\u54c1]", "\u30b3\u30b4\u30df", "\u30d5\u30ad", "\u30ef\u30e9\u30d3", "\u305f\u3051\u306e\u3053\uff08\u771f\u7af9\uff09", "\u30df\u30ba", "\u306f\u3061\u304f", "\u30ef\u30e9\u30d3", "\u30ef\u30e9\u30d3", "\u30ef\u30e9\u30d3", "\u305f\u3051\u306e\u3053", "\u30bf\u30b1\u30ce\u30b3", "\u30df\u30ba", "\u30b3\u30b7\u30a2\u30d6\u30e9", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u30bf\u30b1\u30ce\u30b3", "\u30bf\u30b1\u30ce\u30b3", "\u30d5\u30ad[\u7e01\u6545\u54c1]", "\u3010\u5929\u7136\u3011\u30b3\u30b7\u30a2\u30d6\u30e9[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30c4\u30af\u30b7[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30d5\u30ad\u30ce\u30c8\u30a6[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30d5\u30ad\u30ce\u30c8\u30a6[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30d5\u30ad\u30ce\u30c8\u30a6[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30d5\u30ad\u30ce\u30c8\u30a6[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30d5\u30ad\u30ce\u30c8\u30a6[\u30cd\u30c3\u30c8\u901a\u8ca9]", "\u3010\u5929\u7136\u3011\u30d5\u30ad\u30ce\u30c8\u30a6[\u30cd\u30c3\u30c8\u901a\u8ca9]"];
    const detectionLimits = [28.0, 15.9, 12.3, 11.9, 11.1, 11.1, 11.0, 10.9, 10.4, 10.4, 10.4, 10.2, 10.2, 10.1, 9.93, 9.51, 9.15, 9.12, 8.89, 8.81, 8.75, 8.04, 6.09, 5.84, 5.72, 5.57, 5.55, 5.31, 5.13, 5.1, 4.45, 4.2, 4.1, 4.08, 4.03, 3.97, 3.96, 3.9, 3.85, 3.84, 3.81, 3.76, 3.72, 3.7, 3.68, 3.65, 3.59, 3.53, 3.47, 3.41, 3.39, 3.39, 3.35, 3.35, 3.35, 3.32, 3.28, 3.27, 3.26, 3.25, 3.17, 3.15, 3.06, 3.03, 3.01, 2.99, 2.93, 2.88, 2.88, 2.83, 2.81, 2.81, 2.81, 2.79, 2.78, 2.76, 2.71, 2.7, 2.67, 2.63, 2.57, 2.49, 2.49, 2.46, 2.44, 2.41, 2.4, 2.38, 2.37, 2.29, 2.28, 2.24, 2.23, 2.22, 2.2, 2.19, 2.18, 2.17, 2.13, 2.13, 2.1, 2.07, 1.96, 1.96, 1.92, 1.91, 1.87, 1.86, 1.8, 1.78, 1.77, 1.7, 1.7, 1.64, 1.61, 1.6, 1.4, 1.4, 1.39, 1.34, 0.96, 0.91, 0.89, 0.6, 0.54, 0.52, 0.46, 0.39, 0.37];
    const detectionLimitLabels = detectionLimits.map(val => "検出下限値Cs-137：" + val + " Bq/kg");

    // --- データ振り分け ---
    const scatterDataDetected = foodItemsDetected.map((item, index) => ({ x: 0, y: sum_csDetected[index], label: item }));
    const detectedOver100 = [];
    const detectedUnder100 = [];

    scatterDataDetected.forEach((data) => {
      if (data.y > 100) detectedOver100.push(data);
      else detectedUnder100.push(data);
    });

    const scatterDataNotDetected = foodItemsNotDetected.map((item, index) => ({ x: 0, y: detectionLimits[index], label: item, limitLabel: detectionLimitLabels[index] }));

    // --- プラグイン設定（100 Bq/kgの基準線） ---
    const customBaselinePlugin = {
      id: 'customBaseline',
      afterDatasetsDraw(chart) {
        const yScale = chart.scales.y;
        const yPixel = yScale.getPixelForValue(100);

        if (yPixel >= chart.chartArea.top && yPixel <= chart.chartArea.bottom) {
          const ctx = chart.ctx;
          ctx.save();
          ctx.strokeStyle = 'rgba(255, 0, 0, 1)';
          ctx.lineWidth = 2;
          ctx.setLineDash([5, 5]);
          ctx.beginPath();
          ctx.moveTo(chart.chartArea.left, yPixel);
          ctx.lineTo(chart.chartArea.right, yPixel);
          ctx.stroke();
          ctx.setLineDash([]);

          ctx.fillStyle = 'rgba(255, 0, 0, 1)';
          ctx.font = 'bold 11px Arial';
          ctx.textAlign = 'right';
          ctx.fillText('食品基準(100 Bq/kg)', chart.chartArea.right - 5, yPixel - 6);
          ctx.restore();
        }
      }
    };

    // --- 共通オプション設定 ---
    const isTouchDevice = 'ontouchstart' in window;

    const getPointRadius = (ctx, baseSize) => {
      return window.innerWidth < 768 ? baseSize * 0.6 : baseSize;
    };

    // ズーム設定（縦方向のみ。X軸には意味がないため）
    const zoomOptions = zoomEnabled ? {
      pan: {
        enabled: true,
        mode: 'y',
        modifierKey: isTouchDevice ? undefined : 'shift' // PCはShift+ドラッグで移動
      },
      zoom: {
        wheel: { enabled: true },
        pinch: { enabled: true },
        drag: {
          enabled: !isTouchDevice, // PCのみドラッグ範囲選択ズーム
          backgroundColor: 'rgba(59,130,246,0.15)',
          borderColor: '#3b82f6',
          borderWidth: 1
        },
        mode: 'y'
      },
      limits: {
        y: { min: 0.1, max: 1000 }
      }
    } : undefined;

    const commonOptions = {
      responsive: true,
      maintainAspectRatio: false,
      scales: {
        x: {
          type: 'linear',
          position: 'bottom',
          ticks: { display: false },
          grid: { display: false }
        },
        y: {
          type: 'logarithmic',
          title: { display: true, text: 'Bq/kg' },
          ticks: { callback: function(value) { return value; }, min: 0.1 }
        }
      },
      plugins: {
        legend: {
          labels: { usePointStyle: true, boxWidth: 8 }
        },
        zoom: zoomOptions
      }
    };

    // --- 検出データの描画 ---
    const ctxDetected = document.getElementById('detectedChart').getContext('2d');
    const chartDetected = new Chart(ctxDetected, {
      type: 'scatter',
      data: {
        datasets: [
          {
            label: '100 Bq/kg超過',
            data: detectedOver100,
            backgroundColor: 'rgba(255, 0, 0, 0.6)',
            pointRadius: (ctx) => getPointRadius(ctx, 12),
            pointStyle: 'circle'
          },
          {
            label: '100 Bq/kg以下',
            data: detectedUnder100,
            backgroundColor: 'rgba(0, 255, 0, 0.6)',
            pointRadius: (ctx) => getPointRadius(ctx, 12),
            pointStyle: 'circle'
          }
        ]
      },
      options: {
        ...commonOptions,
        plugins: {
          ...commonOptions.plugins,
          tooltip: {
            callbacks: {
              label: function(context) {
                return context.raw.label + ': ' + context.raw.y + ' Bq/kg';
              }
            }
          }
        }
      },
      plugins: [customBaselinePlugin]
    });

    // --- 不検出データの描画 ---
    const ctxNotDetected = document.getElementById('notDetectedChart').getContext('2d');
    const chartNotDetected = new Chart(ctxNotDetected, {
      type: 'scatter',
      data: {
        datasets: [
          {
            label: '不検出データ',
            data: scatterDataNotDetected,
            backgroundColor: 'rgba(0, 0, 255, 0.6)',
            pointRadius: (ctx) => getPointRadius(ctx, 16),
            pointStyle: 'triangle'
          }
        ]
      },
      options: {
        ...commonOptions,
        plugins: {
          ...commonOptions.plugins,
          tooltip: {
            callbacks: {
              label: function(context) {
                return context.raw.label + ': ' + context.raw.limitLabel;
              }
            }
          }
        }
      }
    });

    // --- リセットボタン ---
    const charts = { detected: chartDetected, notDetected: chartNotDetected };
    document.querySelectorAll('.cs-chart-widget .reset-btn').forEach(function (btn) {
      btn.addEventListener('click', function () {
        const c = charts[btn.getAttribute('data-reset')];
        if (c && c.resetZoom) c.resetZoom();
      });
    });

    // --- グラフ領域上ではホイールによるページスクロールを無効化 ---
    if (zoomEnabled) {
      document.querySelectorAll('.cs-chart-widget .canvas-container').forEach(function (el) {
        el.addEventListener('wheel', function (e) {
          e.preventDefault();
        }, { passive: false });
      });
    }
  }
})();
</script>











































<hr class="clearHidden">



















<!-- media -->
<div class="column-media-auto js_notStyle acms-col-sm-12">

<a href="https://minnanods.net/media/001/202608/%E3%83%8D%E3%83%9E%E3%82%AC%E3%83%AA%E3%82%BF%E3%82%B12.jpg?v=20260807135348" data-rel="SmartPhoto[1823]">
<img class="columnImage"
 src="https://minnanods.net/media/001/202608/mode3_w858-%E3%83%8D%E3%83%9E%E3%82%AC%E3%83%AA%E3%82%BF%E3%82%B12.jpg?v=20260807135348"
 alt="">
</a>
<p class="caption">ネマガリタケ</p>


</div>






















<hr class="clearHidden">
































<hr class="custom-hr">







<hr class="clearHidden">
































<hr class="custom-hr">








<!-- テキスト -->

<p class="separator" style="clear: both; text-align: center;"><img src="https://minnanods.net/media/001/202505/marinari.png" alt="" width="23" height="23" class="aligncenter size-full " /><font size="5"><a href="#top">　トップへ戻る　</a></font><img src="https://minnanods.net/media/001/202505/marinari.png" alt="" width="23" height="23" class="aligncenter size-full " /></p>










































]]></description>
<category>食品データの解析</category>
<guid isPermaLink="true">https://minnanods.net/analyze/food-data/entry-1823.html</guid>
<pubDate>Fri, 07 Aug 2026 13:41:23 +0900</pubDate>
</item>
</channel>
</rss>
