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

如何在ggplot中选取多变量作为X轴制作药物使用柱状图?

解决ggplot多变量作为X轴绘制药物使用柱状图的问题

你的核心问题是当前数据为宽格式(每类药物单独占一列),而ggplot需要长格式数据(用一个列统一表示药物类型,另一个列表示使用情况),才能把药物类型设为X轴。下面是具体解决步骤:

1. 数据转换:保留城乡变量+转长格式

首先要把城乡分类变量(假设原数据中对应列名为urban_rural,请替换为实际列名)和9类药物列一起选中,再用pivot_longer转成适合绘图的长格式:

library(tidyverse)

# 筛选所需列并转换为长格式
druguse_long <- data1.cleaned %>%
  select(urban_rural, MJEVER, COCEVER, CRKEVER, HEREVER, HALLUCEVR,
         METHAMEVR, INHALEVER, PNRNMLIF, STMANYLIF) %>%
  pivot_longer(
    cols = -urban_rural,  # 除城乡列外,其余药物列转成长格式
    names_to = "drug_type",  # 新列:存储药物类型代码
    values_to = "used"  # 新列:存储是否使用(Yes/No/NA)
  ) %>%
  # 可选:把药物代码替换为易懂的中文名称
  mutate(drug_type = recode(drug_type,
    MJEVER = "大麻",
    COCEVER = "可卡因",
    CRKEVER = "快克",
    HEREVER = "海洛因",
    HALLUCEVR = "致幻剂",
    METHAMEVR = "冰毒",
    INHALEVER = "吸入剂",
    PNRNMLIF = "止痛药",
    STMANYLIF = "兴奋剂"
  ))

2. 绘制柱状图

基于转换后的长格式数据,可根据需求选择两种常见可视化样式:

样式1:分组并列柱状图

展示每类药物下,不同城乡群体的使用比例(或计数):

ggplot(druguse_long %>% filter(!is.na(used)), aes(x = drug_type, fill = urban_rural)) +
  geom_bar(position = "dodge", aes(y = ..prop.., group = urban_rural)) +  # 按比例展示
  # 若需展示绝对计数,替换为:geom_bar(position = "dodge")
  labs(
    x = "药物类型",
    y = "使用比例",
    fill = "城乡级别",
    title = "不同城乡群体的药物使用情况"
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # X轴标签倾斜,避免重叠

样式2:分面柱状图

如果分组图过于拥挤,可按城乡分栏展示:

ggplot(druguse_long %>% filter(!is.na(used)), aes(x = drug_type, fill = used)) +
  geom_bar(position = "fill") +  # 堆叠展示使用比例
  facet_wrap(~urban_rural) +
  labs(
    x = "药物类型",
    y = "比例",
    fill = "是否使用",
    title = "不同城乡群体的药物使用情况"
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

关键提示

  • 你之前仅选择了药物列,丢失了城乡变量的关联,必须将城乡列与药物列一同保留才能实现分组统计。
  • pivot_longer是宽转长的核心工具,它把多列药物数据合并为"药物类型"和"使用情况"两个列,这是ggplot能识别X轴的前提。
  • 若使用NSDUH抽样数据,建议在geom_bar中加入weight = 权重列名,保证统计结果符合抽样设计要求。

内容的提问来源于stack exchange,提问作者Kimberly Boland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:45:28