#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)