r - 将 ggplotly() 图的图例设置为只有颜色而不是形状索引
问题描述
我有下面的数据框:
etf_id<-c("a","b","c","d","e","a","b","c","d","e","a","b","c","d","e")
factor<-c("A","A","A","A","A","B","B","B","B","B","C","C","C","C","C")
normalized<-c(-0.048436801,2.850578601,1.551666490,0.928625186,-0.638111793,
-0.540615895,-0.501691539,-1.099239823,-0.040736139,-0.192048665,
0.198915407,-0.092525810,0.214317734,0.550478998,0.024613778)
df<-data.frame(etf_id,factor,normalized)
我创建了一个ggplotly()
箱线图:
library(ggplot2)
library(plotly)
ggplotly(ggplot(data = df, aes(x = factor, y = normalized)) +
geom_boxplot(aes(fill = as.factor(factor)),outlier.colour = 'black') +
geom_point(data = df, position = position_dodge(0.75))+geom_point(data = df,
aes(x = factor, y = normalized, shape = etf_id, color = etf_id),
size = 2))
结果,我采用了带有此图例的箱线图: 但我希望我的图例仅具有如下颜色区别。请注意,因子不会每次都是 3,但可能会在 1 到 8 之间变化。
解决方案
改变情节元素的推荐方法是使用该style()
函数。您可以通过检查来识别元素和痕迹plotly_json()
。
我不确定是否有更紧凑的方法,但您可以使用以下方法实现所需的结果:
p <- ggplotly(ggplot(data = df, aes(x = factor, y = normalized)) +
geom_boxplot(aes(fill = as.factor(factor)),outlier.colour = 'black') +
geom_point(data = df, position = position_dodge(0.75))+geom_point(data = df,
aes(x = factor, y = normalized, shape = etf_id, color = etf_id),
size = 2))
p <- style(p, showlegend = FALSE, traces = 5:9)
for (i in seq_along(levels(df$factor))) {
p <- style(p, name = levels(df$factor)[i], traces = i)
}
p
请注意,在这种情况下,因子水平和轨迹对齐,但并非总是如此,因此您可能需要调整它(即 i + x)。