You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:01:05