R shiny и ggplot2: Как сделать границу geom_col прозрачной? - PullRequest
1 голос
/ 17 июня 2020

Я хочу сделать границу geom_col прозрачной. Он работает только при использовании ggplot2:

library(ggplot2)

dataToPlot <- data.frame(Freq = c(0.0000000, 0.7092199, 1.4184397, 2.1276596, 2.8368794), 
                          variable = rep('A',5), value = c(43089.76, 62923.17, 35446.15, 29553.76, 22433.08))

p <- ggplot( dataToPlot , aes(x=Freq, y = value, group = variable   )  ) +  #
  # geom_bar(stat = "bin") fill = variable, 
  geom_col( mapping = aes(col = variable, fill = variable), colour = F,  alpha = 0.2, orientation = "x", position = "dodge") + 
  # scale_linetype(aes(linetype = 0))
  guides(color = FALSE)

dev.new(); p

Однако тот же самый код с блестящим выдает ошибку: «Ошибка: недопустимое имя цвета 'FALSE'»

library(ggplot2)
library(shiny)

dataToPlot <- data.frame(Freq = c(0.0000000, 0.7092199, 1.4184397, 2.1276596, 2.8368794), 
                          variable = rep('A',5), value = c(43089.76, 62923.17, 35446.15, 29553.76, 22433.08))

ui <- fluidPage( 
  useShinyjs(),
  fluidRow( 
    column(8,
           plotOutput("plot")
    )
  )
)

server <- function(input, output) {
  output$plot <- renderPlotly({
    p <- ggplot( dataToPlot , aes(x=Freq, y = value, group = variable   )  ) +  #
      # geom_bar(stat = "bin") fill = variable, 
      geom_col( mapping = aes(col = variable, fill = variable), colour = F,  alpha = 0.2, orientation = "x", position = "dodge") + 
      # scale_linetype(aes(linetype = 0))
      guides(color = FALSE)

  })
}

shinyApp(ui,server)

Что я делаете что-то не так?

1 Ответ

2 голосов
/ 17 июня 2020

Вы делаете несколько ошибок.

Во-первых, вы забыли упомянуть, что вы также используете пакеты shinyjs и plotly.

Во-вторых, вы используете renderPlotly в серверной части, но вызывая plotOutput в ui. Правильным является plotlyOutput в пользовательском интерфейсе, так как вы хотите графическое изображение c.

Другая вещь: поскольку вам нужен графический тип c, вы должны преобразовать свой ggplot graphi c p к сюжетному. Поэтому в серверную часть следует добавить ggplotly(p).

Наконец, чтобы решить проблему с границами, следует использовать colour = NA вместо colour = FALSE. Второй способ работает с ggplot2, но не с plotly. Не знаю, почему. Возможно, кто-нибудь сможет это прояснить.

Итак, ваш код должен выглядеть так:

library(ggplot2)
library(shiny)
library(shinyjs)
library(plotly)

dataToPlot <- data.frame(Freq = c(0.0000000, 0.7092199, 1.4184397, 2.1276596, 2.8368794),
                         variable = rep('A',5), 
                         value = c(43089.76, 62923.17, 35446.15, 29553.76, 22433.08))

ui <- fluidPage( 
  useShinyjs(),
  fluidRow( 
    column(8,
           plotlyOutput("plot")
    )
  )
)

server <- function(input, output) {
  output$plot <- renderPlotly({
    p <- ggplot(dataToPlot , aes(x=Freq, y = value, group = variable)) +
      geom_col(mapping = aes(col = variable, fill = variable), colour = NA,  alpha = 0.2, orientation = "x", position = "dodge") + 
      guides(color = FALSE)

    ggplotly(p)
  })
}

shinyApp(ui,server)
...