R Shiny中的雷达图

jdzmm42g  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(211)

我真的是R Shiny的新手(今天才开始玩它!),但是这段代码对我不起作用... R一直说"数据必须以 Dataframe 的形式给出。"据我所知,这是一个 Dataframe (当我检查is.data.frame时,它说它是)。

# Load packages ----
library(shiny)
library(fmsb)

# Load data ----
industry <- read.csv("data/industry.csv")

# User interface ----
ui <- fluidPage(
  titlePanel("L&D Capabilities 2023"),
  
  sidebarLayout(
    sidebarPanel(
      helpText("Check which L&D capabilities your industry
      has in-house in 2023."),
      
      selectInput("var", 
                  label = "Choose a variable to display",
                  choices = c("Central government", 
                              "Local government",
                              "IT and Telecoms", 
                              "Professional services, law and accountancy", 
                              "Finance, banking and insurance", 
                              "Health", 
                              "Social care/housing association", 
                              "Other charity/voluntary sector", 
                              "Retail", 
                              "Engineering", 
                              "Manufacturing", 
                              "Pharmaceutical", 
                              "Transport", 
                              "Utilities", 
                              "Hospitality", 
                              "Education (HE, FE)", 
                              "Art, media and design", 
                              "Other", 
                              "Consulting"),
                  selected = "Central government"),
    ),
    
    mainPanel(plotOutput("radarPlot"))
  )
)

# Server logic ----
server <- function(input, output) {
  output$radarPlot <- renderPlot({
    data <- switch(input$var, 
                   "Central government" = industry$Centralgov,
                   "Local government" = industry$Localgov,
                   "IT and Telecoms" = industry$IT,
                   "Professional services, law and accountancy" = industry$PS,
                   "Finance, banking and insurance" = industry$Finance,
                   "Health" = industry$Health,
                   "Social care/housing association" = industry$Social,
                   "Other charity/voluntary sector" = industry$Charity,
                   "Retail" = industry$Retail,
                   "Engineering" = industry$Engineering,
                   "Manufacturing" = industry$Manufacturing,
                   "Pharmaceutical" = industry$Pharmaceutical,
                   "Transport" = industry$Transport,
                   "Utilities" = industry$Utilities,
                   "Hospitality" = industry$Hospitality,
                   "Education (HE, FE)" = industry$Education,
                   "Consulting" = industry$Consulting,
                   "Art, media and design" = industry$Art,
                   "Other" = counties$Other)
    
    radarchart(data)
  })
}

# Run app ----
shinyApp(ui, server)

你知道怎么回事吗?或者我错过了什么?
非常感谢!
编辑:这是我的数据

> dput(industry)
structure(list(Max = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), Min = c(0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Centralgov = c(0.6, 
0.18, 0.27, 0.27, 0.27, 0.27, 0.36, 0.3, 0.55, 0.45, 0.1, 0, 
0.1, 0.27, 0.64, 0.09, 0.09, 0.18, 0.27, 0, 0.09, 0.18, 0.25, 
0.29, 0.14), Localgov = c(0.36, 0.5, 0.36, 0.5, 0.42, 0.42, 0.09, 
0.27, 0.36, 0.55, 0.3, 0.36, 0.55, 0.45, 0.73, 0.36, 0.18, 0.45, 
0.64, 0.36, 0.27, 0.18, 0.3, 0.2, 0.6), IT = c(0.73, 0.33, 0.47, 
0.51, 0.38, 0.18, 0.34, 0.38, 0.62, 0.41, 0.19, 0.38, 0.49, 0.41, 
0.62, 0.32, 0.22, 0.38, 0.58, 0.51, 0.33, 0.34, 0.41, 0.15, 0.37
), PS = c(0.73, 0.4, 0.56, 0.6, 0.48, 0.48, 0.29, 0.24, 0.63, 
0.56, 0.29, 0.41, 0.27, 0.36, 0.71, 0.28, 0.16, 0.48, 0.4, 0.52, 
0.36, 0.38, 0.29, 0.25, 0.13), Finance = c(0.9, 0.44, 0.66, 0.66, 
0.61, 0.52, 0.44, 0.5, 0.86, 0.62, 0.32, 0.39, 0.48, 0.59, 0.86, 
0.3, 0.27, 0.5, 0.52, 0.52, 0.57, 0.51, 0.56, 0.33, 0.29), Health = c(0.88, 
0.33, 0.47, 0.65, 0.28, 0.37, 0.33, 0.29, 0.78, 0.47, 0.18, 0.13, 
0.47, 0.5, 0.78, 0.26, 0.16, 0.41, 0.58, 0.5, 0.38, 0.39, 0.33, 
0.13, 0.29), Social = c(0.7, 0.25, 0.5, 0.33, 0.3, 0.2, 0.1, 
0.4, 0.5, 0.2, 0, 0.22, 0, 0.2, 0.4, 0.1, 0.3, 0.1, 0.3, 0.3, 
0.33, 0.3, 0.33, 0, 0.11), Charity = c(0.8, 0.55, 0.62, 0.44, 
0.5, 0.31, 0.08, 0.33, 0.58, 0.5, 0.4, 0.36, 0.33, 0.38, 0.82, 
0.15, 0.08, 0.36, 0.22, 0.42, 0.2, 0.42, 0.18, 0.22, 0.11), Retail = c(0.62, 
0.38, 0.46, 0.27, 0.25, 0.09, 0.08, 0.31, 0.82, 0.46, 0.25, 0.27, 
0.25, 0.54, 0.69, 0.08, 0.17, 0.31, 0.67, 0.5, 0.33, 0.5, 0.38, 
0.18, 0.08), Engineering = c(0.6, 0, 0.4, 0.25, 0.17, 0.17, 0, 
0, 0.33, 0.5, 0.25, 0.33, 0.6, 0.17, 0.33, 0, 0, 0.33, 0.33, 
0.17, 0.17, 0.5, 0.2, 0, 0), Manufacturing = c(0.56, 0.22, 0.35, 
0.42, 0.42, 0.4, 0.24, 0.2, 0.56, 0.41, 0.24, 0.11, 0.21, 0.3, 
0.63, 0.1, 0, 0.25, 0.42, 0.58, 0.21, 0.35, 0.25, 0.33, 0.06), 
    Pharmaceutical = c(0.43, 0.25, 0, 0.71, 0.63, 0.25, 0.13, 
    0.13, 0.63, 0.43, 0, 0, 0, 0, 0.38, 0.25, 0.13, 0.38, 0.38, 
    0.5, 0, 0, 0.33, 0, 0.17), Transport = c(0.77, 0.62, 0.79, 
    0.57, 0.71, 0.64, 0.14, 0.5, 0.79, 0.46, 0.38, 0.21, 0.36, 
    0.38, 0.64, 0.43, 0.29, 0.21, 0.57, 0.64, 0.29, 0.54, 0.57, 
    0.36, 0.15), Utilities = c(1, 0.6, 0.4, 0.33, 0.2, 0.2, 0.6, 
    0.6, 0.8, 0.6, 0.25, 0.2, 0.8, 0.4, 1, 0.4, 0.4, 0.6, 0.4, 
    0.6, 0.2, 0.2, 0.2, 0.2, 0), Hospitality = c(0.67, 0, 0.67, 
    0.4, 0.67, 0.33, 0.33, 0.83, 0.83, 0.2, 0.67, 0.17, 0.2, 
    0.33, 0.83, 0.33, 0.33, 0, 0.67, 1, 0.5, 0.33, 0.33, 0.6, 
    0.33), Education = c(0.87, 0.33, 0.47, 0.53, 0.41, 0.38, 
    0.5, 0.47, 0.65, 0.41, 0.2, 0.31, 0.47, 0.65, 0.53, 0.24, 
    0.29, 0.38, 0.56, 0.41, 0.31, 0.19, 0.38, 0.27, 0.35), Consulting = c(0.67, 
    0.5, 0.67, 1, 0.33, 0.33, 0.17, 0.5, 1, 0.6, 0.33, 0.6, 0.4, 
    0.67, 0.5, 0.17, 0.17, 0.4, 0.6, 0.5, 0.5, 0.33, 0.4, 0.25, 
    0.25), Art = c(1, 0.2, 0.6, 0.5, 0.4, 0.2, 0.2, 0.6, 0.6, 
    0.4, 0.2, 0.2, 0.6, 0.5, 0.5, 0.2, 0.2, 0.2, 0.2, 0.6, 0.4, 
    0.4, 0.4, 0.2, 0.25), Other = c(0.67, 0.57, 0.71, 0.29, 0.57, 
    0.43, 0.14, 0.5, 0.67, 0.29, 0.57, 0.29, 0.43, 0.57, 0.71, 
    0.29, 0.43, 0.29, 0.43, 0.57, 0.71, 0.43, 0.5, 0.6, 0.4)), class = "data.frame", row.names = c("In-person classroom delivery", 
"Strategy and governance", "Stakeholder engagement", "Instructional design", 
"Crafting learning journeys / blended solutions", "Supporting ongoing workplace performance", 
"Facilitating social and collaborative learning", "Understanding learner behaviour", 
"Virtual classroom / webinar delivery", "Digital content development", 
"Performance consulting", "Business acumen", "Marketing and communications", 
"Coaching and mentoring", "Learning management / administration", 
"Analytics / data management", "Evaluating impact", "Technology/infrastructure", 
"Project management", "Leveraging L&D expertise", "Knowledge management", 
"Negotiation, persuasion, and influence", "Learning experience design", 
"Community engagement", "Research capabilities"))
bxjv4tth

bxjv4tth1#

正如我在评论中提到的,radarchart至少需要三个变量。
在这个解决方案中,我将绘图设置为只有在至少有三个选项被选中时才呈现。我将下拉列表的创建更改为允许多个选项(这样就可以选择三个选项)。

ui <- fluidPage(
  titlePanel("Title"),
  sidebarLayout(sidebarPanel(
    helpText("help goes here"),
    selectInput(
      "var", label = "Choose at least three options to plot", 
      multiple = T, 
      choices = setNames(
          names(industry)[3:21], 
          c("Central government", "Local government", "IT and Telecoms",
            "Professional services, law and accountancy", 
            "Finance, banking and insurance", "Health", 
            "Social care/housing association", "Other charity/voluntary sector", 
            "Retail", "Engineering","Manufacturing", "Pharmaceutical", "Transport", 
            "Utilities", "Hospitality", "Education (HE, FE)", "Consulting", 
            "Art, media and design", "Other")), selected = "Central government")
      ), mainPanel(plotOutput("radarPlot")))
  )

server <- function(input, output, session) {
  output$radarPlot <- renderPlot({
    if(length(input$var) >= 3) {
      radarchart(industry[, input$var])
    }
  })
}

# Run app ----
shinyApp(ui, server)

然而,这在技术上并不准确,因为第一行应该是最大值,第二行应该是最小值(这是数据框在转置时的方向)。
这是服务器的另一个版本,在这个版本中,我修改了数据,使第一行和第二行是最大值和最小值。

# add max and min to the top of every column
industry2 <- t(industry) %>% 
  as.data.frame() %>% 
  mutate(max = 1, min = 0) %>% 
  select(max, min, everything()) %>% 
  t() %>% as.data.frame()

server2 <- function(input, output, session) {
  output$radarPlot <- renderPlot({
    if(length(input$var) >= 3) {
      radarchart(industry[, input$var])
    }
  })
}

# Run app ----
shinyApp(ui, server2)

这呈现了与我在第一个版本中所描绘的相同的图(所以我不确定为什么radarchart函数调用此信息。)
我不知道你对fmsb::radarchart有多依恋,但是有很多其他的选择:ggplot2plotlyhighcharterecharts等等。
这里有一个使用Plotly库的替代方法。在这个选项中,我将selectInput中的multiple设置为false(基于您最初试图绘制的内容)。我设置了范围,以便图形具有可比性。代码的注解中注解了一些其他更改。

library(plotly)
library(shiny)

ui2 <- fluidPage(
  titlePanel("With Plotly"),
  sidebarLayout(sidebarPanel(
    helpText("help goes here"),
    selectInput(
      "var", label = "Choose a field to plot", 
      multiple = F,      # <<- FALSE now (can remove argument, default is false)
      choices = setNames(
        names(industry)[3:21], 
        c("Central government", "Local government", "IT and Telecoms",
          "Professional services, law and accountancy", 
          "Finance, banking and insurance", "Health", 
          "Social care/housing association", "Other charity/voluntary sector", 
          "Retail", "Engineering","Manufacturing", "Pharmaceutical", "Transport", 
          "Utilities", "Hospitality", "Education (HE, FE)", "Consulting", 
          "Art, media and design", "Other")), selected = "Central government")
  ), mainPanel(plotlyOutput("radarPlot"))) # <<-- plotlyOutput instead of plotOutput
)

server3 <- function(input, output, session) {
  output$radarPlot <- renderPlotly({ # <- render plotly instead of plot
      plot_ly(r = industry[, input$var], theta = rownames(industry),
              fill = "toself", type = "scatterpolar", mode = "markers") %>% 
      layout(
        polar = list(
        angularaxis = list(showticklabels = F),
        radialaxis = list(range = c(0, 1))
      ))
  })
}
# Run app ----
shinyApp(ui2, server3)

我隐藏了标签,因为它们重叠了。但是,当你悬停时,你可以看到行名称。

相关问题