Как сделать графики с одинаковой цветовой схемой в Shiny с помощью ggplot? - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь создать приложение Shiny, в котором у меня есть два графика:

1) первый график продаж по корпорации,

2) второе место с продажами топовых брендов

Мне бы хотелось, чтобы цвет брендов на втором графике был таким же, как у корпорации, которой он принадлежит, на первом графике. Я нашел пример того, как это можно сделать с помощью R, но не знаю, как воспроизвести его в Shiny.

Я не знаю, как сделать именованный вектор names(myColors) <- levels(dat$grp) с отзывчивыми элементами

Ниже приведен пример кода в Shiny и далее - решение для R.

library(shiny)
library(dplyr)
library(ggplot2)

ui <- fluidPage(
# slider that limits number of corporations for which the brands are shown
sliderInput(inputId = "n_corpo",
          label = "Number of corporations",
          value = 2, min = 1, max = 5, step= 1),

plotOutput("corpo"), # first graph
plotOutput("brands") # second graph
)

server <- function(input, output, session) {
# creating data frame 
brand <- data.frame(brand= rep(LETTERS[6:15],each = 3),stringsAsFactors = FALSE,
                  period = sample(1:10),
                  value = runif(10))

corporation <- data.frame(corpo = rep(LETTERS[1:5],each = 2),stringsAsFactors = FALSE,
                        brand = LETTERS[6:15]) %>%
                        left_join(brand, .)

# code to create first graph
output$corpo = renderPlot({
  corporation %>%
  group_by(corpo, period) %>%
  summarise(value = sum(value))%>%
  ggplot(aes(period, value, fill = corpo))+
  geom_col()+
  facet_wrap(~corpo)
  })

# code for the second graph
output$brands = renderPlot({


# selecting n biggest corporations 
corpo_top_n = corporation %>%
  group_by(corpo) %>%
  summarise(value = sum(value)) %>%
  top_n(input$n_corpo, value) %>%
  select(corpo)

# graph with the brands of selected corporations
corporation %>%
  group_by(corpo, brand, period) %>%
  summarise(value = sum(value))%>%
  inner_join(., corpo_top_n) %>%
  ggplot(aes(period, value, fill = corpo))+
  geom_col()+
  facet_wrap(~brand)
  })
 }

shinyApp(ui, server)

Я нашел это решение, но не могу заставить его работать с Shiny.

#Some test data
dat <- data.frame(x=runif(10),y=runif(10),
              grp = rep(LETTERS[1:5],each = 2),stringsAsFactors = TRUE)

#Create a custom color scale
library(RColorBrewer)
myColors <- brewer.pal(5,"Paired")
colScale <- scale_colour_manual(name = "grp",values = myColors)

names(myColors) <- levels(dat$grp) # this part do not know how to adapt to Shiny
colScale <- scale_colour_manual(name = "grp",values = myColors)


 #One plot with all the data
 p <- ggplot(dat,aes(x,y,colour = grp)) + geom_point()
 p1 <- p + colScale

 #A second plot with only four of the levels
 p2 <- p %+% droplevels(subset(dat[4:10,])) + colScale

Спасибо за вашу помощь! Marek

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...