闪亮的 ggplot 缺失因子水平

Shiny ggplot missing factor level

我正在尝试使用 ShinyDashboard 中的 ggplot packageR 中绘制一些图表。现在我遇到了一个问题。

在这个例子中,我有 6 个不同的品牌和 2 个不同的类别。我喜欢做的是,所有品牌都被绘制成 Brand7。这意味着,所有品牌都应该有 2 列:Bike66Buss66。 更重要的是,我总是有 2 个类别,但它的名称可以更改(您可以在可重现的示例中使用滑块)。

可以使用 ggplot 设置来解决问题,或者应该将一些零值的行添加到 data.frame?

总而言之,我找不到合适的解决方案。

下面的可重现示例。

谢谢!

rm(list = ls())
library(shiny)
library(shinydashboard)
library(ggplot2)



# Header -----------------------------------------------------------

header <- dashboardHeader(title="Dashboard")

# Sidebar --------------------------------------------------------------

sm <- sidebarMenu(
  menuItem(
    text="Graph1",
    tabName="Graph1",
    icon=icon("home")
  )
)

sidebar <- dashboardSidebar(sm)

# Body --------------------------------------------------

body <- dashboardBody(

  # Layout  --------------------------------------------  

  tabItems(
    tabItem(
      tabName="Graph1",

      fluidPage(
        fluidRow(


          box(
            title = "Season", width = 10, status = "info", solidHeader = TRUE,

            sliderInput("Slider", "Size:",
                        min = 1, max = 99, value = c(66)),

            plotOutput("Graph1"),
            plotOutput("Graph2")

          )  
        )
      )
    )
  )
)

# Setup Shiny app UI components -------------------------------------------

ui <- dashboardPage(header, sidebar, body, skin="black")

# Setup Shiny app back-end components -------------------------------------

server <- function(input, output) {

  # Generate data --------------------------------------

  df <- reactive ({  

  set.seed(1992)
  n=8

  Category <- sample(c("Bike", "Bus"), n, replace = TRUE, prob = NULL)
  Category <- paste0(Category, input$Slider)
  Category <- as.factor(Category)
  Brand <- sample("Brand", n, replace = TRUE, prob = NULL)
  Brand <- paste0(Brand, sample(1:14, n, replace = TRUE, prob = NULL))
  USD <- abs(rnorm(n))*1000

  df <- data.frame(Brand, Category, USD)

  }) 

  # Inputs --------------------------------------




  # Plot --------------------------------

  output$Graph1 <- renderPlot({

    ggplot(df(), aes(x=Brand, y=USD, fill=Category))+
      geom_bar(stat='identity', position="dodge")

如果您想以当前形式执行此操作,则必须添加 zero counts

不过你也可以用分面来解决(注意,我认为这与Shiny本身没有任何关系):

示例数据

set.seed(1992)
n=8

Category <- sample(c("Bike", "Bus"), n, replace = TRUE, prob = NULL)
Category <- paste0(Category, input$Slider)
Category <- as.factor(Category)
Brand <- sample("Brand", n, replace = TRUE, prob = NULL)
Brand <- paste0(Brand, sample(1:14, n, replace = TRUE, prob = NULL))
USD <- abs(rnorm(n))*1000

df <- data.frame(Brand, Category, USD)

创建地块

ggplot(df, aes(x=Category, y=USD, fill=Category)) +
  geom_bar(stat='identity', position="dodge") + facet_grid(~Brand) +
  theme_classic()

结果