如何解决在图子图中合并图例
我有几组,每组中有几类我测量了连续值:
set.seed(1)
df <- data.frame(value = c(rnorm(100,1,1),rnorm(100,2,3,1)),class = c(rep("c1",100),rep("c2",rep("c3",rep("c4",rep("c1",100)),group = c(rep("g1",300),rep("g2",rep("g3",300)))
df$class <- factor(df$class,levels =c("c1","c2","c3","c4"))
df$group <- factor(df$group,levels =c("g1","g2","g3"))
不是数据中的每个组都具有相同的类,或者不是每个组都具有所有类的子集。
我正在尝试为每个组生成R
plotly
密度曲线,并按类别进行颜色编码,然后使用plotly
的{{ 1}}功能。
这就是我在做什么:
subplot
我要解决的问题是:
- 图例仅出现一次(现在每组重复一次)合并所有类
- 标题已出现在每个子图中,而不仅仅是现在的最后一个图。 (我知道我可以简单地将组名作为x轴标题,但我宁愿节省空间,因为实际上我有3个以上的组)
解决方法
使用plot_ly()
有点棘手,至少如果您想坚持使用color
参数从数据中生成多条迹线。
您需要在考虑类变量的情况下定义legendgroup
。
legendgroup
不会将图例项合并为一个(只是将它们分组)。
为避免图例中出现重复的条目,您需要为要隐藏的与图例有关的迹线设置showlegend = FALSE
。
由于事实,您没有使用循环(或lapply)来创建子图的单个迹线,所以在生成图时,我们无法控制每个迹线的可见性(通过上述{{1 }}参数-我们可以隐藏或显示color
调用的所有迹线-通过plot_ly
我们可以分别控制每个迹线)。因此,我仅为第一个图设置add_trace
并强制其通过虚拟数据显示所有可用的类。请参阅以下内容:
showlegend = TRUE
另一种方法(避免虚拟数据变通方法)是在循环中(或通过lapply)创建每个跟踪,并根据项目的首次出现来控制其图例可见性。
此外,我认为应该可以使用set.seed(1)
df <- data.frame(value = c(rnorm(100,1,1),rnorm(100,2,3,1)),class = c(rep("c1",100),rep("c2",rep("c3",rep("c4",rep("c1",100)),group = c(rep("g1",300),rep("g2",rep("g3",300)))
df$class <- factor(df$class,levels =c("c1","c2","c3","c4"))
df$group <- factor(df$group,levels =c("g1","g2","g3"))
library(dplyr)
library(ggplot2)
library(plotly)
plot.list <- lapply(c("g1","g3"),function(g){
density.df <- do.call(rbind,lapply(unique(dplyr::filter(df,group == g)$class),function(l)
ggplot_build(ggplot(dplyr::filter(df,group == g & class == l),aes(x=value))+geom_density(adjust=1,colour="#A9A9A9"))$data[[1]] %>%
dplyr::select(x,y) %>% dplyr::mutate(class = l)))
p <- plot_ly(data = density.df,x = ~x,y = ~y,type = 'scatter',mode = 'lines',color = ~class,legendgroup = ~class,showlegend = FALSE) %>%
layout(xaxis = list(zeroline = F),yaxis = list(zeroline = FALSE)) %>%
add_annotations(
text = g,x = 0.5,y = 1.1,yref = "paper",xref = "paper",xanchor = "middle",yanchor = "top",showarrow = FALSE,font = list(size = 15)
)
if(g == "g1"){
dummy_df <- data.frame(class = unique(df$class))
dummy_df$x <- density.df$x[1]
dummy_df$y <- density.df$y[1]
p <- add_trace(p,data = dummy_df,type = "scatter",mode = "lines",showlegend = TRUE,hoverinfo = 'none')
}
p
})
subplot(plot.list,nrows = length(plot.list),shareX = TRUE)
控制图例项目的可见性。但是,我目前无法控制单个跟踪。我提出了一个问题here。
关于子图的标题,请参见this。
,您可以使用以下代码
library(tidyverse)
library(plotly)
ggplotly(
ggplot(df,aes(x=value,col = class)) +
geom_density(adjust=1) +
facet_wrap(~group,ncol = 1) +
theme_minimal() +
theme(legend.position = 'top')
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。