闪亮+ ggplot:如何子集无效数据对象? [英] Shiny + ggplot: How to subset reactive data object?

查看:156
本文介绍了闪亮+ ggplot:如何子集无效数据对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我制作了一个闪亮的应用程序,它在用户选择了他感兴趣的日期范围(= x轴的范围)后向用户显示ggplot。所以我想我需要定义一个反应数据对象(正确?)。

ggplot有一些子集。 R告诉我,被动数据对象不可用于子集。在我对ggplot的新手理解中,子集必须在geom_bar(),geom_line()语句内部完成,以便获得我想要的图。


  1. 任何人都可以向我推荐如何继续使用子集?

  2. 以及如何引用图表的颜色生成因子类别?
    Thanks!

    样本数据



      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 (日期)
    mydata.m = melt(mydata,id =date)
    names(mydata.m)= c(variable,category,value)



    闪亮的服务器:根据用户输入选择观测值(日期范围输入)



    < pre $ lt; code> data.r = reactive({
    a = subset(mydata.m,%in%input $ daterange)
    return(a)
    } )



    闪亮的服务器:制作图



    <$ $(

    $ g $ p
    $ b $ g $ p $ b $ g $ p $ $ $ $ $ $ $ $ $ $ = ggplot(data.r(),aes(x = variable,fill = category))+

    分类栏A,B,Z:数据......但如何?
    + geom_bar(数据=子集(data.r(),%c(A,B)中的类别%),aes(y = value),stat =identity,position =stack )
    + geom_bar(subset =。(category ==Z),aes(y = -value),stat =identity)

    #用于类别R,S :一样。
    + geom_line(subset =。(category ==R),aes(y = value))
    + geom_line(subset =。(category ==S),aes(y = value ))

    #如何引用因子<< category>>在反应函数中<< data.r()>> ;?
    + scale_fill_manual(breaks = levels(category),values = mycolorgenerator(length(levels(category))))

    print(s)

    })




UI.R



 #输入零件

库(闪亮)

shinyUI(pageWithSidebar(
# 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!)
),
#-----------------------------------------------

#输出零件

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


))



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)
名称(mydata.m)= c(变量,类别,值)







#服务器----------------------------------------- ------
shinyServer(function(input,output){


#DATA

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



#GGPLOT

mycolorgenerator = colorRampPalette(c('sienna','浅灰色'))


输出$ myplot = renderPlot({

#ggplot,适当参考反应函数<< data.r()>>
s = ggplot(data.r(),aes(x = variable,fill = category))+

类别A,B,Z的条形码:需要对数据进行子集化...但是如何?
geom_bar(data = data.r(),%c(A,B)中的类别%),aes(y = value),stat =identity,position =stack )+
geom_bar(subset =。(category ==Z),aes(y = -value),stat =identity)+

#用于类别R,S :一样。
geom_line(subset =。(category ==R),aes(y = value))+
geom_line(subset =。(category ==S),aes(y = value) )+

#如何引用因子<< category>>在反应函数中<< data.r()>> ;?
scale_fill_manual(breaks = levels(category),values = mycolorgenerator(length(levels(category))))

print(s)


})
))


解决方案

server.R和ui.R真的有帮助)



我不知道你从哪里得到。()函数或 geom_bar 具有 subset = 参数的想法。但是这里有一个更新后的 renderPlot ,它至少没有产生任何错误

  output $ myplot = renderPlot({

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

类别A,B,Z的#个条形码:需要对数据进行子集化......但是如何?
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)+

#用于类别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)
})

大多数情况下,我将 data = 更改为显式 subset()调用


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). So I guess I need to define a reactive data object (correct?).

The ggplot has some subsetting in it. R tells me that reactive data object is not subsettable. 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.

  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)

    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

# 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

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)

I'm not sure where you got the .() function from or the idea that geom_bar has a subset= parameter. But here's an updated renderPlot that doesn't seem to generate any errors at least

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

这篇关于闪亮+ ggplot:如何子集无效数据对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