[英]R Shiny ggplot bar and line charts with dynamic variable selection and y axis to be percentages
我正在学习Shiny,并且需要有关正在创建的应用程序的帮助。 我正在创建一个应用程序,它将接受用户的动态输入并应生成条形图和折线图。 我设法创建了条形图,但生成的结果不正确。
我要寻找的是在行中选择的变量应该是我的x轴,而y轴应该是percent 。 规模为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 = get(input$columnvar)
我相信我需要重组折线图的数据。 您能否提供有关我如何动态重构data.table然后再用于折线图的帮助? 如何生成与折线图相同的条形图。
我正在使用renderplotly,以便使用plotly的功能来随鼠标移动/缩放等显示百分比。但是我可以看到input $ variable在鼠标移动时。 我该如何摆脱它并使用专有名称。
试图详细说明情况。 请提出一些解决方案。
谢谢!!
为了正确地分组变量以进行绘图, geom_bar
要求x
值是数字, fill
值是factor,或者参数group
用于显式指定分组变量。 但是,使用group
时, plotly
会引发错误。 下面的方法将x
变量转换为integer
,并将变量fill
为factor
以便将它们正确分组。 这保留了使用geom_bar
来计算百分比。
但是,首先,我想知道mydata
是否正确指定。 假设数据是字符和整数的混合, cbind(Location, Brand, Year, Q1, Q2)
给出一个字符矩阵,然后将其转换为data.table
,其中所有变量均为字符模式。 在下面的代码中,我直接将mydata定义为data.table
但已将Q1
转换为字符模式,以便mydata
包含字符和数字的混合。
下面使用的方法是创建一个新的数据框plotdata
,其中包含x
和fill
数据。 通过将x
数据首先转换为因子变量,然后使用unclass
获得因子整数代码,将x
数据转换为数值。 fill
数据转换为因子。 plotdata
则使用生成ggplot
情节,然后使用显示plotly
。 该代码包括一些其他修改,以改善图表的外观。
编辑
下面的代码已更新,以显示其栏下方的行变量的名称。 此外,仅当鼠标指针悬停在条形上方时,才会显示每个条形的百分比和计数。
library("shiny")
library("ggplot2")
library("scales")
library(plotly)
library(data.table)
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)
Q3 <- sample(seq(1,3,.5), 100, replace=T)
mydata <- data.table(Location,Brand,Year,Q1,Q2, Q3)
#
# convert Q1 to character for demonstation purposes
#
mydata$Q1 <- as.character(mydata$Q1)
ui <- shinyUI(fluidPage(
sidebarPanel(
fluidRow(
column(10,
div(style = "font-size: 13px;", selectInput("rowvar", label = "Select Row Variable",
choices=colnames(mydata)))),
tags$br(),
tags$br(),
column(10,
div(style = "font-size: 13px;", selectInput("columnvar", label="Select Column Variable",
choices=colnames(mydata))))
)
),
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 = colnames(mydata), selected=colnames(mydata)[1])
})
observe({
updateSelectInput(session, "columnvar", choices = colnames(mydata), selected=colnames(mydata)[2])
})
output$plot1 <- renderPlotly({
#
# create data frame for plotting containing x variables as integer and fill variables as factors
#
if(is.numeric(get(input$rowvar))) {
rowvar_brks <- sort(unique(get(input$rowvar)))
rowvar_lbls <- as.character(rowvar_brks)
plotdata <- data.frame(get(input$rowvar), factor(get(input$columnvar)) )
}
else {
rowvar_factors <- factor(get(input$rowvar))
rowvar_brks <- 1:nlevels(rowvar_factors)
rowvar_lbls <- levels(rowvar_factors)
plotdata <- data.frame(unclass(rowvar_factors), factor(get(input$columnvar)) )
}
colnames(plotdata) <- c(input$rowvar, input$columnvar)
validate(need(input$rowvar,''),
need(input$columnvar,''))
col_width <- .85*mean(diff(rowvar_brks))
sp <- ggplot(plotdata, aes_(x = as.name(input$rowvar), fill = as.name(input$columnvar))) +
geom_bar( aes(y= ..prop..), stat="count", position=position_dodge(width=col_width)) +
geom_text(aes( label = paste(scales::percent(..prop..),"<br>", "count:",..count..,"<br>"), y= ..prop.. + .01),
stat= "count", position=position_dodge(width=col_width), size=3, alpha=0) +
labs(x= input$rowvar, y = "Percent", fill=input$columnvar) +
scale_y_continuous(labels=percent) +
scale_x_continuous(breaks=rowvar_brks, labels=rowvar_lbls)
ggplotly(sp, tooltip="none")
})
})
shinyApp(ui = ui, server = server)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.