我正在制作一个闪亮的应用程序,在用户选择他感兴趣的日期范围(= x 轴的范围)后,它会向用户显示一个 ggplot。所以我想我需要定义一个反应数据对象(对吗?)。
ggplot 中有一些子集。R 告诉我反应数据对象不是 subsettable。在我对 ggplot 的菜鸟理解中,必须在 geom_bar()、geom_line() 语句中进行子集化才能获得我想要的图形。
- 谁能建议我如何进行子集化?
以及如何在为图形生成颜色时引用因子类别?谢谢!
样本数据
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")
闪亮的服务器:根据用户输入选择观察结果(dateRangeInput)
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"))
)
)
))
服务器.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)
})
})