用闪亮的 ggplot2 绘制基因 FPKM 归一化计数值

Posted

技术标签:

【中文标题】用闪亮的 ggplot2 绘制基因 FPKM 归一化计数值【英文标题】:Plot the gene FPKM normalized counts value with ggplot2 in shiny 【发布时间】:2021-04-28 05:38:11 【问题描述】:

我只想绘制一张图像,其中 x 命名为不同的样本,y 命名为不同的基因符号。我还想在闪亮中使用 ggplot2 添加 geom_errorbar。

我希望如果我输入一个基因符号,情节会出现在旁边。

但我试了几次,但我不知道为什么它没有显示。

有两个输入文件。一个是每个样本的平均值,另一个是sd值文件。

我的代码示例如下:

library(shiny)
library(ggplot2)
library(ggpubr)

mean_data<-data.frame(Name=c(paste0("Group_",LETTERS[1:20])),
                      matx<-matrix(sample(1:1000,1000,replace = T),nrow = 20)
)
names(mean_data)[-1]<-c(paste0("Gene_",1:50))
sd_data<-data.frame(Name=c(paste0("Group_",LETTERS[1:20])),
                    matx<-matrix(runif(1000,5,10),nrow = 20)
)
names(sd_data)[-1]<-c(paste0("Gene_",1:50))



# Define UI for app that draws a histogram ----
ui <- fluidPage(
  
  h4("Gene_FPKM Value Barplot"),
  br(),
  sidebarLayout(
    
    sidebarPanel(
      
      textInput(inputId = "GeneSymbol",
                label = "Input your Gene Symbol:",
                value = "", width = NULL, placeholder = 'e.g. Igfbp7,Zzz3'
      ),
      actionButton("button", "show")
      
    ),
    
    # Main panel for displaying outputs ----
    mainPanel(
      
      plotOutput(outputId = "barplot")
      
    )
  )
)

server <- function(input, output) 
  gene <- reactive(
    gene<-input$GeneSymbol
  )
  observeEvent(input$button, 
    cat("Showing", input$GeneSymbol)
  )
  p <- reactive(ggplot(data=mean_data,aes_string(x=mean_data$Name,y=mean_data$input$GeneSymbol,fill=randomColor(74)))+
      geom_bar(stat='identity',position=position_dodge(0.5),width=0.9)+
      geom_errorbar(aes(ymin = mean_data$input$GeneSymbol-totalsd$input$GeneSymbol, ymax = mean_data$input$GeneSymbol+totalsd$input$GeneSymbol),width=.2)+
      theme_classic2()+
      rotate_x_text(angle = 45)+
      theme(legend.position = "none")+
      labs(title=input$GeneSymbol,x=NULL,y="FPKM_value")+
      theme(plot.title = element_text(hjust = 0.5))+
      theme(plot.margin = unit(c(20,1,1,1), "mm"))
  )
  output$barplot <- renderPlot(    
    print(p())
    
  )
  


# Create Shiny app ----
shinyApp(ui = ui, server = server)

我知道有很多错误的代码。 我是闪亮的新手。 请帮助这个孩子。 非常感谢!!

【问题讨论】:

谁能帮帮我 【参考方案1】:

代码中有几个错误。但是,在我看来,您的代码可以通过在开始时重塑您的数据来简化并避免错误:

    使用例如将平均值和标准差绑定在一个数据帧中dplyr::bind_rows 使用 tidyr::pivot_longer/wider 重塑您的数据集。

这样做后,我们最终得到一个包含四列的数据框,即Name(示例?)、Genemeansd

仅此一项就简化了绘图代码并避免了所有错误,因为您可以引用固定的列名。

    为了只显示选定的基因,我添加了一个反应性plot_data 来相应地过滤数据。

    除了文本输入之外,我还添加了selectInput 来选择所需的基因

library(shiny)
library(ggplot2)
library(ggpubr)
library(dplyr)
library(tidyr)

mean_data <- data.frame(
  Name = c(paste0("Group_", LETTERS[1:20])),
  matx <- matrix(sample(1:1000, 1000, replace = T), nrow = 20)
)
names(mean_data)[-1] <- c(paste0("Gene_", 1:50))

sd_data <- data.frame(
  Name = c(paste0("Group_", LETTERS[1:20])),
  matx <- matrix(runif(1000, 5, 10), nrow = 20)
)
names(sd_data)[-1] <- c(paste0("Gene_", 1:50))

# Prepare dataset.
#   1. Bind mean and sd data
#   2. Reshape
data <- dplyr::bind_rows(list(
  mean = mean_data,
  sd = sd_data
), .id = "stat")
data_long <- data %>%
  tidyr::pivot_longer(-c(Name, stat), names_to = "Gene", values_to = "value") %>%
  tidyr::pivot_wider(names_from = "stat", values_from = "value")

# Define UI for app that draws a histogram ----
ui <- fluidPage(
  h4("Gene_FPKM Value Barplot"),
  br(),
  sidebarLayout(
    sidebarPanel(
      textInput(
        inputId = "GeneSymbol",
        label = "Input your Gene Symbol:",
        value = "", width = NULL, placeholder = "e.g. Igfbp7,Zzz3"
      ),
      selectInput(
        "slctGeneSymbol", 
        "Select Gene Symbols:", 
        choices = unique(data_long$Gene),
        multiple = TRUE
      )
      #actionButton("button", "show")
    ),

    # Main panel for displaying outputs ----
    mainPanel(
      plotOutput(outputId = "barplot")
    )
  )
)

server <- function(input, output) 
  
  observeEvent(input$button, 
    cat("Showing", input$GeneSymbol)
  )

  plot_data <- reactive(
    subset(data_long, Gene %in% input$slctGeneSymbol)
  )
  
  output$barplot <- renderPlot(
    ggplot(data = plot_data(), aes(x = Name, y = mean, fill = Gene)) +
      geom_bar(stat = "identity", position = position_dodge(0.9), width = 0.9) +
      geom_errorbar(aes(ymin = mean - sd, ymax = mean + sd), width = .2, position = position_dodge(0.9)) +
      theme_classic2() +
      rotate_x_text(angle = 45) +
      theme(legend.position = "none") +
      labs(title = input$GeneSymbol, x = NULL, y = "FPKM_value") +
      theme(plot.title = element_text(hjust = 0.5)) +
      theme(plot.margin = unit(c(20, 1, 1, 1), "mm"))
  )
  


# Create Shiny app ----
shinyApp(ui = ui, server = server)

【讨论】:

非常感谢。我现在可以做到。但更想做的是如何添加 ggplot2 的“填充”参数等于 Name 的长度。我试过了,但是有问题。请。

以上是关于用闪亮的 ggplot2 绘制基因 FPKM 归一化计数值的主要内容,如果未能解决你的问题,请参考以下文章

用 ggplot2 绘制基因表达谱

热图绘制

如何在闪亮中使用 ggplot2 绘制数据框的子集

【点】count、RPM、RPKM、FPKM、TPM

基因家族分析(2) ggplot2绘制motif分析图

RPKM, FPKM 和 TPM