繁体   English   中英

R带有动态变量选择且y轴为百分比的闪亮ggplot条形图和折线图

[英]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)

如果您看到问题是-

  1. 所有条均为100%。 比例未正确计算。 不知道我要去哪里错了。

  2. 如果我尝试使用组参数,则会出现错误,提示找不到“输入”变量。 我试图给组作为group = get(input$columnvar)

  3. 我相信我需要重组折线图的数据。 您能否提供有关我如何动态重构data.table然后再用于折线图的帮助? 如何生成与折线图相同的条形图。

  4. 我正在使用renderplotly,以便使用plotly的功能来随鼠标移动/缩放等显示百分比。但是我可以看到input $ variable在鼠标移动时。 我该如何摆脱它并使用专有名称。

试图详细说明情况。 请提出一些解决方案。

谢谢!!

为了正确地分组变量以进行绘图, geom_bar要求x值是数字, fill值是factor,或者参数group用于显式指定分组变量。 但是,使用group时, plotly会引发错误。 下面的方法将x变量转换为integer ,并将变量fillfactor以便将它们正确分组。 这保留了使用geom_bar来计算百分比。

但是,首先,我想知道mydata是否正确指定。 假设数据是字符和整数的混合, cbind(Location, Brand, Year, Q1, Q2)给出一个字符矩阵,然后将其转换为data.table ,其中所有变量均为字符模式。 在下面的代码中,我直接将mydata定义为data.table但已将Q1转换为字符模式,以便mydata包含字符和数字的混合。

下面使用的方法是创建一个新的数据框plotdata ,其中包含xfill数据。 通过将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM