基于smoke与vaping百分比总和排序R语言ggplot2双图
解决方法
步骤1:准备数据(以模拟匹配需求的示例数据为例)
先假设你的数据包含country(国家)、smoke(类别:吸烟/电子烟)和count(对应人数)三列,模拟数据如下:
library(tidyverse) df <- tibble( country = rep(c("FRANCE", "USA", "UK", "GERMANY"), each = 2), smoke = rep(c("smoke", "vaping"), 4), count = c(35, 25, 30, 20, 25, 15, 20, 10) )
步骤2:确定国家的排序规则
先计算每个国家吸烟+电子烟的总人数(如果你的数据是百分比列,直接求和百分比即可),再按总和降序提取国家名称作为排序依据,最后把country转为对应顺序的因子:
# 计算各国总人数并降序排列,提取国家顺序 country_order <- df %>% group_by(country) %>% summarise(total = sum(count)) %>% # 若用百分比则替换为sum(percentage) arrange(desc(total)) %>% pull(country) # 将原数据的country列转为因子,指定levels为上述排序 df <- df %>% mutate(country = factor(country, levels = country_order))
步骤3:绘制同步排序的两个图表
左侧堆叠百分比柱状图
p_percent <- ggplot(df, aes(x = country, y = count, fill = smoke)) + geom_col(position = "fill") + # position="fill"自动转换为百分比堆叠 scale_y_continuous(labels = scales::percent) + labs(title = "各国吸烟/电子烟使用占比", y = "百分比", x = "国家") + theme_minimal()
右侧计数柱状图(总人数)
p_count <- df %>% group_by(country) %>% summarise(total_count = sum(count)) %>% ggplot(aes(x = country, y = total_count)) + geom_col(fill = "#3498db") + labs(title = "各国吸烟/电子烟总人数", y = "总人数", x = "国家") + theme_minimal()
合并展示两个图表
用patchwork包可以快速拼接图表:
library(patchwork) p_percent + p_count
核心逻辑说明
ggplot的x轴顺序由因子的levels决定,我们通过计算总和得到排序后,把country转为对应顺序的因子,就能保证两个图表的国家排序完全同步。如果你的smoke列不是因子,也可以用mutate(smoke = factor(smoke))指定类别顺序,不影响国家排序的逻辑。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

