Shiny Server:leafet在图例中不显示viridis颜色

时间:2016-10-16 06:11:23

标签: r ubuntu shiny leaflet viridis

我在使用viridis调色板绘制图例的颜色时遇到问题:尽管图例标签是,但颜色不会显示。

enter image description here

我在Ubuntu下测试了相同的代码Shiny Server v1.4.2.786 Node.js v0.10.40(它没有显示viridis颜色)和MacOS下(它确实正确)。

Ubuntu R会话的详细信息:

R version 3.3.1 (2016-06-21)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 15.10

leaflet_1.0.1 shiny_0.13.2  viridis_0.3.4

这是不显示颜色的图例

    leaflet() %>% addTiles() %>% addLegend(
      position = 'bottomright',
      colors = viridis(8), 
      labels = viridis(8), opacity = 1)

虽然这也适用于Ubuntu机器

    leaflet() %>% addTiles() %>% addLegend(
      position = 'bottomright',
      colors = rgb(t(col2rgb(palette())) / 255), 
      labels = palette(), opacity = 1)

enter image description here

这似乎是viridis调色板的颜色代码的问题(我尝试在字符向量中复制/粘贴它们)。

一个工作示例

library(shiny)
library(leaflet)
library(viridis)

r_colors <- rgb(t(col2rgb(colors()) / 255))
names(r_colors) <- colors()

ui <- fluidPage(
  leafletOutput("mymap")
)

server <- function(input, output, session) {

  output$mymap <- renderLeaflet({
    leaflet() %>% addTiles() %>% addLegend(
      position = 'bottomright',
      colors = viridis(8), 
      labels = viridis(8), opacity = 1)

  })
}

shinyApp(ui, server)

3 个答案:

答案 0 :(得分:1)

这与#xxxxxxFF调色板的Alpha通道viridis有关。在为{strong> mapview 包创建viridis默认调色板时,我遇到了同样的问题。我写了一个小功能来解决这个问题。该功能未导入命名空间,因此您只能通过mapview:::col2Hex访问该功能。它被定义为:

function(col, alpha = FALSE) {

  mat <- grDevices::col2rgb(col, alpha = TRUE)
  if (alpha) {
    hx <- grDevices::rgb(mat[1, ]/255, mat[2, ]/255,
                         mat[3, ]/255, mat[4, ]/255)
  } else {
    hx <- grDevices::rgb(mat[1, ]/255, mat[2, ]/255, mat[3, ]/255)
  }
  return(hx)

}

,可以找到来源here

这样,您的代码就可以运行。

leaflet() %>% addTiles() %>% addLegend(
    position = 'bottomright',
    colors = mapview:::col2Hex(viridis(8)), 
    labels = mapview:::col2Hex(viridis(8)), opacity = 1)

尝试将alpha设置为TRUE,但最终没有颜色:

leaflet() %>% addTiles() %>% addLegend(
    position = 'bottomright',
    colors = mapview:::col2Hex(viridis(8), alpha = TRUE), 
    labels = mapview:::col2Hex(viridis(8), alpha = TRUE), opacity = 1)

答案 1 :(得分:1)

传单的开发版现在支持viridis调色板。 https://github.com/rstudio/leaflet/pull/364

答案 2 :(得分:0)

我正在运行一台14.04LTS的Ubuntu机器。我能够获得图例上的颜色,但看起来颜色没有在colors()函数中列出,并且传说标签仍然是十六进制代码。

这部分代码应该检索颜色名称:

colors()[match(rgb(t(col2rgb(leafletColors)), 
                       maxColorValue = 255), c(rgb(t(col2rgb(colors())), maxColorValue = 255)))]

修改后的app.R代码

    library(shiny)
    library(leaflet)
    library(viridis)

    r_colors <- rgb(t(col2rgb(colors()) / 255))
    names(r_colors) <- colors()
    leafletColors <- palette(viridis(8))

    ui <- fluidPage(
            leafletOutput("mymap"),
            p(),
            actionButton("recalc", "New points")
    )

    server <- function(input, output, session) {

            points <- eventReactive(input$recalc, {
                    cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
            }, ignoreNULL = FALSE)

            output$mymap <- renderLeaflet({
                    leaflet() %>%
                            addProviderTiles("Stamen.TonerLite",
                                             options = providerTileOptions(noWrap = TRUE)
                            ) %>%
                            addMarkers(data = points()) %>% 
                            addLegend(
                                    position = 'bottomright',
                                    colors = leafletColors, 
                                    labels = palette(), opacity = 1)
            })
    }

    shinyApp(ui, server)

让我知道这有用......