数据框的列名居然会影响绘图

我们的生物信息学马拉松授课非常注重于编程基础,一般来说完成了两周的r编程语言的互动式授课之后我仍然是会建议大家完成我的b站视频学习和对应的100个r练习题;

生信基石之R语言
B站的10个小时教学视频务必看完,参考 GitHub 仓库存放的相关学习路线指导资料:https://github.com/jmzeng1314/R_bilibili ,思维导图在,https://share.mubu.com/doc/HGT7XBmgg

可以参考一些优秀笔记,比如https://mubu.com/doc/2KUiSCfVsg

初级10 个题目:http://www.bio-info-trainee.com/3793.html 
中级要求是:http://www.bio-info-trainee.com/3750.html
高级要求是完成20题: http://www.bio-info-trainee.com/3415.html
统计专题 30题:http://www.bio-info-trainee.com/4385.html
可视化专题30题:http://www.bio-info-trainee.com/4387.html

r全套资料
很多朋友之所以学习R语言其实就是为了重复一些简单的数据库挖掘文章,所以我也顺便录制了GEO数据库挖掘课程,代码在:https://github.com/jmzeng1314/geo,如果你网络很差,就下载打包版本的geo代码,https://share.weiyun.com/5vrfsqv

授课配套思维导图是,https://share.mubu.com/doc/19S0XYlVcg
配套教学视频在B站:https://www.bilibili.com/video/av26731585/
还有一个公共数据库挖掘:https://www.bilibili.com/video/av37568990

如果是需要安装R包,请务必参考:http://www.bio-info-trainee.com/3727.html 代码
专门为R语言建立了 GitHub 仓库存放相关学习路线指导资料:https://github.com/jmzeng1314/R_bilibili

最近有小伙伴反馈在做题的时候出现了一个百思不得其解的bug,是数据框的列名居然会影响绘图,蛮适合我们的人工智能大模型答疑的专辑,所以我也视频演练了一下;

第一次提问:在r编程语言里面绘制一个箱线图

在R语言中,你可以使用ggplot2包来绘制箱线图,或者使用基础图形系统中的boxplot()函数。以下是两种方法的示例:

使用ggplot2包绘制箱线图

首先,确保你已经安装并加载了ggplot2包:

install.packages("ggplot2") # 如果你还没有安装ggplot2包
library(ggplot2)

然后,创建一些模拟数据并绘制箱线图:

# 创建模拟数据
set.seed(123) # 为了可重复性
data <- data.frame(
 Category = rep(c("Group1", "Group2"), each = 100),
 Value = c(rnorm(100, mean = 50, sd = 10), rnorm(100, mean = 60, sd = 15))
)

# 使用ggplot2绘制箱线图
ggplot(data, aes(x = Category, y = Value)) +
 geom_boxplot() +
 labs(title = "Boxplot Example", x = "Category", y = "Values")

使用基础R函数boxplot()绘制箱线图

如果你不想使用ggplot2,可以使用R的基础图形函数boxplot()

# 使用相同的模拟数据
boxplot(Value ~ Category, data = data,
 ylab = "Values", xlab = "Category",
 main = "Boxplot Example")

这两个示例都会生成一个箱线图,显示两个组(Group1和Group2)的值分布。ggplot2提供了更多的定制选项和美观的图形输出,而boxplot()函数则提供了一个更简单快捷的绘图方法。根据你的具体需求和偏好选择使用哪一种。

第二次提问;还有ggpubr包,ggstat等吗

在R语言中,除了ggplot2包之外,还有几个扩展包可以用于绘制包含统计信息的图形,包括箱线图。以下是两个常用的包:

  1. ggpubr包
  • ggpubr是一个基于ggplot2的扩展包,它提供了创建符合出版物要求的图形的功能。这个包简化了为ggplot2图形添加p值和显著性标记的过程,并且支持多种图形的绘制,如箱线图、点图、条形图和线图等。安装可以通过CRAN或GitHub进行:
 install.packages("ggpubr")
 # 或者
 devtools::install_github("kassambara/ggpubr")
  • 使用ggpubr绘制箱线图的示例代码:
 library(ggpubr)
 ggboxplot(data, x = "分组变量", y = "数值变量",
 palette = "jco") + # 使用jco颜色方案
 stat_compare_means() # 添加p值和显著性标记
  1. ggstatsplot包
  • ggstatsplot是另一个ggplot2的扩展包,它允许用户创建包含统计细节的图形。这个包特别适合科研人员,因为它提供了一系列的函数来绘制箱线图、散点图、直方图等,并自动包含统计测试的结果。安装可以通过GitHub:
 devtools::install_github("IndrajeetPatil/ggstatsplot")
  • 使用ggstatsplot绘制箱线图的示例代码:
 library(ggstatsplot)
 ggbetweenstats(data = 数据框,
 x = 分组变量,
 y = 数值变量,
 type = "p", # 显著性类型
 conf.level = 0.95) # 置信水平

