闪亮的 ggplot 缺失因子水平
Shiny ggplot missing factor level
我正在尝试使用 ShinyDashboard
中的 ggplot package
在 R
中绘制一些图表。现在我遇到了一个问题。
在这个例子中,我有 6 个不同的品牌和 2 个不同的类别。我喜欢做的是,所有品牌都被绘制成 Brand7
。这意味着,所有品牌都应该有 2 列:Bike66
和 Buss66
。
更重要的是,我总是有 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()
结果
我正在尝试使用 ShinyDashboard
中的 ggplot package
在 R
中绘制一些图表。现在我遇到了一个问题。
在这个例子中,我有 6 个不同的品牌和 2 个不同的类别。我喜欢做的是,所有品牌都被绘制成 Brand7
。这意味着,所有品牌都应该有 2 列:Bike66
和 Buss66
。
更重要的是,我总是有 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()