【问题标题】:Issue when trying to plot geom_tile using ggplotly尝试使用 ggplotly 绘制 geom_tile 时出现问题
【发布时间】:2018-03-18 05:02:42
【问题描述】:

我想使用 ggplotly 绘制 ggplot2 图像 我想要做的是最初绘制灰色填充的矩形,没有任何美学映射,然后在第二步中绘制瓷砖并根据美学改变颜色。当我使用 ggplot 时我的代码正在运行,但是当我尝试使用 ggplotly 将我的图形转换为交互式时崩溃

这是一个示例代码

library(ggplot2)
library(data.table)
library(plotly)
library(dplyr)


  x = rep(c("1", "2", "3"), 3)
  y = rep(c("K", "B","A"), each=3)
  z = sample(c(NA,"A","L"), 9,replace = TRUE)

  df <- data.table(x,y,z)

  p<-ggplot(df)+
    geom_tile(aes(x=x,y=y),width=0.9,height=0.9,fill="grey") 


    p<-p+geom_tile(data=filter(df,z=="A"),aes(x=x,y=y,fill=z),width=0.9,height=0.9)
p

但是当我输入这个时

 ggplotly(p)

我收到以下错误

[.data.frame(g, , c("fill_plotlyDomain", "fill")) 中的错误:
选择了未定义的列

我使用的版本是

> packageVersion("plotly")

1‘4.7.1

packageVersion("ggplot2")

1‘2.2.1.9000’

##########亚瑟的编辑示例
     p<-ggplot(df)+
    geom_tile(aes(x=x,y=y,fill="G"),width=0.9,height=0.9) 
  p<- p+geom_tile(data=filter(df,z=="A"),aes(x=x,y=y,fill=z),width=0.9,height=0.9)

  p<-p+ scale_fill_manual(
    guide = guide_legend(title = "test",
                         override.aes = list(
                           fill =c("red","white")                  )
    ),
    values = c("red","grey"),
    labels=c("A",""))
p

这行得通 但是 ggplotly(p) 在图例中添加了标记为 G 的灰色条

【问题讨论】:

  • 您好!您是否有任何理由不想使用自定义+scale_fill_manual() 直接通过aes(x=x,y=y, fill=z) 着色? (ggplot2.tidyverse.org/reference/scale_manual.html)
  • 嗨 最后这就是我所做的。但我想隐藏传说中的灰色瓷砖。这再次适用于 ggplot 并正确使用 guide_legend(override.aes)) 和图例。但是当我再次使用 ggplotly 时,传奇再次出现
  • 我添加了一个例子来更好地解释我的意思
  • 所以您真正的问题是:“如何使用 ggplotly 隐藏图例中的选定键?”我理解正确吗?
  • 对于操作问题和要求,scale_fill_manual 可能并不总是需要的解决方案。我们能不能在 GitHub 中为它创建一个问题。

标签: ggplot2 ggplotly


【解决方案1】:

[注意这还不是答案] (仅供参考,因为超出了cmets的限制。)

问题比较复杂。

我刚刚调试完plotly的代码。似乎正在发生here

我在GitHub 中打开了一个问题

这里是重现问题的最少代码。

library(ggplot2)

set.seed(1503)

df <- data.frame(x = rep(1:3, 3),
                 y = rep(1:3, 3),
                 z = sample(c("A","B"), 9,replace = TRUE), 
                 stringsAsFactors = F)

p1 <- ggplot(df)+
  geom_tile(aes(x=x,y=y, fill="grey"), color = "black")

p2 <- ggplot(df)+
  geom_tile(aes(x=x,y=y),fill="grey", color = "black")

class(plotly::ggplotly(p1))
#> [1] "plotly"     "htmlwidget"
class(plotly::ggplotly(p2))
#> Error in `[.data.frame`(g, , c("fill_plotlyDomain", "fill")): undefined columns selected

【讨论】:

    【解决方案2】:

    ggplotly 函数的输出是一个带有plotly 类的列表。它被打印为 Plotly 图,但您仍然可以将其作为列表使用。此外,documentation 表示修改列表可以清除allpart of 的图例。只需了解数据的结构。

    p<-ggplot(df)+
       geom_tile(aes(x=x,y=y,fill=z),width=0.9,height=0.9)+
       scale_fill_manual(values = c(L='grey', A='red'), na.value='grey')
    p2 <- ggplotly(p)
    str(p2)
    

    全局图例位于 p2$x$layout$showlegend 中,将其设置为 false 根本不会显示图例。

    组特定的图例出现在 9 个p2$x$data 元素中的每一个上,每次都出现在另一个showlegend 属性中。其中只有3个设置为TRUE,对应图例中的3个键。因此,以下循环清除了所有不需要的标签:

    for(i in seq_along(p2$x$data)){
      if(p2$x$data[[i]]$legendgroup!='A'){
        p2$x$data[[i]]$showlegend <- FALSE
      }
    }
    

    瞧!

    【讨论】:

    • 它成功了!谢谢!!!!这真的很有帮助,当然理解 plotly 对象的结构可以帮助我进行更多的操作,我将来需要:)
    【解决方案3】:

    这在这里有效:

    ggplot(df)+
      geom_tile(aes(x=x,y=y,fill=z),width=0.9,height=0.9)+
      scale_fill_manual(values = c(L='grey', A='red'), na.value='grey')
    
    ggplotly(p)
    

    我猜您的问题来自于使用 2 个不同的数据源,dffilter(df,z=="A"),列具有相同的名称。

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      相关资源
      最近更新 更多