2013-11-13 1 views
1

Предположим, мы наблюдали два вида жуков. Мы хотим, чтобы сравнить их размер с помощью geom_violin(), как это сделано ниже:ggplot: Добавить теоретический диапазон на geom_violin()

df = data.frame(species=rep(c('species_a','species_b'),3), size=c(1,1.5,1.2,1.8,1.1,1.9)) 
ggplot(df, aes(x=species, y=size)) + geom_violin() 

Зная, что ожидаемый диапазон размеров [0.8,1.8] для species_a и [1,2, 1,8] для species_b ...

ranges = list(species_a=c(0.8,1.8), species_b=c(1.2,1.8)) 

Как мы можем легко добавить этот диапазон (например, с серой фигурой) на график?

ответ

4

диапазоны Введена в отдельном кадре данных с названиями видов и минимальных/максимальных значений

ranges = data.frame(species=c('species_a','species_b'), 
        rmin=c(0.8,1.2),rmax=c(1.2,1.8)) 
ranges 

    species rmin rmax 
1 species_a 0.8 1.8 
2 species_b 1.2 1.8 

Затем используйте новый кадр данных для geom_rect(), чтобы сделать область, которая помещается под geom_violin(). geom_blank() используется для создания оси x в соответствии с исходным фреймом данных.

ggplot(df, aes(x=species, y=size)) + geom_blank() + 
    geom_rect(data=ranges,aes(xmin=as.numeric(species)-0.45, 
          xmax=as.numeric(species)+0.45, 
          ymin=rmin,ymax=rmax),inherit.aes=FALSE)+ 
    geom_violin() 

enter image description here

0

Вы можете попробовать это:

# first, create data frame from list 'ranges' 
df2 <- setNames(object = do.call(rbind.data.frame, ranges), nm = c("min_size", "max_size")) 
df2$species <- rownames(df2) 

# plot violins with 'df', and ranges with 'df2'. 
# Set colour and size according to your own "data-ink ratio" preferences. 
ggplot(data = df, aes(x = species)) + 
    geom_violin(aes(y = size)) + 
    geom_linerange(data = df2, aes(ymax = max_size, ymin = min_size), colour = "grey", size = 3) 

enter image description here

Смежные вопросы