ggplotly工具提示标签冲突及添加参考线后保留双端信息的解决方案咨询
我最近在用ggplotly处理鸢尾花数据集的可视化时遇到了个头疼的问题,想跟大家请教下更规范的解决方案:
我的需求很明确:绘制iris数据集的散点图,同时添加自定义的参考线,既要让散点的tooltip保留Species信息,也要让参考线的tooltip显示对应的Type信息(参考线数量较多,用图例不太实用)。
初始基础代码(正常显示散点及Species提示)
先给大家看我最初能正常运行的散点图代码,tooltip里能正常显示Species:
library(plotly) p = ggplot(iris, aes(label=Species)) + geom_point(aes(Sepal.Length,Sepal.Width)) ggplotly(p)
参考线数据集定义
我准备了用于绘制参考线的数据集a:
a <- data.frame(ID=rep(1:3,2),Type=rep(1:3,2), Sepal.Length=rep(5:7,2), Sepal.Width=rep(c(0,5),rep(3,2)))
数据集结构如下:
Type Sepal.Length Sepal.Width
1 1 5 0
2 2 6 0
3 3 7 0
4 1 5 5
5 2 6 5
6 3 7 5
第一次尝试添加参考线:出现标签冲突报错
我尝试把参考线直接加到图中,代码如下:
p <- ggplot(iris, aes(label=Species)) + geom_point(aes(Sepal.Length,Sepal.Width)) + geom_line(data=a, aes(x=Sepal.Length, y=Sepal.Width, color=Type, group=ID)) ggplotly(p)
结果直接抛出错误:
Error in FUN(X[[i]], ...) : object 'Species' not found
妥协方案:丢失Species提示信息
后来我去掉了全局的label=Species,代码能正常运行,但散点的tooltip里再也看不到Species信息了,这不是我想要的效果:
p = ggplot(iris) + geom_point(aes(x=Sepal.Length, y=Sepal.Width)) + geom_line(data=a, aes(x=Sepal.Length, y=Sepal.Width, color=Type, group=ID)) ggplotly(p)
意外可行的尝试:带警告但效果符合预期
我试着在geom_line的美学映射里手动把label设为NA,同时保留group=ID,代码如下:
p <- ggplot(iris, aes(label = Species)) + geom_point(aes(Sepal.Length,Sepal.Width)) + geom_line(data = a, aes(x = Sepal.Length, y = Sepal.Width, color = Type, label = NA, group=ID))
运行时会弹出警告:
Warning message:
In geom_line(data = a, aes(x = Sepal.Length, y = Sepal.Width, color = Type, :
Ignoring unknown aesthetics: label
但实际测试下来,不管是ggplot生成的静态图,还是ggplotly转成的交互式图,效果都完全符合我的需求——散点tooltip能看到Species,参考线也能正常显示Type信息。之前因为这个警告我没敢运行ggplotly(p),现在试了才发现没问题。
不过我还是想确认下,有没有更规范的解决方法?另外我不太想把数据集a和iris合并,尽量保持两个数据集独立。
备注:内容来源于stack exchange,提问作者user2955884

