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

R语言柱状图制作:新手数据整理与可视化求助

针对你的实验数据制作并列双柱状图(R语言 ggplot2)

一、先明确:必须调整数据格式

原始数据是宽格式,不符合ggplot2的要求,需要转成长格式(tidy data)——每一行对应一个观测值,每一列对应一个变量。你之前设想的格式不对,正确的整理方式如下:

步骤1:加载数据并整理

先把你的数据导入R,再用tidyverse工具整理:

# 加载你的数据
df <- structure(list(ICS = c("WT negative control", "WT", "CD8-HLA-E negative control", "CD8-HLA-E", "CD8-HLA-F negative control", "CD8-HLA-F"), `% CD8` = c(0.012, 0.11, 0.025, 14, 0.075, 3.14), `MFI CD8` = c(850, 2341, 828, 4040, 803, 2672), `% Myc` = c(0.012, 1.46, 0, 3.85, 0.012, 1.61), `MFI Myc` = c(6165, 11407, 6397, 14860, 6056, 12021), `% HLA-A,B,C` = c(0.67, 99.3, 1.82, 99.2, 1.15, 99.4), `MFI HLA-A,B,C` = c(5716, 62177, 6042, 65998, 5664, 63194)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))

# 加载tidyverse
library(tidyverse)

# 整理数据:提取细胞类型、拆分指标类型
df_clean <- df %>%
  # 从ICS列拆分出细胞类型(去掉"negative control"后缀)
  mutate(cell_type = str_remove(ICS, " negative control")) %>%
  # 只保留实验组数据(对照组是基线,你要的是3组细胞的实验数据)
  filter(!str_detect(ICS, "negative control")) %>%
  # 把宽格式转成长格式:拆分%和MFI指标
  pivot_longer(
    cols = starts_with(c("% ", "MFI ")),
    names_to = c("metric_type", "protein"),
    names_sep = " ",
    values_to = "value"
  )

整理后的数据结构:每行包含「细胞类型」「指标类型(%/MFI)」「蛋白名称」「数值」,完全适配ggplot2。

二、绘制并列双柱状图

场景1:单个蛋白的3组细胞并列柱状图

比如只看CD8蛋白的%和MFI:

# 筛选CD8蛋白数据
cd8_data <- df_clean %>% filter(protein == "CD8")

# 绘图
ggplot(cd8_data, aes(x = cell_type, y = value, fill = metric_type)) +
  # 并列柱状:position_dodge实现并列,width控制柱子宽度
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  # 自定义颜色:区分%和MFI
  scale_fill_manual(values = c("% " = "#2c3e50", "MFI " = "#e74c3c")) +
  # 添加标题和标签
  labs(
    title = "CD8蛋白占比与平均荧光强度",
    x = "细胞类型",
    y = "数值",
    fill = "指标类型"
  ) +
  # 简洁主题
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

场景2:所有蛋白的分组展示(解决数值差距大的问题)

因为%和MFI数值差距极大(%是0-100,MFI是几千到几万),直接放同一y轴会导致%的柱子几乎看不见,用分面功能分开展示:

ggplot(df_clean, aes(x = cell_type, y = value, fill = metric_type)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  scale_fill_manual(values = c("% " = "#2c3e50", "MFI " = "#e74c3c")) +
  labs(
    title = "各蛋白占比与平均荧光强度",
    x = "细胞类型",
    y = "数值",
    fill = "指标类型"
  ) +
  # 按蛋白分面,每个分面y轴独立缩放
  facet_wrap(~protein, scales = "free_y") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

三、关键细节解释

  1. 数据格式为什么要转?:ggplot2的核心逻辑是映射变量到图形属性(x轴、y轴、颜色等),长格式能让你轻松把「指标类型」映射到填充色,实现并列柱状。
  2. 并列柱状的实现:position_dodge()让同一细胞类型下的%和MFI柱子并排,调整width参数可以控制柱子的宽度和间距。
  3. 颜色自定义:scale_fill_manual()可以指定任意你想要的颜色,方便区分不同指标。
  4. 数值差距处理:用facet_wrap(~protein, scales = "free_y")让每个蛋白的y轴独立缩放,这样%的微小变化和MFI的大幅变化都能清晰展示。

内容的提问来源于stack exchange,提问作者L V N Λ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:55:54