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))
三、关键细节解释
- 数据格式为什么要转?:ggplot2的核心逻辑是映射变量到图形属性(x轴、y轴、颜色等),长格式能让你轻松把「指标类型」映射到填充色,实现并列柱状。
- 并列柱状的实现:
position_dodge()让同一细胞类型下的%和MFI柱子并排,调整width参数可以控制柱子的宽度和间距。 - 颜色自定义:
scale_fill_manual()可以指定任意你想要的颜色,方便区分不同指标。 - 数值差距处理:用
facet_wrap(~protein, scales = "free_y")让每个蛋白的y轴独立缩放,这样%的微小变化和MFI的大幅变化都能清晰展示。
内容的提问来源于stack exchange,提问作者L V N Λ
相关产品推荐
相关产品推荐

