【QuickSight】Highchartsの機能を使って、番組表が作りたいんじゃ。
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以外の箇所の説明です。
"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を指定しているのと、inverted
をtrueにしています。こうすることで、横長に広がるグラフを縦にすることができます。
invertedを入れていない場合
・legend
で汎用を非表示に。
・tooltip
で番組名と視聴率を表示。
seriesの部分
次に、seriesの部分を説明します。
"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まで表示して、あふれる分は...で表示。
②ブロック下部右に、視聴率を表示。
"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
は、yAxis
のcategories
で指定した番号に、caseで番組名が**=**だったらという形で配置
・partialFill
は進捗度を表すので、ブロックの中でデーターバーみたいなものが表示されるのですが、こちらは今回に関しては邪魔なので、0%に。
・color
の部分で、視聴率が15以上の場合は、ピンクに色付け
・ここでも、dataLabels
を指定してる理由は、番組分数が15分以下の場合は、dataLabels
を表示しない。としているため。
という感じになります。
注意点
注意点としては、ディメンション側での操作も忘れないことかなと。
こういうところも指定しないと正しく表示されませんので注意して下さい。
最後に
何に使うんだ…というのは、置いといて。いろいろ頑張ればできるようになってきました。
アクションとかの設定はそのまま使用できますので、別のデータへの連携等も簡単にできます。
例えば、パラメータ制御で視聴率の色付けをしたいという場合は、計算フィールドでパラメータだけのものを作りディメンションに追加して、それをgetCloumnしてやれば出来たりもするので、パラメータも色々使えます。試してみてください。
Discussion