2016-01-05 2 views
1

У меня также есть некоторые проблемы с аннотированием текста для отдельных граней в ggplot2 (ссылка на связанный пост: Annotating text on individual facet in ggplot2).Аннотирующий текст для отдельных граней в ggplot2 # 2

кадр данных:

str(cfit_2) 
'data.frame': 186 obs. of 5 variables: 
$ Participant: Factor w/ 31 levels "2","3","4","5",..: 1 2 3 4 5 6 7 8 9 10 ... 
$ Condition : Factor w/ 2 levels "Active control group",..: 1 2 2 2 1 1 2 2 1 1 ... 
$ Time  : Factor w/ 2 levels "Pretest","Posttest": 1 1 1 1 1 1 1 1 1 1 ... 
$ CFIT  : num 10 13 17 11 19 15 19 11 15 16 ... 
$ Version : Factor w/ 3 levels "Total CFIT","CFIT version 1",..: 1 1 1 1 1 1 1 1 1 1 ... 

Код:

p<-ggplot(cfit_2,aes(Time,CFIT,fill=Condition))+ 
    scale_y_continuous(breaks=1:20)+ 
    scale_fill_manual(values=c("white","lightgrey"))+ 
    geom_violin()+ 
    theme_classic()+ 
    coord_cartesian(ylim=c(1, 20),xlim=c(1, 2))+ 
    theme(axis.line=element_blank())+ 
    facet_grid(.~Version)+ylab("CFIT raw score")+ 

    geom_segment(x=.3925,xend=.3925,y=1,yend=20)+ 
    geom_segment(x=1,xend=2,y=.015,yend=.015)+ 

stat_summary(fun.y=mean,geom="point",position=position_dodge(w=.9))+ 
stat_summary(fun.data=mean_cl_boot,geom="errorbar",position=position_dodge(w=.9),width=0)+ 

    geom_segment(data=data.segm_1,aes(x=x,xend=xend,y=y,yend=yend),inherit.aes=FALSE)+ 
    geom_segment(data=data.segm_2,aes(x=x,xend=xend,y=y,yend=yend),inherit.aes=FALSE)+ 
    geom_segment(data=data.segm_3,aes(x=x,xend=xend,y=y,yend=yend),inherit.aes=FALSE)+ 
    geom_segment(data=data.segm_1_2,aes(x=x,xend=xend,y=y,yend=yend),inherit.aes=FALSE)+ 
    geom_segment(data=data.segm_2_2,aes(x=x,xend=xend,y=y,yend=yend),inherit.aes=FALSE)+ 
    geom_segment(data=data.segm_3_2,aes(x=x,xend=xend,y=y,yend=yend),inherit.aes=FALSE) 

Violin plot

То, что я хочу сделать, это добавить "NS" или "*" рядом с каждым сегмент. Используя следующий кадр данных:

ann_text<-data.frame(Time=c("Pretest","Posttest","Pretest","Posttest","Pretest","Posttest"),CFIT=c(8,7,3,2,2,3), 
     lab=c("NS","*","NS","*","NS","*"), 
     Version=factor(c("Total CFIT","Total CFIT","CFIT version 1","CFIT version 1","CFIT version 2","CFIT version 2"), 
       levels=c("Total CFIT","CFIT version 1","CFIT version 2"))) 

ann_text:

Time CFIT lab  Version 
1 Pretest 8 NS  Total CFIT 
2 Posttest 7 *  Total CFIT 
3 Pretest 3 NS CFIT version 1 
4 Posttest 2 * CFIT version 1 
5 Pretest 2 NS CFIT version 2 
6 Posttest 3 * CFIT version 2 

... Я получаю следующий результат из р + geom_text (данные = ann_text, АЕС (метка = лаборатории)):

**Error in eval(expr, envir, enclos) : object 'Condition' not found** 

скользящие АЕС (заполняющая = условие) в geom_violin() дает следующий сюжет:

Violin plot #2

+2

Любая переменная, используемая в глобальной настройке aes, передается всем остальным слоям. Поэтому в этом случае, вероятно, лучше переместить fill = Condition в geom_violin() – Heroka

+0

Спасибо @Heroka! Это работает отлично, но теперь у меня возникают проблемы с stat_summary (fun.data = mean_cl_boot, geom = "errorbar", position = position_dodge (w = .9), width = 0; выше). –

+1

Hm. Я не видел весь ваш код из-за форматирования (и я не могу сделать быстрый выбор, так как ваш q не воспроизводится), но вы можете использовать override.aes.В стороне, вы можете рассмотреть возможность объединения данных для создания всех ваших сегментов, создания более чистого и простого кода. – Heroka

ответ

3

Самый простой способ сказать geom_text не использовать Condition для заливки, установив его в NULL. Таким образом, вы можете сохранить fill в вызове ggplot и применить его ко всем остальным geoms, без необходимости указывать его каждый раз.

Создание данных (так как вы не предоставили какой-либо)

cfit_2 <- data.frame(Time = c('Pretest', 'Posttest'), 
        Condition = rep(c('Active control group', 'Training group'), each = 2), 
        Version = rep(c('Total CFIT', 'CFIT version 1', 'CFIT version 2'), each = 40), 
        CFIT = rnorm(120, 10, 3)) 

Используйте свой черчения код

p<-ggplot(cfit_2,aes(Time,CFIT,fill=Condition))+ 
    #scale_y_continuous(breaks=1:20)+ 
    scale_fill_manual(values=c("white","lightgrey"))+ 
    geom_violin()+ 
    theme_classic()+ 
    #coord_cartesian(ylim=c(1, 20),xlim=c(1, 2))+ 
    theme(axis.line=element_blank())+ 
    facet_grid(.~Version)+ylab("CFIT raw score")+ 

    geom_segment(x=.3925,xend=.3925,y=1,yend=20)+ 
    geom_segment(x=1,xend=2,y=.015,yend=.015)+ 

    stat_summary(fun.y=mean,geom="point",position=position_dodge(w=.9))+ 
    stat_summary(fun.data=mean_cl_boot,geom="errorbar",position=position_dodge(w=.9),width=0) 

(Обратите внимание, что я закомментировать две линии вокруг осей, так как они давали мне я также удалил аннотированные строки, так как вы не предоставили данные для них.)

Добавить текст

p + geom_text(data = ann_text, aes(label = lab, fill = NULL)) 

Результат

enter image description here

Конечно, текст не выглядит, что приятно (это на неправильном уровне у), но это потому, что мои данные различны.

+0

Спасибо @Axeman, который отлично работает с моим, по общему признанию, грязным кодом. –

+0

Да, обычно лучше предоставить минимальный пример, который по-прежнему имеет ту же проблему (т. Е. Удалить все дополнительные биты, такие как вызовы тем и т. Д.). Кроме того, поставляемые (фальшивые) данные всегда хороши! – Axeman

+1

Да, много ненужной информации. Я сожалею о том, что. Очевидно, что я очень новичок в этом (в основном, нет опыта в кодировании, R или стеке). Приятно, чтобы вы это указали. (Кстати, я даже не знаю, как предоставить данные.) –

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