Ручное добавление цветов к графику «Сверкающий / ggplot» - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь создать блестящее приложение, в котором пользователь может выбрать, какой из трех столбцов будет отображаться в зависимости от времени, состоящий из процентов от трех кандидатов. Пока фактический график работает отлично, но я бы хотел добавить цвета, чтобы Cand_1 получал синюю линию, Cand_2 - зеленую, а Cand_3 - красную. Я пытался использовать Plot + scale_colour_manuall = "c("Cand_1" = "blue", "Cand_2" = "green", "Cand_3" = "red) с "" и без "" вокруг имен переменных, а также if в aes(), так что:

Plot <- Plot + geom_line(aes(month, !! sym(input$cand)),  group = 1, if(input$cand == "Cand_1){
colour = "blue"}
if(input$cand == "Cand_2"){colour = "green"}
if(input$cand == "Cand_2"){colour = "red})

Но ни один из них не работает, либо дает ошибка Attempted to create layer with no stat, или просто игнорирование аргументов.

Весь код выглядит так:

   library(shiny)
   library(tidyverse)
   setwd("")
   Data <- read.csv("Data.csv", stringsAsFactors = F)
   # Define UI
   ui <- fluidPage(

   # Application title
titlePanel("Candidates"),

# Sidebar with a select input 
sidebarLayout(
    sidebarPanel(
        selectInput("Cand",
                    "Candidates",
                    choices = colnames(Data)[2:4], multiple = TRUE)
    ),


    mainPanel(
       plotOutput("LederPlott"),
       textOutput("length")

    )
)
  )

  # Define server logic required to draw plot
  server <- function(input, output) {

output$CandPlott <- renderPlot({
  Plot <- ggplot(Data) 
  if(length(input$Cand) == 1){
    Plot <- Plot + geom_line(aes(month, !! sym(input$Cand)),  group = 1) 

  }
  if(length(input$Cand) == 2){
    Plot <- Plot + geom_line(aes(month, !! syms(input$Cand)[[1]]), group = 1)+
      geom_line(aes(month, !! syms(input$Cand)[[2]]), group = 1)
  }
  if(length(input$Cand) == 3){
    Plot <- Plot + geom_line(aes(month, !! syms(input$Cand)[[1]]), group = 1) 
    Plot <- Plot + geom_line(aes(month, !! syms(input$Cand)[[2]]), group = 1)
    Plot <- Plot + geom_line(aes(month, !! syms(input$Cand)[[3]]), group = 1)
  }
  Plot <- Plot + theme_classic() + ylab("%") + ggtitle("%God") 
  Plot
    })
output$length <- renderText(input$Cand) 
}

 # Run the application 
 shinyApp(ui = ui, server = server)

А вот некоторые примеры данных:

Month   Cand_1  Cand_2  Cand_3
2019-02-01  60,7    90,1    86,2
2019-03-01  58,9    90,2    80,3
2019-04-01  47,3    88,3    84,6
2019-05-01  54,5    87,3    90
2019-06-01  50,6    86      89
2019-07-01  49,8    84,2    87,1

1 Ответ

1 голос
/ 17 марта 2020

Вы не можете назначить цвет следующим образом,

Plot <- Plot + geom_line(aes(month, !! sym(input$cand)),  group = 1, if(input$cand == "Cand_1){
colour = "blue"}
if(input$cand == "Cand_2"){colour = "green"}
if(input$cand == "Cand_2"){colour = "red})

Поскольку цвет является параметром aes (). Он должен отображаться на верхнем уровне, например:

Plot <- Plot + geom_line(aes(month, !! sym(input$cand)),  group = 1, colour = <your decision here>)

Но также этот параметр служит другой цели. Он служит для окраски разных групп разными цветами. То, что вы хотите, это одна переменная за раз. Так что для этой цели это тоже не сработает.

Вам нужно поместить параметр color= в вызов geom_line(), но за пределами aes():

Plot <- Plot + geom_line(aes(month, !! sym(input$cand)),  group = 1),
  colour = if(input$cand == "Cand_1") "blue" else 
if(input$cand == "Cand_2")"green" else
if(input$cand == "Cand_3") "red")

Есть более короткие способы сделать это, также:

color.list <- list(Cand_1 = "blue", Cand_2 = "green", Cand_3 = "red")

Plot <- Plot + geom_line(aes(month, !! sym(input$cand)), group = 1),
  colour = color.list[[input$cand]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...