尝试使用 ggplotly 绘制 geom_tile 时出现问题
Issue when trying to plot geom_tile using 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
但是当我输入这个时
ggplotly(p)
我收到以下错误
Error in [.data.frame
(g, , c("fill_plotlyDomain", "fill")) :
undefined columns selected
我使用的版本是
> 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 的灰色条
这在这里有效:
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 个不同的数据源,df
和 filter(df,z=="A")
,其中的列具有相同的名称。
ggplotly
函数的输出是一个包含 plotly
class 的列表。它被打印为 Plotly 图表,但您仍然可以将其作为列表使用。而且,documentation indicates that modifying the list makes it possible to clear all or part 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
的代码。它似乎正在发生 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
我想使用 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)
我收到以下错误
Error in
[.data.frame
(g, , c("fill_plotlyDomain", "fill")) :
undefined columns selected
我使用的版本是
> 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 的灰色条
这在这里有效:
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 个不同的数据源,df
和 filter(df,z=="A")
,其中的列具有相同的名称。
ggplotly
函数的输出是一个包含 plotly
class 的列表。它被打印为 Plotly 图表,但您仍然可以将其作为列表使用。而且,documentation indicates that modifying the list makes it possible to clear all or part 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
的代码。它似乎正在发生 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