
Exploratoryでスタックバーチャート(積み上げ棒グラフ)を作成する際、通常は「色」に割り当てたカテゴリーごとにバーが積み上げられます。しかし、特定のカテゴリーで色を統一しつつ、その内部でさらに個別の要素ごとにバーを分割して表示したい場合があります。
今回は、標準のチャート機能では難しい「カテゴリーごとの色分け」と「個別要素によるバーの分割」を両立させる方法として、バージョン15で追加された「カスタムRチャート」を活用する手順を紹介します。
バーチャートの「色で分割」に特定の列(例:賛否区分)を指定すると、そのカテゴリーごとに色を分けることはできますが、カテゴリー内の個別のデータ(例:動画ごとの境界)を視覚的に区別することができません。
一方で、個別のID(例:投稿ID)を「色で分割」に指定すると、今度は動画ごとに異なる色が割り当てられてしまい、本来表現したいカテゴリー(賛成・反対など)による色分けが失われてしまいます。このように、一つの軸で「グループの色」と「個別の区切り」を同時に表現できないという課題があります。
今回使用するデータは、1行が1つの動画の再生数を表すデータです。列には「政策テーマ」、「再生数」、「投稿ID(動画の識別子)」、そして「賛否区分(賛成・反対)」が含まれています。

まず、標準のバーチャートで可視化を試みます。X軸に「政策テーマ」、Y軸に「再生数」の合計を指定します。ここで「色で分割」に「投稿ID」を割り当てると、各テーマ内で動画ごとにバーが積み上がりますが、動画の数だけ色が使われるため、直感的に賛成・反対の傾向を掴むことが難しくなります。

次に、「色で分割」を「賛否区分」に変更すると、賛成と反対で色を分けることはできますが、バーが大きな塊として表示され、個別の動画がどれくらいの再生数を稼いでいるのかという詳細な内訳が見えなくなってしまいます。

この問題を解決するために、Exploratoryの「カスタムRチャート」機能を使用します。これにより、Rの描画ライブラリである「ggplot2」を直接制御し、より柔軟な表現が可能になります。
カスタムRチャートを選択し、Rのスクリプトを記述します。

今回のスクリプトでは、データの並び順を制御する加工を行った後、ggplot2を使用してチャートを描画します。具体的には、バーの塗りつぶし色(fill)には「賛否区分」を指定し、バーの区切り(interaction)として「投稿ID」を指定する設定を行います。
library(dplyr)
library(ggplot2)
# --- 1. 政策テーマを再生数の降順に並べる ---
テーマ順 <- ${DATA} %>% # ← データフレーム名に置き換え
count(政策テーマ, wt = 再生数, name = "合計") %>%
arrange(desc(合計)) %>%
pull(政策テーマ)
# --- 2. 各バー内の積み上げ順(賛否でまとめ、再生の大きい順)---
chart_df <- ${DATA} %>%
mutate(政策テーマ = factor(政策テーマ, levels = テーマ順)) %>%
group_by(政策テーマ) %>%
arrange(賛否区分, desc(再生数), .by_group = TRUE) %>%
mutate(積み上げ順 = row_number()) %>% # ← 投稿ごとの区切り順
ungroup()
# --- 3. 描画:group=投稿ごとの区切り / fill=賛否区分(色)---
ggplot(chart_df,
aes(x = 政策テーマ, y = 再生数,
group = 積み上げ順, # ← 区切り用の次元(投稿単位)
fill = 賛否区分)) + # ← 色用の次元(別列)
geom_col(color = "white", linewidth = 0.2,
position = position_stack(reverse = TRUE)) +
scale_fill_manual(values = c("賛成" = "#2E6FD6", # 賛成=青
"反対" = "#D6402E")) + # 反対=赤
scale_y_continuous(labels = scales::label_number(scale = 1e-3, suffix = "K")) +
labs(x = "政策テーマ", y = "再生数", fill = "賛否",
title = "政策テーマ別再生数(投稿ごとに区切り・賛否で色分け)") +
theme_minimal() +
theme(text = element_text(family = "HiraKakuProN-W3"),
axis.text.x = element_text(angle = 30, hjust = 1))

この設定により、同じ「賛成」のカテゴリー内であっても、動画ごとに白い境界線で区切られたスタックバーチャートが作成されます。これにより、テーマごとの賛否のボリュームを把握しつつ、特定のテーマで非常に再生数が多い動画が存在するかどうかを同時に確認できるようになります。
