用闪亮的 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
(示例?)、Gene
、mean
和sd
。
仅此一项就简化了绘图代码并避免了所有错误,因为您可以引用固定的列名。
为了只显示选定的基因,我添加了一个反应性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 归一化计数值的主要内容,如果未能解决你的问题,请参考以下文章