如何基于x轴创建二元变量的镜像可视化(ggplot实现)
2022参议院席位概率镜像柱状图实现方案
针对你想要将单一柱状图改为x轴两侧镜像柱形的需求,这里提供两种实现方式,核心是利用正负数值让两党概率分别落在坐标轴的正负区间,形成镜像效果:
方案1:纵向镜像(y轴正负区间)
这种方式保留你原代码的x轴为席位数量,民主党概率在y轴正方向,共和党概率在y轴负方向,形成上下镜像:
library(tidyverse) # 预处理数据:给共和党概率取负值,用于镜像展示 senate2022 <- senate2022 %>% mutate( seatprob_Rparty_neg = -seatprob_Rparty, outcome = ifelse(seatprob_Dparty > seatprob_Rparty, "blue", "red") ) # 绘制镜像柱状图 mirror_plot <- senate2022 %>% ggplot() + # 绘制民主党概率柱形(正方向) geom_col(aes(x = seatsheld, y = seatprob_Dparty, fill = "民主党"), alpha = 0.7) + # 绘制共和党概率柱形(负方向,镜像) geom_col(aes(x = seatsheld, y = seatprob_Rparty_neg, fill = "共和党"), alpha = 0.7) + # 添加多数席位参考线 geom_vline(xintercept = 50, linetype = "dashed", color = "gray50") + # 调整y轴:将负标签转为正数值,符合概率的阅读习惯 scale_y_continuous( breaks = seq(-100, 100, 25), labels = abs(seq(-100, 100, 25)), name = "获胜概率 (%)" ) + # 设置党派对应颜色 scale_fill_manual(values = c("民主党" = "blue", "共和党" = "red")) + # 图表标签与主题调整 labs( x = "参议院席位数量", title = "2022年参议院席位获胜概率镜像图", fill = "党派" ) + theme_minimal() mirror_plot
方案2:横向镜像(x轴正负区间)
如果希望镜像效果在x轴左右两侧展示(y轴为席位数量),可以用以下代码:
# 横向镜像版本 mirror_plot_horizontal <- senate2022 %>% ggplot() + # 民主党概率柱形(x轴正方向) geom_col(aes(x = seatprob_Dparty, y = seatsheld, fill = "民主党"), alpha = 0.7, orientation = "y") + # 共和党概率柱形(x轴负方向,镜像) geom_col(aes(x = -seatprob_Rparty, y = seatsheld, fill = "共和党"), alpha = 0.7, orientation = "y") + # 多数席位参考线 geom_hline(yintercept = 50, linetype = "dashed", color = "gray50") + # 调整x轴标签为正数值 scale_x_continuous( breaks = seq(-100, 100, 25), labels = abs(seq(-100, 100, 25)), name = "获胜概率 (%)" ) + scale_fill_manual(values = c("民主党" = "blue", "共和党" = "red")) + labs( y = "参议院席位数量", title = "2022年参议院席位获胜概率横向镜像图", fill = "党派" ) + theme_minimal() mirror_plot_horizontal
关键说明
- 核心逻辑是通过取负值将其中一组数据映射到坐标轴的负区间,和正区间的另一组形成镜像
- 调整坐标轴标签时用
abs()将负数值转为正,避免概率显示为负数的困惑 - 保留了你原代码中50席位的参考线,明确参议院多数席位的分界线
内容的提问来源于stack exchange,提问作者opalwilderness
相关产品推荐
相关产品推荐

