🚀

【QuickSight】Highchartsの機能を使って、番組表が作りたいんじゃ。

2025/01/10に公開

QuickSightで番組表を作りたくなる時ってありますよね。私はあります。
Hightchatrsの機能を使えばそれができます。できるというか、ぽいものが作れます。

完成の画面



テストデータ

例のごとくChatGPTに作成してもらいました。すべて架空のお話です。すごい気になる番組ばっかり。宇宙よりの放送局ばっかりですね。

放送日 放送局 放送開始時間 放送終了時間 番組名 視聴率 放送分数
2025-01-10 フューチャービジョン 2025-01-10 06:00 2025-01-10 07:27 おはよう3Dワールド 12 87
2025-01-10 フューチャービジョン 2025-01-10 07:27 2025-01-10 09:09 モーニング未来ニュース 5 102
2025-01-10 フューチャービジョン 2025-01-10 09:09 2025-01-10 10:16 ドローンサロン 0 67
・・・ ・・・ ・・・ ・・・ ・・・ ・・・ ・・・
2025-01-10 コメットネットワーク 2025-01-10 00:45 2025-01-11 02:45 星空ディープトーク 5 120
2025-01-11 コメットネットワーク 2025-01-11 02:45 2025-01-11 03:00 ミッドナイト・コメット 30 15

完成のコード

{
  "chart": {
    "type": "xrange",
    "inverted": true
  },
  "legend": {
    "enabled": false
  },
  "time": {
    "timezone": "Asia/Tokyo"
  },
  "xAxis": {
    "type": "datetime"
  },
  "yAxis": {
    "title": {
      "text": "CH"
    },
    "categories": ["フューチャービジョン", "エンジェル放送", "ビーミングテレビ", "コメットネットワーク", "スターライトステーション"]
  },
  "tooltip": {
    "headerFormat": "",
    "pointFormat": "{point.name}: {point.value}%"
  },
  "series": [
    {
      "type": "xrange",
      "pointWidth": 180,
      "dataLabels": [
        {
          "enabled": true,
          "format": "{point.options.name}",
          "align": "center",
          "verticalAlign": "middle",
          "style": {
            "textOverflow": "ellipsis",
            "width": 170
          }
        },
        {
          "enabled": true,
          "format": "{point.options.value}%",
          "align": "right",
          "verticalAlign": "bottom",
          "style": {
            "textOverflow": "ellipsis",
            "width": 170
          }
        }
      ],
      "data": [
        "map",
        ["getColumn", 0, 1, 2, 3, 4, 5, 6],
        {
          "value": ["get", ["item"], 5],
          "name": ["get", ["item"], 4],
          "x": ["get", ["item"], 2],
          "x2": ["get", ["item"], 3],
          "y": [
            "case",
            ["==", ["get", ["item"], 1], "フューチャービジョン"],
            0,
            ["==", ["get", ["item"], 1], "エンジェル放送"],
            1,
            ["==", ["get", ["item"], 1], "ビーミングテレビ"],
            2,
            ["==", ["get", ["item"], 1], "コメットネットワーク"],
            3,
            ["==", ["get", ["item"], 1], "スターライトステーション"],
            4,
            5
          ],
          "partialFill": 0,
          "color": [
            "case",
            [">=", ["get", ["item"], 5], 15],
            "#FFAAAA",
            "transparent"
          ],
          "borderColor": "#000000",
          "borderWidth": 1,
          "dataLabels": {
            "enabled": ["case", [">", ["get", ["item"], 6], 15], true, false]
          }
        }
      ]
    }
  ]
}

ディメンションの順番

ディメンションの順番は、コード内に影響があります。注意してください。

作りかた。

使用したChart

まず、今回はxrangeのグラフを使用します。xrangeはQuickSightのsampleにもある、

こちらのようなグラフになります。これをベースに作成していきます。

コードの説明

series以外

まずは、series以外の箇所の説明です。

