尝试使用ggplotly绘制geom_tile时出现问题

时间:2017-10-06 11:39:52

标签: ggplot2 ggplotly

我想使用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

enter image description here

但是当我输入这个

 ggplotly(p)

我收到以下错误

  

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

我使用的版本是

> packageVersion("plotly")

1'4.7.1

packageVersion("ggplot2")

1'2.2.1.9000'

##########为Arthur编辑的例子
     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

enter image description here

这很有效 但是ggplotly(p)在图例

中添加了标记为G的灰色条

3 个答案:

答案 0 :(得分:1)

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则根本不显示任何图例。

每次在另一个p2$x$data属性中,每个9 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
  }
}

瞧!

答案 1 :(得分:0)

这可以在这里工作:

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"),其中的列名称相同。

答案 2 :(得分:0)

[注意,这还不是答案] (仅供参考,因为超出了评论的范围。)

问题相当复杂。

我刚调试完from itertools import groupby my_list = ['PAID','BATCH','CAKE','MY','CABLE'] print(*(list(g) for k, g in groupby(sorted(my_list, key=len, reverse=True), key=len)), sep='\n') # ['BATCH', 'CABLE'] # ['PAID', 'CAKE'] # ['MY'] 的代码。似乎正在发生here

我在GitHub

中打开了一个问题

这是再现问题的最少代码。

plotly