【问题标题】:Shiny creating a reactive legendShiny 创造了一个反应式传奇
【发布时间】:2019-03-07 03:10:48
【问题描述】:

我正在关注R shiny Aesthetics must be either length 1 or the same as the data (8): y 中给出的解决方案,以解决我很高兴解决的烦人问题。

我要解决的下一个问题是我希望我的情节有一个反应图例 - 我只希望图例显示实际选择的内容和情节

我还想将线条的颜色设置为我想要的颜色。最后,我想确保图例始终按照我指定的顺序进行

这是一个可重现的示例(注释掉的代码是我尝试解决自己的问题。

如您所见,注释掉的部分是我尝试获取我想要的图例和颜色的方式:

library(shiny)
library(tidyverse)
library(reshape2)
library(scales)

time <- seq(-9, 60, 1)
var1 <- rnorm(70, 35, 2)
var2 <- rnorm(70, 50, 2)
var3 <- rnorm(70, 24, 2)
var4 <- rnorm(70, 17, 2)

data <- data.frame(time = time, 
                   var1 = var1, 
                   var2 = var2,
                   var3 = var3,
                   var4 = var4)

datamelt <- melt(data, "time")

p <- ggplot(datamelt, aes(x = time, y = value, color = variable)) +
  # scale_color_manual(values = c(
  # 'first' = 'red',
  # 'second' = 'blue',
  #   'third' = 'green',
  #   'fourth' = 'orange'
  #   ),
  # breaks = c("first", "second", "third", "fourth")) +
  #  labs(color = 'Legend') +
  theme_classic() +
  theme(axis.ticks = element_blank()) +
  labs(title = 'it means nothing',
       subtitle = 'these are made up data') +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_x_continuous(name ="a y variable", breaks = seq(-9, 60, 1)) +
  scale_y_continuous(name = "yep an x variable", 
                     breaks = seq(0, 60, 5), labels = comma) + geom_blank()


ui <- fluidPage(
  titlePanel("trying to make this work"),
  sidebarLayout(
    sidebarPanel(
      checkboxGroupInput("whichone", "Choose something:", 
                         choiceNames = c("first", 
                                         "second", 
                                         "third",
                                         "fourth"), 
                         choiceValues = c("var1", 
                                          "var2",
                                          "var3",
                                          "var4"))
    ),
    ###the plot
    mainPanel(
      plotOutput("plot")
    )
  )
)

server <- function(input, output) {
   output$plot <- renderPlot({
      data_filtered <- datamelt %>% filter(variable %in% input$whichone)
      p + geom_line(data = data_filtered)
   })
}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny legend


    【解决方案1】:

    出现问题是因为ggplot 使用了所有因子水平,这些因子水平在您过滤时保持不变。所以你需要先降低这些水平。

    其次,您正在使用所有级别静态生成图。因此,您还需要更新 teh plto 中的数据,让ggplot 知道要在图例中显示哪些级别。将它们放在一起,您可以使用以下内容:

    server <- function(input, output) {
       output$plot <- renderPlot({
          ## 1. drop unused levels from teh filtered database
          data_filtered <- datamelt %>% filter(variable %in% input$whichone) %>%
              droplevels()
          ## 2. tell ggplot to update the data
          p %+% data_filtered + geom_line()
       })
    }
    

    注意。这种方法有一个讨厌的 (?) 副作用,如果你不选择任何数据来显示你只会看到一个空的画布。这也可以补救,但需要对代码逻辑进行一些更改(基本上将 ggplot 的构造移动到 renderPlot 中)


    截图

    【讨论】:

    • 谢谢。这可行,但即使未选择它们,图例仍会显示所有 4 个变量(名称为 var1、var2 等)。而且,当我删除注释掉的位以尝试更改图例名称和颜色时,我收到以下错误:“警告:删除了 70 行包含缺失值 (geom_path)。”我认为我真的对 R 如何使用 scale_colour_manual() 制作图例以及如何将其与 Shiny 的反应性结合起来缺乏一些理解。你会建议哪些在线资源来获得一些直觉?
    • 嗯,我没有得到相同的行为。我附上了一些显示图例已更新的屏幕截图。原理很简单:在您的渲染函数中,确保您传递给ggplot 的数据只有您想要显示的级别。那么传说是正确的。从内置图例开始,然后尝试更改为自定义颜色。
    • 这真的很奇怪。谢谢,我会确保完全按照此处复制和粘贴所有代码,看看它是否工作正常。
    • 复制+粘贴,效果和你的截图一模一样,谢谢 :)
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多