使用geom_violin、geom_jitter结合plotly绘图时小提琴形状丢失的解决请求
解决ggplotly转换后小提琴图形状丢失的问题
当使用geom_violin()搭配geom_jitter()绘制横向小提琴图时,原生ggplot可以正常显示,但通过ggplotly()转换后会出现小提琴图形状丢失的问题。
可复现代码
# libraries library(tidyverse) library(janitor) library(ISLR) library(plotly) # data data <- OJ %>% as_tibble() %>% clean_names() # plot p <- data %>% ggplot(aes(price_ch, purchase))+ geom_violin()+ geom_jitter(aes(text = price_ch),width = 0.1, alpha = 0.5)+ facet_wrap(~store7) # plot with plotly ggplotly(p, tooltip = "text")
问题原因
ggplotly对横向小提琴图(连续变量映射到x轴、分类变量映射到y轴的情况)的转换支持存在兼容性缺陷,无法正确解析ggplot中横向小提琴的几何形状参数。
解决方法
方法1:改用plotly原生函数构建图表
直接使用plotly的原生接口创建小提琴图和抖动散点,规避ggplot转换的兼容性问题:
library(tidyverse) library(janitor) library(ISLR) library(plotly) data <- OJ %>% as_tibble() %>% clean_names() # 用plotly原生函数构建图表 p_plotly <- plot_ly(data) %>% # 添加小提琴图 add_violin( y = ~price_ch, x = ~purchase, color = ~purchase, side = "both", box = list(visible = FALSE), hoverinfo = "none" ) %>% # 添加抖动散点 add_markers( x = ~purchase, y = ~price_ch, text = ~price_ch, alpha = 0.5, marker = list(size = 5), jitter = 0.1, hoverinfo = "text" ) %>% # 设置分面 facet_wrap(~store7) %>% # 调整坐标轴标签 layout( xaxis = list(title = "purchase"), yaxis = list(title = "price_ch") ) p_plotly
方法2:调整ggplot为纵向布局再翻转坐标轴
先将ggplot设置为纵向小提琴图,再通过coord_flip()翻转坐标轴,让ggplotly能正确识别小提琴形状:
library(tidyverse) library(janitor) library(ISLR) library(plotly) data <- OJ %>% as_tibble() %>% clean_names() # 绘制纵向小提琴图后翻转坐标轴 p <- data %>% ggplot(aes(purchase, price_ch))+ geom_violin()+ # 注意将jitter的width参数改为height geom_jitter(aes(text = price_ch), height = 0.1, alpha = 0.5)+ facet_wrap(~store7)+ coord_flip() # 转换为plotly交互图 ggplotly(p, tooltip = "text")
两种方法都能完整保留小提琴图的形状,同时保留抖动散点的交互效果和分面布局。
内容的提问来源于stack exchange,提问作者The Rookie
相关产品推荐
相关产品推荐

