首页 > 解决方案 > 带有 ggplot 的闪亮会产生错误的图例:带有刻面的重复图例条目

问题描述

我想绘制一个添加了 geom_hline 的平面图并在图例中显示该线。但是,当我将线添加到图例时,所有条目都与构面数重复。
我怎样才能避免这种行为?
这是我的 MWE

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

df <- mpg

# Define UI for application that draws a histogram
ui <- fluidPage(
    mainPanel(
        plotlyOutput('graph')
    )
)

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

    output$graph <- renderPlotly({
        p <- ggplot2::mpg %>%
        plot_ly %>%
        ggplot() +
        geom_point(aes(displ, hwy, color = class))

        facet <- p + facet_wrap(~year)

        facet + geom_hline(aes(yintercept = 20, linetype = 'hline20'), color = '#00b700') +
            scale_linetype_manual(name = 'line', values = 1,
                                 guide = guide_legend(aes = list(color = "#00b700")))
    })
}

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

标签: rggplot2shiny

解决方案


问题不是shiny也不是ggplot2。问题是ggplot2对象到plotly对象的转换。

下面我将 ggplot 步骤从 plotly 步骤中分离出来,并从图片中完全删除了闪亮的。

p <- ggplot2::mpg %>%
      ggplot() +
      geom_point(aes(x = displ, y = hwy, color = class))

facet <- p + facet_wrap(~year)

final <- facet + geom_hline(aes(yintercept = 20, linetype = 'hline20'), color = '#00b700') +
    scale_linetype_manual(name = 'line', values = 1, guide = guide_legend(aes = list(color = "#00b700")))

print(final)

以上显示正常。

ggplotly(final)

上面的显示错误与您的相同,但不涉及闪亮。

将 ggplot2 对象转换为 plotly 对象时,图例问题和其他显示问题很常见。Plotly 和 ggplot2 是完全独立的绘图框架,具有自己的语法和图形对象。Plotly 提供了转换函数方法,但在从一种格式到另一种格式的转换中仍然会丢失一些东西,因为它们之间没有完全对等。

我建议尝试以本机plotly语法实现您的情节,而不是尝试将其从ggplot2.


推荐阅读