这两个包都提供了丰富的定制选项和自动化的统计测试结果展示,使得数据可视化和结果解释更加直观和方便。

第三次提问:直接把报错的bug贴给大模型

我使用了ggstatsplot然后报错了Error in `select()`:
! Names must be unique.
✖ These names are duplicated:
 * "expression" at locations 2 and 11.
Run `rlang::last_trace()` to see where the error occurred.

在使用ggstatsplot包绘制图形时遇到”Error in select(): ! Names must be unique.”的错误,这通常意味着在数据处理过程中,列名或其他标识符出现了重复。根据搜索结果,这个问题可能与数据处理方式有关,尤其是在使用dplyr包的select()函数时。

解决这个问题的一种方法是确保在进行选择操作时,所选的列名是唯一的。例如,如果你在创建一个自定义函数来绘制图形,并且函数内部使用了select(),你需要确保传递给select()的变量名在数据框中不是重复的。如果需要从函数参数中动态选择列,可以使用rlang包中的sym()!!操作符来避免非预期的列名重复问题。

此外,如果错误发生在使用ggstatsplotggwithinstats()函数时,这可能是因为在处理大量数据点时,函数内部的某些操作导致了列名不唯一。在这种情况下,尝试减少数据点的数量,或者检查数据框确保没有重复的列名,可能会有所帮助。

如果上述方法仍然不能解决问题,建议查看ggstatsplot的官方文档和GitHub问题跟踪页面,看看是否有其他用户报告了类似的问题以及可能的解决方案。同时,确保你的ggstatsplot包是最新版本,因为软件更新可能包含错误修复。

模拟数据测试流程:


# 创建模拟数据
set.seed(123) # 为了可重复性
data <- data.frame(
 Category = rep(c("Group1", "Group2"), each = 100),
 Value = c(rnorm(100, mean = 50, sd = 10), rnorm(100, mean = 60, sd = 15))
)
library(ggplot2)
# 使用ggplot2绘制箱线图
ggplot(data, aes(x = Category, y = Value)) +
 geom_boxplot() +
 labs(title = "Boxplot Example", x = "Category", y = "Values") + theme_minimal()

library(ggstatsplot)
ggbetweenstats(data = data ,
 x = Category,
 y = Value ,
 type = "p", # 显著性类型
 conf.level = 0.95) # 置信水平

df=data.frame(
 expression=rnorm(100),
 gene=rep(LETTERS[1:5],20)
)
head(df)
library(ggplot2)
# 使用ggplot2绘制箱线图
ggplot(df, aes(x = gene, y = expression)) +
 geom_boxplot() +
 labs(title = "Boxplot Example", x = "Category", y = "Values") + theme_minimal()

library(ggstatsplot)
ggbetweenstats(data = df,
 x = gene,
 y = expression ,
 type = "p", # 显著性类型
 conf.level = 0.95) # 置信水平

最后还是靠人工debug

定位到了 : https://github.com/IndrajeetPatil/ggstatsplot/issues/396

> rlang::last_trace()
<error/vctrs_error_names_must_be_unique>
Error in `select()`:
! Names must be unique.
✖ These names are duplicated:
 * "expression" at locations 2 and 11.
---
Backtrace:
 ▆
 1. ├─ggstatsplot::ggbetweenstats(...)
 2. │ ├─base::suppressWarnings(...)
 3. │ │ └─base::withCallingHandlers(...)
 4. │ └─ggstatsplot:::.centrality_ggrepel(...)
 5. │ ├─base::suppressWarnings(...)
 6. │ │ └─base::withCallingHandlers(...)
 7. │ └─statsExpressions::centrality_description(...)
 8. │ └─... %>% .glue_to_expression()
 9. ├─statsExpressions:::.glue_to_expression(.)
 10. │ └─... %>% .add_package_class()
 11. ├─statsExpressions:::.add_package_class(.)
 12. │ └─tibble::as_tibble(data)
 13. ├─dplyr::mutate(...)
 14. ├─dplyr::ungroup(.)
 15. ├─dplyr::mutate(., expression = list(parse_expr(expression)))
 16. ├─dplyr::rowwise(.)
 17. ├─dplyr::select(...)
 18. └─dplyr:::select.data.frame(...)
Run rlang::last_trace(drop = FALSE) to see 14 hidden frames.

解决方案:

colnames(df)[1]='exp'
head(df)
library(ggstatsplot)
ggbetweenstats(data = df,
 x = gene,
 y = exp ,
 type = "p", # 显著性类型
 conf.level = 0.95) # 置信水平

成功的绘图应该是如下所示:

成功的绘图

Comments are closed.