我正在尝试生成具有与颜色编码值相对应的legend的图形。
以下是我的数据:
df <- data.frame(group = c(rep("A",3),rep("B",3),rep("C",3)),
start = c(1,3,5), end = c(2,4,6), width = 1, y = 0.1, label = rep(paste0("segment ",1:3),3),
value.range = c("7-8","2-3","4-5","1-2","5-6","3-4","6-7","8-9","6-7"))然后将每个value.range与一种颜色进行匹配:
colors.df <- data.frame(value.range = c("1-2","2-3","3-4","4-5","5-6","6-7","7-8","8-9"),
color = colorRampPalette(c("lightgray","darkred"))(8),
stringsAsFactors = F)将df$value.range设置为以colors.df$value.range为级别的factor:
df$value.range <- factor(df$value.range, levels = colors.df$value.range)然后我生成一个plotly图形的list,每个df$group对应一个
plot.list <- lapply(c("A","B","C"), function(g){
plotly::plot_ly(dplyr::filter(df,group == g),showlegend=T) %>%
plotly::add_bars(x =~ start,y =~ y,width =~ width,color =~ value.range, colors = colors.df$color) %>%
plotly::layout(annotations = list(text = g, xref = "paper", yref = "paper", yanchor = "bottom", xanchor = "center", align = "center", x = 0.5, y = 1, showarrow = F), legend = list(x = 1, y = 0)) %>%
plotly::layout(xaxis = list(title = NA, zeroline = F, tickangle = 45, range = c(-1, max(dplyr::filter(df,group == g)$end) + 1), tickvals = dplyr::filter(df,group == g)$start, ticktext = dplyr::filter(df,group == g)$label),
yaxis = list(title = NA, zeroline = F, showgrid = F, range = c(0,1), showticklabels = F)) %>%
plotly::add_annotations(text = "log2(value)", xref = "paper", yref = "paper", x = 0.99, xanchor = "left", y = 0.5, yanchor = "top", legendtitle = T, showarrow = F)
})这就给出了:



正如您所看到的,每个图的legend只显示其各自组中的value.range值。
我的问题是,是否有可能,以及如何让每个legend显示value.range的所有值(即colors.df中的所有内容)。
发布于 2019-09-07 02:48:56
您是否考虑过使用subplot函数组合绘图?合并后的曲线图将具有一个包含所有值的图例。
plotly::subplot(plot.list)https://stackoverflow.com/questions/57826987
复制相似问题