简体   繁体   English

Shiny + ggplot:如何对反应数据对象进行子集化?

[英]Shiny + ggplot: How to subset reactive data object?

I am making a shiny app, that shows the user a ggplot after he selects the daterange he is interested in (= the range for the x-axis). 我正在创建一个闪亮的应用程序,在他选择了他感兴趣的日期范围(= x轴的范围)后向用户显示ggplot。 So I guess I need to define a reactive data object (correct?). 所以我想我需要定义一个被动数据对象(正确吗?)。

The ggplot has some subsetting in it. ggplot中有一些子集。 R tells me that reactive data object is not subsettable . R告诉我反应数据对象不是子集 In my rookie understanding of ggplot, the subsetting has to be done inside the geom_bar(), geom_line() statements in order to obtain the graph that I want. 在我对ggplot的新手理解中,必须在geom_bar(),geom_line()语句中完成子集化,以获得我想要的图形。

  1. Can anyone suggest me how to proceed with the subsetting? 任何人都可以建议我如何进行子集化?
  2. And how to reference the factor category in generating colors for the graph? 如何在为图形生成颜色时引用因子类别? Thanks! 谢谢!

    sample data 样本数据

     A = c(3, 4, 3, 5) B = c(2, 2, 1, 4) Z = c(1, 2, 1, 2) R = c(-2, -1, -3, 0) S = c(7,7,7,9) mydata = data.frame(cbind(A,B,Z,R,S)) dates = c("2014-01-01","2014-02-01","2014-03-01","2014-04-01") mydata$date = as.Date(dates) mydata.m = melt(mydata,id="date") names(mydata.m) = c("variable", "category","value") 

    shiny server: select observations as per user input (dateRangeInput) 闪亮的服务器:根据用户输入选择观察(dateRangeInput)

     data.r = reactive({ a = subset(mydata.m, variable %in% input$daterange) return(a) }) 

    shiny server: make the plot 闪亮的服务器:制作情节

     output$myplot = renderPlot({ # ggplot with proper reference to reactive function <<data.r()>> s = ggplot(data.r(), aes(x=variable, fill=category)) + # bars for categories A, B, Z: needs subsetting the data... but how? + geom_bar(data=subset(data.r(), category %in% c("A","B")), aes(y=value), stat="identity", position="stack") + geom_bar(subset=.(category=="Z"), aes(y=-value), stat="identity") # lines for categories R, S: same. + geom_line(subset=.(category=="R"), aes(y=value)) + geom_line(subset=.(category=="S"), aes(y=value)) # how to reference the factor <<category>> in reactive function <<data.r()>>? + scale_fill_manual(breaks = levels(category), values = mycolorgenerator(length(levels(category)))) print(s) }) 

UI.R UI.R

# INPUT PART

library(shiny)

shinyUI(pageWithSidebar(
  # Application title
  headerPanel("My App"),

  sidebarPanel( 

    dateRangeInput("daterange", "Date range:",
               start  = "2014-01-01",
               end    = "2014-04-01",
               min    = "2014-01-01",
               max    = "2014-04-01",
               format = "dd/mm/yyyy",
               separator = "-"),

    submitButton(text="Update!")
  ),
# -----------------------------------------------

# OUTPUT PART

  mainPanel(
    tabsetPanel(
      tabPanel("Tab 1", h4("Head 1"),plotOutput("myplot"))
    )
  )
))

SERVER.R SERVER.R

library(reshape)
library(shiny)
library(ggplot2)



# GEN DATA -----------------------------------------------

A = c(3, 4, 3, 5)
B = c(2, 2, 1, 4)
Z = c(1, 2, 1, 2)
R = c(-2, -1, -3, 0)
S = c(7,7,7,9)
mydata = data.frame(cbind(A,B,Z,R,S))
dates = c("2014-01-01","2014-02-01","2014-03-01","2014-04-01")
mydata$date = as.Date(dates)
mydata.m = melt(mydata,id="date")
names(mydata.m) = c("variable", "category","value")







# SERVER -----------------------------------------------
shinyServer(function (input, output) {


# DATA

data.r = reactive({
  a = subset(mydata.m, variable %in% input$daterange)
  return(a)
})



# GGPLOT

mycolorgenerator = colorRampPalette(c('sienna','light grey')) 


output$myplot = renderPlot({

  # ggplot with proper reference to reactive function <<data.r()>>
  s = ggplot(data.r(), aes(x=variable, fill=category))  +  

    # bars for categories A, B, Z: needs subsetting the data... but how?
     geom_bar(data=subset(data.r(), category %in% c("A","B")), aes(y=value), stat="identity", position="stack") +
     geom_bar(subset=.(category=="Z"), aes(y=-value), stat="identity") +

    # lines for categories R, S: same.
     geom_line(subset=.(category=="R"), aes(y=value)) +
     geom_line(subset=.(category=="S"), aes(y=value)) +

    # how to reference the factor <<category>> in reactive function <<data.r()>>?
     scale_fill_manual(breaks = levels(category), values = mycolorgenerator(length(levels(category))))

  print(s)


})
})

(The complete server.R and ui.R really helped) (完整的server.R和ui.R真的有帮助)

I'm not sure where you got the .() function from or the idea that geom_bar has a subset= parameter. 我不确定你从哪里得到.()函数或geom_bar有一个subset=参数的想法。 But here's an updated renderPlot that doesn't seem to generate any errors at least 但这是一个更新的renderPlot ,它似乎至少不会产生任何错误

output$myplot = renderPlot({

  dd<-data.r()
  # ggplot with proper reference to reactive function <<data.r()>>
  s = ggplot(dd, aes(x=variable, fill=category))  +  

    # bars for categories A, B, Z: needs subsetting the data... but how?
     geom_bar(data=subset(dd, category %in% c("A","B")), aes(y=value), 
         stat="identity", position="stack") +
     geom_bar(data=subset(dd, category=="Z"), aes(y=-value), stat="identity") +

    # lines for categories R, S: same.
     geom_line(data=subset(dd, category=="R"), aes(y=value)) +
     geom_line(data=subset(dd, category=="S"), aes(y=value)) +

     scale_fill_manual(breaks = levels(dd$category), 
         values = mycolorgenerator(length(levels(dd$category))))

  print(s)
})

Mostly I changed the data= to explicit subset() calls 大多数情况下,我将data=更改为显subset()调用

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM