Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
ixxmu opened this issue Sep 4, 2024 · 1 comment
Closed

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

ixxmu opened this issue Sep 4, 2024 · 1 comment

Comments

@ixxmu
Copy link
Owner

ixxmu commented Sep 4, 2024

https://mp.weixin.qq.com/s/NnE_GQKYUNPfgeN22DWcUg

@ixxmu
Copy link
Owner Author

ixxmu commented Sep 4, 2024

数据框的列名居然会影响绘图 by 珠海健明生物医药科技

我们的生物信息学马拉松授课非常注重于编程基础,一般来说完成了两周的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值和显著性标记
  • 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.

    解决方案修改一下数据库里面的列名字即可,不能是expression,可以是exp,哈哈哈   

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

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

    成功的绘图

    写在文末

    如果你也想做单细胞转录组数据分析,最好是有自己的计算机资源哦,比如我们的2024的共享服务器交个朋友福利价仍然是800,而且还需要有基本的生物信息学基础,也可以看看我们的生物信息学马拉松授课(买一得五) ,你的生物信息学入门课。

    当然了,八月份比较特殊的是:单细胞数据挖掘线下培训(南京站),这个周六日,也就是明天啦,我们可以线下授课,惊喜不!


    @ixxmu ixxmu changed the title archive_request 数据框的列名居然会影响绘图 Sep 4, 2024
    @ixxmu ixxmu closed this as completed Sep 4, 2024
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Projects
    None yet
    Development

    No branches or pull requests

    1 participant