{"id":14483,"date":"2025-05-17T10:31:33","date_gmt":"2025-05-17T01:31:33","guid":{"rendered":"https:\/\/f1-lap-time.com\/?p=14483"},"modified":"2025-05-17T10:39:51","modified_gmt":"2025-05-17T01:39:51","slug":"%e3%82%a8%e3%83%9f%e3%83%aa%e3%82%a2%e3%83%bb%e3%83%ad%e3%83%9e%e3%83%bc%e3%83%8b%e3%83%a3gp-fp2%e3%83%ad%e3%83%b3%e3%82%b0%e3%83%a9%e3%83%b3%e5%88%86%e6%9e%90","status":"publish","type":"post","link":"https:\/\/f1-lap-time.com\/?p=14483","title":{"rendered":"\u30a8\u30df\u30ea\u30a2\u30fb\u30ed\u30de\u30fc\u30cb\u30e3GP FP2\u30ed\u30f3\u30b0\u30e9\u30f3\u5206\u6790"},"content":{"rendered":"\n<p>\u3000\u672c\u6295\u7a3f\u3067\u306f\u3001\u30a8\u30df\u30ea\u30a2\u30fb\u30ed\u30de\u30fc\u30cb\u30e3GP\u306eFP2\u306b\u304a\u3051\u308b\u30ed\u30f3\u30b0\u30e9\u30f3\u30da\u30fc\u30b9\u3092\u5206\u6790\u3059\u308b\u3002\u307e\u305a\u306f\u30013\u5468\u4ee5\u4e0a\u306e\u30ed\u30f3\u30b0\u30e9\u30f3\u3092\u884c\u3063\u305f\u30c9\u30e9\u30a4\u30d0\u30fc\u306e\u30e9\u30c3\u30d7\u30bf\u30a4\u30e0\u3092\u3001\u4ee5\u4e0b\u306e\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u30b0\u30e9\u30d5\u306b\u3066\u793a\u3059\u3002\u30dc\u30bf\u30f3\u64cd\u4f5c\u3067\u898b\u305f\u3044\u30c9\u30e9\u30a4\u30d0\u30fc\u3060\u3051\u3092\u8868\u793a\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u308b\u3002<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"ja\">\n<head>\n  <title>Race Lap Time Interactive Graph<\/title>\n  <script src=\"https:\/\/cdn.plot.ly\/plotly-2.26.0.min.js\"><\/script>\n  <style>\n    body {\n      margin: 20px;\n      background: #fff;\n      color: #000;\n    }\n    .driver-toggle {\n      display: inline-block;\n      padding: 4px 8px;\n      margin: 2px 4px;\n      border: 1px solid #ccc;\n      border-radius: 4px;\n      cursor: pointer;\n      user-select: none;\n      font-weight: bold;\n      color: #000;\n    }\n    .driver-toggle.active {\n      border: 1px solid #000;\n    }\n    #selectAll,\n    #clearAll {\n      margin-left: 10px;\n      padding: 6px 12px;\n      cursor: pointer;\n      font-size: 1.1em;\n    }\n    \/* \u2014\u2014 \u30dc\u30bf\u30f3\u307e\u308f\u308a\u3092 Times New Roman \u306b \u2014\u2014 *\/\n    #controls,\n    #controls strong,\n    .driver-toggle,\n    #selectAll,\n    #clearAll {\n      font-family: \"Times New Roman\", serif;\n    }\n  <\/style>\n<\/head>\n<body>\n  <h2>Lap Times<\/h2>\n  <div id=\"controls\">\n    <strong>Drivers:<\/strong>\n    <span id=\"driverButtons\"><\/span>\n    <button id=\"selectAll\">Select All<\/button><button id=\"clearAll\">Clear All<\/button>\n  <\/div>\n  <div id=\"lapChart\" style=\"width:100%;max-width:1200px;height:520px;\"><\/div>\n\n  <script>\n    const DATA_FILE = \"emilia_romagna_fp2_2025_lap_times.tsv\";\n    const DRIVERS = [\n      \"VER\",\"TSU\",\"NOR\",\"PIA\",\"LEC\",\"HAM\",\"RUS\",\"ANT\",\"ALO\",\"STR\",\"GAS\",\"COL\",\"OCO\",\"BEA\",\"HAD\",\"LAW\",\"ALB\",\"SAI\",\"HUL\",\"BOR\"\n    ];\n    const NAME_MAP = {\n      \"Max VERSTAPPEN\":\"VER\",\"Yuki TSUNODA\":\"TSU\",\"Lando NORRIS\":\"NOR\",\"Oscar PIASTRI\":\"PIA\",\"Charles LECLERC\":\"LEC\",\"Lewis HAMILTON\":\"HAM\",\"George RUSSELL\":\"RUS\",\"Kimi ANTONELLI\":\"ANT\",\"Fernando ALONSO\":\"ALO\",\"Lance STROLL\":\"STR\",\"Pierre GASLY\":\"GAS\",\"Franco COLAPINTO\":\"COL\",\"Esteban OCON\":\"OCO\",\"Oliver BEARMAN\":\"BEA\",\"Isack HADJAR\":\"HAD\",\"Liam LAWSON\":\"LAW\",\"Alexander ALBON\":\"ALB\",\"Carlos SAINZ\":\"SAI\",\"Nico HULKENBERG\":\"HUL\",\"Gabriel BORTOLETO\":\"BOR\"\n    };\n    const DRIVER_COLORS = {\n      VER:\"rgb(0,32,96)\",TSU:\"rgb(102,255,0)\",NOR:\"rgb(255,128,0)\",PIA:\"rgb(255,192,128)\",LEC:\"rgb(255,0,0)\",HAM:\"rgb(255,192,192)\",RUS:\"rgb(166,166,166)\",ANT:\"rgb(0,176,80)\",ALO:\"rgb(0,176,240)\",STR:\"rgb(0,112,112)\",GAS:\"rgb(0,128,255)\",COL:\"rgb(255,0,255)\",OCO:\"rgb(0,0,0)\",BEA:\"rgb(128,128,128)\",HAD:\"rgb(112,48,160)\",LAW:\"rgb(180,198,231)\",ALB:\"rgb(192,176,224)\",SAI:\"rgb(0,112,192)\",HUL:\"rgb(255,193,37)\",BOR:\"rgb(192,0,0)\"\n    };\n    const WHITE_TEXT = new Set([\"VER\",\"OCO\",\"HAD\",\"STR\",\"GAS\",\"BEA\",\"SAI\",\"BOR\"]);\n\n    const timeStrToSec = s => {\n      if (!s) return null;\n      const [m, rest] = s.split(\":\");\n      return parseInt(m, 10) * 60 + parseFloat(rest);\n    };\n    const secToTime = s => {\n      const m = Math.floor(s \/ 60);\n      return m + \":\" + (\"0\" + (s - m * 60).toFixed(3)).slice(-6);\n    };\n\n    \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    \/\/ \u30c7\u30fc\u30bf\u8aad\u307f\u8fbc\u307f & \u30b0\u30e9\u30d5\u63cf\u753b\n    \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    fetch(DATA_FILE)\n      .then(r => r.text())\n      .then(tsv => {\n        const rows = tsv.trim().split(\/\\r?\\n\/).map(l => l.split(\"\\t\"));\n        const headers = rows[0];\n        const lapCnt = rows.length - 1;\n        const laps = [], times = {};\n        DRIVERS.forEach(d => (times[d] = []));\n\n        for (let i = 1; i < rows.length; i++) {\n          const cells = rows[i];\n          const lap = parseInt(cells[0], 10);\n          laps.push(lap);\n          const row = {};\n          for (let j = 1; j < cells.length; j++) row[headers[j]] = cells[j];\n          DRIVERS.forEach(d => {\n            const full = Object.keys(NAME_MAP).find(k => NAME_MAP[k] === d);\n            const t = timeStrToSec(row[full]);\n            times[d].push(t);\n          });\n        }\n\n        let fastest = Infinity;\n        DRIVERS.forEach(d => times[d].forEach(v => { if (v && v < fastest) fastest = v; }));\n        const yMin = Math.floor(fastest);\n        const yMax = yMin + 8;\n        const tickVals = Array.from({ length: yMax - yMin + 1 }, (_, k) => yMin + k);\n\n        \/\/ \u2500\u2500 1\u30c9\u30e9\u30a4\u30d0\u30fc\uff1d1\u30c8\u30ec\u30fc\u30b9 \u2500\u2500\n        const tracesLap = [];\n        DRIVERS.forEach(d => {\n          tracesLap.push({\n            name: d,\n            x: laps,\n            y: times[d],\n            mode: \"lines+markers\",              \/\/ \u30e9\u30a4\u30f3 + \u30c7\u30fc\u30bf\u70b9\n            connectgaps: false,\n            line: { color: DRIVER_COLORS[d], width: 2 },\n            marker: { size: 6, color: DRIVER_COLORS[d] },\n            visible: false,                     \/\/ \u521d\u671f\u306f\u975e\u8868\u793a\n            showlegend: false                  \/\/ \u521d\u671f\u306f\u51e1\u4f8b\u306b\u51fa\u3055\u306a\u3044\n          });\n        });\n\n        const fontAll = { family: \"Times New Roman, Times, serif\" };\n        const legendCfg = { itemclick: false, itemdoubleclick: false };\n        Plotly.newPlot(\n          \"lapChart\",\n          tracesLap,\n          {\n            font: fontAll,\n            legend: legendCfg,\n            xaxis: {\n              title: { text: \"Lap\", font: fontAll },\n              tickfont: fontAll\n            },\n            yaxis: {\n              title: { text: \"Time (m:s)\", font: fontAll },\n              tickfont: fontAll,\n              range: [yMax, yMin],\n              autorange: false,\n              tickvals: tickVals,\n              ticktext: tickVals.map(secToTime)\n            },\n            margin: { t: 40 }\n          },\n          { responsive: true }\n        );\n\n        \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n        \/\/ \u30dc\u30bf\u30f3\u95a2\u9023\n        \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n        const graph = document.getElementById(\"lapChart\");\n        const box = document.getElementById(\"driverButtons\");\n\n        const toggle = (d, btn) => {\n          const on = btn.classList.toggle(\"active\");\n          \/\/ Trace index \u306f\u90fd\u5ea6\u53d6\u308a\u76f4\u3059\uff08moveTraces \u3067\u9806\u5e8f\u304c\u5909\u308f\u308b\u305f\u3081\uff09\n          const idx = graph.data.findIndex(t => t.name === d);\n          if (on) {\n            \/\/ \u8868\u793a & \u51e1\u4f8b\u306b\u8ffd\u52a0\n            Plotly.restyle(graph, { visible: true, showlegend: true }, idx);\n            \/\/ \u9078\u629e\u9806\u306b\u51e1\u4f8b\u3092\u4e26\u3079\u308b\u305f\u3081\u672b\u5c3e\u306b\u79fb\u52d5\n            Plotly.moveTraces(graph, [idx], -1);\n          } else {\n            \/\/ \u975e\u8868\u793a & \u51e1\u4f8b\u304b\u3089\u9664\u5916\n            Plotly.restyle(graph, { visible: false, showlegend: false }, idx);\n          }\n        };\n\n        \/\/ \u30dc\u30bf\u30f3\u751f\u6210\n        DRIVERS.forEach(d => {\n          const b = document.createElement(\"span\");\n          b.textContent = d;\n          b.className = \"driver-toggle\";\n          b.style.backgroundColor = DRIVER_COLORS[d];\n          if (WHITE_TEXT.has(d)) b.style.color = \"#fff\";\n          b.onclick = () => toggle(d, b);\n          box.appendChild(b);\n        });\n\n        \/\/ Select All \/ Clear All\n        document.getElementById(\"selectAll\").onclick = () =>\n          document.querySelectorAll(\".driver-toggle\").forEach(btn => {\n            if (!btn.classList.contains(\"active\")) btn.click();\n          });\n\n        document.getElementById(\"clearAll\").onclick = () =>\n          document.querySelectorAll(\".driver-toggle.active\").forEach(btn => btn.click());\n      })\n      .catch(e => {\n        console.error(e);\n        alert(\"TSV \u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\");\n      });\n  <\/script>\n<\/body>\n<\/html>\n\n\n\n<p>\u3000\u3055\u3066\u3001\u4e0a\u4f4d\u52e2\u306b\u7740\u76ee\u3059\u308b\u3068\u3001\u56f31\u306e\u3088\u3046\u306b\u306a\u308b\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"976\" height=\"520\" src=\"https:\/\/f1-lap-time.com\/wp-content\/uploads\/2025\/05\/newplot-1-1.png\" alt=\"\" class=\"wp-image-14487\" srcset=\"https:\/\/f1-lap-time.com\/wp-content\/uploads\/2025\/05\/newplot-1-1.png 976w, https:\/\/f1-lap-time.com\/wp-content\/uploads\/2025\/05\/newplot-1-1-300x160.png 300w, https:\/\/f1-lap-time.com\/wp-content\/uploads\/2025\/05\/newplot-1-1-768x409.png 768w\" sizes=\"auto, (max-width: 976px) 100vw, 976px\" \/><figcaption class=\"wp-element-caption\">\u56f31 \u4e0a\u4f4d\u52e2\u306e\u30ed\u30f3\u30b0\u30e9\u30f3<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\u3000\u6700\u521d\u306e3\u5468\u3053\u305d\u30eb\u30af\u30ec\u30fc\u30eb\u306e\u901f\u3055\u304c\u5149\u308b\u304c\u3001\u30c8\u30fc\u30bf\u30eb\u3067\u8003\u3048\u308b\u3068\u3001\u3084\u306f\u308a\u30de\u30af\u30e9\u30fc\u30ec\u30f3\u306f\u901f\u305d\u3046\u3060\u3002\u7d9a\u3044\u3066\u30a2\u30f3\u30c8\u30cd\u30c3\u30ea\u3002\u30d5\u30a7\u30eb\u30b9\u30bf\u30c3\u30da\u30f3\u306e\u30da\u30fc\u30b9\u306f\u30ac\u30bf\u3064\u304d\u304c\u5927\u304d\u3044\u304c\u3001\u30d4\u30fc\u30af\u306e\u90e8\u5206\u3060\u3051\u3092\u53d6\u3063\u3066\u307f\u3066\u3082\u3001\u30a2\u30f3\u30c8\u30cd\u30c3\u30ea\u306b\u53ca\u3093\u3067\u304a\u3089\u305a\u3001\u30cf\u30b8\u30e3\u30fc\u3068\u6bd4\u3079\u3066\u3082\u660e\u78ba\u306b\u4e0a\u56de\u3063\u3066\u3044\u308b\u3068\u306f\u8a00\u3048\u306a\u3044\u73fe\u72b6\u3060\u3002<\/p>\n\n\n\n<p>\u3000\u3055\u3066\u3001\u56f32\u306b\u3066\u305d\u308c\u4ee5\u964d\u306e\u30b0\u30eb\u30fc\u30d7\u3092\u898b\u3066\u307f\u3088\u3046\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"976\" height=\"520\" src=\"https:\/\/f1-lap-time.com\/wp-content\/uploads\/2025\/05\/newplot-2-2.png\" alt=\"\" class=\"wp-image-14489\" srcset=\"https:\/\/f1-lap-time.com\/wp-content\/uploads\/2025\/05\/newplot-2-2.png 976w, https:\/\/f1-lap-time.com\/wp-content\/uploads\/2025\/05\/newplot-2-2-300x160.png 300w, https:\/\/f1-lap-time.com\/wp-content\/uploads\/2025\/05\/newplot-2-2-768x409.png 768w\" sizes=\"auto, (max-width: 976px) 100vw, 976px\" \/><figcaption class=\"wp-element-caption\">\u56f32 \u30cf\u30b8\u30e3\u30fc\u4ee5\u964d\u306e\u30ed\u30f3\u30b0\u30e9\u30f3<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\u3000\u56f31\u3067\u30d5\u30a7\u30eb\u30b9\u30bf\u30c3\u30da\u30f3\u306b\u8feb\u3063\u305f\u30cf\u30b8\u30e3\u30fc\u304c\u3001\u3053\u306e\u4e2d\u3067\u306f\u4e00\u6b69\u629c\u3051\u51fa\u3057\u3066\u3044\u308b\u3002\u305f\u3060\u3057\u3001\u30b5\u30a4\u30f3\u30c4\u3082\u8fd1\u3044\u30da\u30fc\u30b9\u3092\u523b\u3093\u3067\u304a\u308a\u3001\u4eca\u56de\u3082\u30a6\u30a3\u30ea\u30a2\u30e0\u30ba\u306f\u7af6\u4e89\u529b\u304c\u3042\u308a\u305d\u3046\u3060\u3002\u307e\u305f\u6628\u4eca\u82e6\u6226\u304c\u7d9a\u304f\u30a2\u30b9\u30c8\u30f3\u30de\u30fc\u30c6\u30a3\u30f3\u3082\u3001\u30b9\u30c8\u30ed\u30fc\u30eb\u304c\u30aa\u30b3\u30f3\u3084\u30d2\u30e5\u30eb\u30b1\u30f3\u30d9\u30eb\u30b0\u3092\u4e0a\u56de\u308a\u3001\u96c6\u56e3\u306b\u52a0\u308f\u308c\u305d\u3046\u306a\u96f0\u56f2\u6c17\u3092\u91b8\u3057\u51fa\u3057\u3066\u3044\u308b\u3002<\/p>\n\n\n\n<p class=\"has-text-align-right\">Takumi<br>Hero image by ChatGPT<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>\u3000\u672c\u6295\u7a3f\u3067\u306f\u3001\u30a8\u30df\u30ea\u30a2\u30fb\u30ed\u30de\u30fc\u30cb\u30e3GP\u306eFP2\u306b\u304a\u3051\u308b\u30ed\u30f3\u30b0\u30e9\u30f3\u30da\u30fc\u30b9\u3092\u5206\u6790\u3059\u308b\u3002\u307e\u305a\u306f\u30013\u5468\u4ee5\u4e0a\u306e\u30ed\u30f3\u30b0\u30e9\u30f3\u3092\u884c\u3063\u305f\u30c9\u30e9\u30a4\u30d0\u30fc\u306e\u30e9\u30c3\u30d7\u30bf\u30a4\u30e0\u3092\u3001\u4ee5\u4e0b\u306e\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u30b0\u30e9\u30d5\u306b\u3066\u793a\u3059\u3002\u30dc\u30bf\u30f3\u64cd\u4f5c\u3067\u898b\u305f\u3044\u30c9\u30e9\u30a4\u30d0\u30fc\u3060\u3051\u3092\u8868 [&hellip;]<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":14491,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-14483","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/f1-lap-time.com\/index.php?rest_route=\/wp\/v2\/posts\/14483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/f1-lap-time.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/f1-lap-time.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/f1-lap-time.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/f1-lap-time.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=14483"}],"version-history":[{"count":4,"href":"https:\/\/f1-lap-time.com\/index.php?rest_route=\/wp\/v2\/posts\/14483\/revisions"}],"predecessor-version":[{"id":14492,"href":"https:\/\/f1-lap-time.com\/index.php?rest_route=\/wp\/v2\/posts\/14483\/revisions\/14492"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/f1-lap-time.com\/index.php?rest_route=\/wp\/v2\/media\/14491"}],"wp:attachment":[{"href":"https:\/\/f1-lap-time.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/f1-lap-time.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/f1-lap-time.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}