【发布时间】:2017-04-25 23:57:36
【问题描述】:
我正在学习 Shiny,并在我正在创建的应用程序上寻求帮助。我正在创建一个应用程序,该应用程序将从用户那里获取动态输入,并且应该生成条形图和折线图。我设法创建了条形图,但生成的结果不正确。
我正在寻找的是在行中选择的变量应该是我的 x 轴和 y 轴应该是 百分比。比例为 100%。列变量应该是用于比较的变量,为此我使用position = "dodge"。我的数据很大,我创建了一个示例数据来描述这种情况。由于实际数据采用 data.table 格式,因此我将示例数据存储为 data.table。由于我不确定如何包含这些不是文件格式的数据,所以我先创建它,使其位于 R 环境中,然后运行应用程序 -
Location <- sample(1:5,100,replace = T)
Brand <- sample(1:3,100,replace = T)
Year <- rep(c("Year 2014","Year 2015"),50)
Q1 <- sample(1:5,100,replace = T)
Q2 <- sample(1:5,100,replace = T)
mydata <- as.data.table(cbind(Location,Brand,Year,Q1,Q2))
下面是我正在使用的 Shiny 代码 -
library("shiny")
library("ggplot2")
library("scales")
library("data.table")
library("plotly")
ui <- shinyUI(fluidPage(
sidebarPanel(
fluidRow(
column(10,
div(style = "font-size: 13px;", selectInput("rowvar", label = "Select Row Variable", ''))
),
tags$br(),
tags$br(),
column(10,
div(style = "font-size: 13px;", selectInput("columnvar", "Select Column Variable", ''))
))
),
tabPanel("First Page"),
mainPanel(tabsetPanel(id='charts',
tabPanel("charts",tags$b(tags$br("Graphical Output" )),tags$br(),plotlyOutput("plot1"))
)
)
))
server <- shinyServer(function(input, output,session){
updateTabsetPanel(session = session
,inputId = 'myTabs')
observe({
updateSelectInput(session, "rowvar", choices = (as.character(colnames(mydata))),selected = "mpg")
})
observe({
updateSelectInput(session, "columnvar", choices = (as.character(colnames(mydata))),selected = "cyl")
})
output$plot1 <- renderPlotly({
validate(need(input$rowvar,''),
need(input$columnvar,''))
ggplot(mydata, aes(x= get(input$rowvar))) +
geom_bar(aes(y = ..prop.., fill = get(input$columnvar)), position = "dodge", stat="count") +
geom_text(aes( label = scales::percent(..prop..),
y= ..prop.. ), stat= "count", vjust = -.5) +
labs(y = "Percent", fill=input$rowvar) +
scale_y_continuous(labels=percent,limits = c(0,1))
})
})
shinyApp(ui = ui, server = server)
如果你看到问题是-
所有条形均为 100%。比例计算不正确。不知道哪里出错了。
如果我尝试使用 group 参数,它会给我错误提示“未找到输入”变量。我尝试将群组设为
group = get(input$columnvar)我认为我需要为折线图重构我的数据。您能否帮助我如何动态重组 data.table 然后重新用于折线图。如何生成与折线图相同的条形图。
我正在使用 renderplotly,以便我使用 plotly 的功能来显示鼠标移动/缩放等的百分比。但是我可以在鼠标移动时看到 input$variable。我怎样才能摆脱它并拥有正确的名字。
已尝试详细说明情况。请提出一些解决方案。
谢谢!!
【问题讨论】:
-
我没有完整的答案,但对于 1。也许在您的 geom_bar 中使用 y = (..count..)/sum(..count..) 而不是 y = ..prop .. 和 4. 在 ggplot(mydata, aes(x= get(input$rowvar))) 中使用 ggplot(mydata, aes_string(x= input$rowvar));并在 geom_text() 中替换为 geom_text(aes( label = (..count..)/sum(..count..)*100, ..
-
@MLavoie,感谢您的建议,但是当我将
..prop..替换为(..count..)/sum(..count..)时,我开始收到错误,因为找不到对象“计数”。不确定您是否也会遇到同样的错误 -
不,我没有收到此错误。这就是我使用 geom_bar(aes(y = (..count..)/sum(..count..), fill = get(input$columnvar)), position = "dodge", stat="count")
-
@MLavoie,它奏效了,我一直在尝试多种方法来解决这个问题,似乎已将代码更新为
stat = "identity",这导致了该错误。我把它改回stat = "count",现在我没有收到错误,但是生成的图没有显示正确的百分比。我的意思是 2014 年所有条的添加应该是 100%,而 2015 年应该是 100%。目前不确定如何计算条形高度。我正在使用prop.table(table(mydata$Brand,mydata$Year),2)生成的表格检查条形高度。你知道如何纠正这个问题吗? -
100% 是所有柱的总和
标签: r ggplot2 shiny data.table plotly