首页 > 解决方案 > 如何在闪亮的应用程序中呈现 ggplot 标题中的多个值?

问题描述

我在这个 Shinyapp 中的 ggplot 标题有一些问题。我正在比较国家,我希望绘图显示的国家(颜色 = input$stat)也可以在 ggplot 标题中看到。使用当前代码,我只得到第一个。这个问题可能有一个优雅的解决方案吗?

如果我比较法国、英国和西班牙,我希望标题为:“Coronalandskampen, France, The United Kingdom, Spain”

library(tidyverse)
library(readxl)
library(httr)
library(zoo)
library(caTools)
library(shiny)
library(data.table)


#Get data
url <- paste("https://www.ecdc.europa.eu/sites/default/files/documents/COVID-19-geographic-disbtribution-worldwide-",format(Sys.time(), "%Y-%m-%d"), ".xlsx", sep = "")
GET(url, authenticate(":", ":", type="ntlm"), write_disk(tf <- tempfile(fileext = ".xlsx")))
df <- read_excel(tf)

df  <- df %>%
        rename(land = countriesAndTerritories,
                `Antal fall` = cases,
               `Antal döda` = deaths) %>% 
        arrange(land, dateRep) %>%
        group_by(land) %>%
        mutate(`Antal döda, kumulativt` = cumsum(`Antal döda`),
                `Antal fall, kumulativt` = cumsum(`Antal fall`)) %>%
        ungroup() %>%
        filter(`Antal döda, kumulativt` > 10) %>%
        group_by(land) %>%
        mutate(antal_dagar = row_number(),
               start_datum = min(dateRep),
               `Antal Fall, rullande medeltal över sju dagar` = rollmean(`Antal fall`, 7, fill = NA),
               `Antal döda, rullande medeltal över sju dagar` = rollmean(`Antal döda`, 7, fill = NA)) %>% 
        ungroup() %>% 
        mutate(`Döda per 100 000 invånare`  = `Antal döda, kumulativt` * 100000 / popData2019) %>% 
        select(land, antal_dagar, `Antal fall`, `Antal fall, kumulativt`, `Antal döda`, `Antal döda, kumulativt`, `Döda per 100 000 invånare`, 
               `Antal Fall, rullande medeltal över sju dagar`, `Antal döda, rullande medeltal över sju dagar`, start_datum, geoId)


ui <- fluidPage(
        navbarPage("Statistik Covid-19",
        sidebarLayout(
                sidebarPanel(
                        selectInput("stat", "Välj länder:", choices = unique(df$land), selected = "Sweden", multiple = TRUE),
                        varSelectInput("var", "Variabel:", df[c(3,4,5,6,7, 8, 9)])),
                mainPanel(plotOutput("covid"))
        )))

server <- function(input, output, session) {
        
        df_graf <- reactive({df %>%
                        req(input$stat) %>% 
                        filter(land %in% input$stat)
        })
        
        output$covid <- renderPlot({
                ggplot(df_graf(), aes(antal_dagar, df_graf()[[input$var]], colour = land)) +
                        geom_line(size = 1.25) +
                        theme_Skane() +
                        labs(title = paste0("Coronalandskampen, ", input$stat),
                             x = "Antal dagar sedan 10:e dödsfallet",
                             y = as.name(input$var),
                             colour = NULL,
                             caption = "Source: European Centre for Disease Prevention and Control")
        })
        }

shinyApp(ui, server)

标签: rggplot2shiny

解决方案


所以基本上,你的问题归结为确保:

title = paste0("Coronalandskampen, ", input$stat)

返回字符串"Coronalandskampen, France, The United Kingdom, Spain".

运行时:

> paste0("Coronalandskampen, ", c("A", "B", "C", "D"))
[1] "Coronalandskampen, A" "Coronalandskampen, B"
[3] "Coronalandskampen, C" "Coronalandskampen, D"

我们看到结果是一个包含多个元素的字符向量。该labs函数仅使用此向量的第一个元素。因此,您需要构建一个字符串。

让我们试试这个:

> paste0("Coronalandskampen, ", paste0(c("A", "B", "C", "D"), collapse = ", "))
[1] "Coronalandskampen, A, B, C, D"

因此,在您的代码中,您可以编写:

title = paste0("Coronalandskampen, ", paste0(input$stat, collapse = ", "))

推荐阅读