series以外
 "chart": {
    "type": "xrange",
    "inverted": true
  },
  "legend": {
    "enabled": false
  },
  "time": {
    "timezone": "Asia/Tokyo"
  },
  "xAxis": {
    "type": "datetime"
  },
  "yAxis": {
    "title": {
      "text": "CH"
    },
    "categories": ["フューチャービジョン", "エンジェル放送", "ビーミングテレビ", "コメットネットワーク", "スターライトステーション"]
  },
  "tooltip": {
    "headerFormat": "",
    "pointFormat": "{point.name}: {point.value}%"
  },

chartでは、念のためtypeを指定しているのと、invertedtrueにしています。こうすることで、横長に広がるグラフを縦にすることができます。

invertedを入れていない場合

legendで汎用を非表示に。
tooltipで番組名と視聴率を表示。

seriesの部分

次に、seriesの部分を説明します。

seriesの部分(dataLabelsまで)
"series": [
    {
      "type": "xrange",
      "pointWidth": 180,
      "dataLabels": [
        {
          "enabled": true,
          "format": "{point.options.name}",
          "align": "center",
          "verticalAlign": "middle",
          "style": {
            "textOverflow": "ellipsis",
            "width": 170
          }
        },
        {
          "enabled": true,
          "format": "{point.options.value}%",
          "align": "right",
          "verticalAlign": "bottom",
          "style": {
            "textOverflow": "ellipsis",
            "width": 170
          }
        }
      ]

・seriesの中でもtypeを指定します。これはなくても動きますが、warningが出るのでそうしてます。
pointWidthで番組のブロックの横幅を指定します。
dataLabelsでブロックの中の文字を表示します。二つの文字を書いていて、
 ①ブロックの中央に番組名を、widthの170まで表示して、あふれる分は...で表示。
 ②ブロック下部右に、視聴率を表示。

seriesの部分(dataの箇所)
"data": [
        "map",
        ["getColumn", 0, 1, 2, 3, 4, 5, 6],
        {
          "value": ["get", ["item"], 5],
          "name": ["get", ["item"], 4],
          "x": ["get", ["item"], 2],
          "x2": ["get", ["item"], 3],
          "y": [
            "case",
            ["==", ["get", ["item"], 1], "フューチャービジョン"],
            0,
            ["==", ["get", ["item"], 1], "エンジェル放送"],
            1,
            ["==", ["get", ["item"], 1], "ビーミングテレビ"],
            2,
            ["==", ["get", ["item"], 1], "コメットネットワーク"],
            3,
            ["==", ["get", ["item"], 1], "スターライトステーション"],
            4,
            5
          ],
          "partialFill": 0,
          "color": [
            "case",
            [">=", ["get", ["item"], 5], 15],
            "#FFAAAA",
            "transparent"
          ],
          "borderColor": "#000000",
          "borderWidth": 1,
          "dataLabels": {
            "enabled": ["case", [">", ["get", ["item"], 6], 15], true, false]
          }
        }
      ]

valueには視聴率、nameに番組名、xに放送開始時間、x2に放送終了時間を。
yは、yAxiscategoriesで指定した番号に、caseで番組名が**=**だったらという形で配置
partialFillは進捗度を表すので、ブロックの中でデーターバーみたいなものが表示されるのですが、こちらは今回に関しては邪魔なので、0%に。
colorの部分で、視聴率が15以上の場合は、ピンクに色付け
・ここでも、dataLabelsを指定してる理由は、番組分数が15分以下の場合は、dataLabelsを表示しない。としているため。

という感じになります。

注意点

注意点としては、ディメンション側での操作も忘れないことかなと。

こういうところも指定しないと正しく表示されませんので注意して下さい。

最後に

何に使うんだ…というのは、置いといて。いろいろ頑張ればできるようになってきました。
アクションとかの設定はそのまま使用できますので、別のデータへの連携等も簡単にできます。
例えば、パラメータ制御で視聴率の色付けをしたいという場合は、計算フィールドでパラメータだけのものを作りディメンションに追加して、それをgetCloumnしてやれば出来たりもするので、パラメータも色々使えます。試してみてください。

Discussion