Как создать графики скрипки с дополнительными точками единого значения в ggplot2

#r #ggplot2

#r #ggplot2

Вопрос:

Я хотел бы создать график скрипки в ggplot, где для каждой группы данных я отображаю распределение в виде графика скрипки и одно наблюдаемое значение в виде точки, вот так:

введите описание изображения здесь

Кто-нибудь знает, как это сделать?

Вот пример данных:

 p <- data.frame("Experimental_group" = c("Group_1", "Group_1", "Group_1", "Group_1", "Group_1", "Group_1", "Group_1", "Group_2", "Group_2", "Group_2", "Group_2", "Group_2", "Group_2", "Group_2"), "Set" = c("Distribution", "Distribution", "Distribution", "Distribution", "Distribution", "Distribution", "Observed", "Distribution", "Distribution", "Distribution", "Distribution", "Distribution", "Distribution", "Observed"), "Value" = c(18, 20, 17, 13, 29, 18, 180, 14, 23, 11, 26, 24, 10, 200))
  

Заранее спасибо

Ответ №1:

В ggplot2 вы можете указать разные данные для каждого слоя. Вы можете использовать filter from dplyr для фильтрации ваших данных для каждого слоя. Отфильтруйте распределение в geom_violin слое и добавьте geom_point слой для вашего отдельного наблюдения.

 library(dplyr)
library(ggplot2)
ggplot()   
  geom_violin(data = p %>% filter(Set == "Distribution"), 
              aes(x = Experimental_group, y = Value, fill = Experimental_group))   
  geom_point(data = p %>% filter(Set == "Observed"),
             aes(x = Experimental_group, y = Value, color = Experimental_group), size = 5)
  

введите описание изображения здесь

Ответ №2:

Вы можете попробовать этот подход. Вы можете подмножество вашего фрейма данных p в Distribution и Observed . Затем вы можете комбинировать различные geom_*() элементы, чтобы добавить точки или текст и достичь ожидаемого результата. Этот код помогает достичь результата, подобного тому, что вы хотите:

 library(tidyverse)
#Subset data
p1 <- p %>% filter(Set=='Distribution')
p2 <- p %>% filter(Set!='Distribution') %>% mutate(Label='***')
#Plot
ggplot(p1,aes(x=Experimental_group,y=Value,fill=Experimental_group)) 
  geom_violin() 
  geom_point(data=p2,aes(x=Experimental_group,y=Value,color=Experimental_group)) 
  geom_text(data=p2,aes(x=Experimental_group,y=Value,label=Label),fontface='bold',vjust=-0.25)
  

Вывод:

введите описание изображения здесь

Ответ №3:

Что-то вроде этого должно сработать.

 library(ggplot2)
p1 <- subset(p, Set != "Observed")
p2 <- subset(p, Set == "Observed")

ggplot(p1)  
  aes(x = Experimental_group, y = Value)  
  geom_violin()  
  geom_point(data = p2)