R中含tooltip文本的boxplot用plot函数显示异常的解决方法
问题与解决方案
问题背景
需要为Shiny App创建单个ggplot箱线图对象,要求:
- 用
plot()函数绘制时正常显示(无需tooltip) - 用
ggplotly()转换后能展示自定义tooltip信息 - 对象创建后无法修改,需存入列表供后续使用
当前在全局aes()中添加text参数定义tooltip后,plot()绘制的图形显示异常,但ggplotly()能正常工作。
原因分析
ggplot本身不支持将text作为全局美学映射参数,当用plot()绘制时,ggplot会尝试将text映射到图形的视觉属性,但该参数不属于ggplot默认支持的美学属性(如x/y/color等),因此引发绘图异常。而ggplotly()专门针对ggplot对象做了适配,能够识别aes()中的text参数并将其作为tooltip内容,所以不受影响。
解决方案
将text参数从全局aes()移至geom_jitter的局部aes()中。这样:
- 用
plot()绘制时,ggplot会忽略geom中不支持的text参数,正常渲染图形 - 用
ggplotly()转换时,依然能读取到text参数作为tooltip内容
修改后的代码:
myboxplot <- ggplot(myyear, aes(x=position, y=.data[[year]])) + geom_boxplot(outlier.shape = NA) + geom_jitter( aes(color=.data[[cl]], text=paste("life exp:", .data[[year]])), shape=16, position=position_jitter(0.2), size=2 ) # 验证效果 plot(myboxplot) # 正常绘制无异常 ggplotly(myboxplot) # 正常显示自定义tooltip
如果需要为箱线图的统计信息(如中位数、四分位数)也添加tooltip,可以给geom_boxplot单独添加局部text参数,示例:
myboxplot <- ggplot(myyear, aes(x=position, y=.data[[year]])) + geom_boxplot( outlier.shape = NA, aes(text=paste( "位置:", position, "\n中位数:", round(stat(y), 2), "\n四分位距:", round(stat(ymax)-stat(ymin), 2) )) ) + geom_jitter( aes(color=.data[[cl]], text=paste( "国家:", country, "\n预期寿命:", .data[[year]] )), shape=16, position=position_jitter(0.2), size=2 )
内容的提问来源于stack exchange,提问作者Fabrice
相关产品推荐
相关产品推荐

