You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 09:47:44