[英]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()语句中完成子集化,以获得我想要的图形。
And how to reference the factor category in generating colors for the graph? 如何在为图形生成颜色时引用因子类别? 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(dates) mydata.m = melt(mydata,id="date") names(mydata.m) = c("variable", "category","value")
data.r = reactive({ a = subset(mydata.m, variable %in% input$daterange) return(a) })
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) })
# 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"))
)
)
))
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.