【问题标题】:Shiny w/ ggplot produces erroneous legend: duplicate legend entries with facets带有 ggplot 的闪亮会产生错误的图例:带有刻面的重复图例条目
【发布时间】:2019-07-29 17:25:42
【问题描述】:

我想绘制一个添加了 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)

【问题讨论】:

    标签: r ggplot2 shiny


    【解决方案1】:

    问题不是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 转换它。

    【讨论】:

    • 另外说明,我刚刚发现您有两个变量附加到color。数据中的classgeom_hline() 的硬编码颜色。 ggplot2 可以处理它,因为它具有不同的点和线字形。 Plotly 没有,所以它所做的是将所有颜色编码的来源组合成元组。所以你得到了类的所有组合以及你尝试设置的线型颜色的奇怪定义。
    • 如果你去掉硬编码的线条美学(硬编码的值不属于美学),就像我在下面所做的那样,plotly 可以很好地转换对象mpg %&gt;% ggplot() + geom_point(aes(displ, hwy, color = class)) + facet_wrap(~year) + geom_hline(yintercept = 20, linetype = 2, color = '#00b700')
    猜你喜欢
    • 2021-11-20
    • 2021-08-14
    • 2015-01-04
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多