Как изменить интервальный график с двумя наборами данных

В настоящее время я пытаюсь создать карту географического ареала нескольких видов животных в национальном парке Ману, Перу. Я хочу построить ранее наблюдаемый географический диапазон вместе с новыми оценочными диапазонами. Я решил, что лучший способ сделать это — построить интервальный график со средней высотой в виде точки, а затем планками погрешностей, представляющими минимальную и максимальную высоты. Вот следующий код, который я создал:

Предыдущий диапазон высот

solm <-  data.frame(mean = 
               c(1160,690,380,365,375,475,675,2685,675,415,905,
                 1135,3350,400,1460,385, 675, 415,2875), 
                    std.dev = c(760,310,0,15,50,250,300,765,300,35,555,
                             785,0,50,0,15, 325, 65,425),
                    class = c("previous"),
                    group = c("D.marsupialis","D.novemcinctus",
                              "P.maximus","T.tetrodactyla",
                              "C.albifrons","S.ignitus","C. paca",
                              "C. taczanowskii","D.punctata",
                              "A.microtis","P.flavus","E.barbara",
                              "M.frenata","L.pardalis","L.tigrinus",
                              "L.weidii","P.onca", "M.americana",
                              "M.chunyi"))
solm
##Observed Elevation Range
obsm <- data.frame(mean = 
                 c(1290,825,460,930,920,1165,1050,2740,1275,565,1226,
                   1900.5,2742.5,550,2363.5,445, 1050, 550,2750), 
               std.dev = c(890,445,80,580,570,815,700,820,925,185,876,
                           1550.5,814.5,200,1097.5,75, 700, 200,550),
               class = c("observed"),
               group = c("D.marsupialis","D.novemcinctus",
                         "P.maximus","T.tetrodactyla",
                         "C.albifrons","S.ignitus","C. paca",
                         "C. taczanowskii","D.punctata",
                         "A.microtis","P.flavus","E.barbara",
                         "M.frenata","L.pardalis","L.tigrinus",
                         "L.weidii","P.onca", "M.americana",
                         "M.chunyi"))
obsm

##Combo
ggplot()+geom_pointrange(data=obsm, aes(x=group, y=mean, ymax=mean+std.dev, 
                  ymin=mean-std.dev, color="red"))+
  geom_pointrange(data=solm, aes(x=group, y=mean, ymax=mean+std.dev,
                    ymin=mean-std.dev, color="blue"))+
  geom_pointrange(position = position_dodge(width = 0.2))+
 labs(x="Mammal Species", y="Elevation (m)")+ theme_bw() + 
 theme(panel.grid.major = element_blank(),panel.grid.minor = 
      element_blank(),
    panel.border = element_blank())+
 theme (axis.text.x = element_text(angle = 45, hjust = 1, 
                               face="bold.italic"))+
 scale_y_continuous(breaks=c(300, 500, 1000, 1500, 2000, 2500, 
                          3000, 3500, 4000))+
 scale_colour_manual(values=c("red", "blue"))

Это сработало очень хорошо, но ggplot2 накладывает диапазоны друг на друга. Я хотел бы немного пошевелить точки, но все, что я пробовал, не работает. Какие-нибудь мысли?


person D.Lough    schedule 17.02.2017    source источник
comment
Вероятно, вам нужно добавить position = position_jitter() в первый и второй вызов geom_pointrange. Также не уверен, нужен ли вам position_dodge.   -  person thisisrg    schedule 17.02.2017
comment
вам нужно добавить position_jitter(), но не уверен, что это полезно, так как иногда остается синий, иногда красный. так что это ИМО более запутанно.   -  person Roman    schedule 17.02.2017


Ответы (2)


Рекомендуется использовать только один фрейм данных в качестве входных данных ggplot2. Тогда вы можете попробовать

#rbind together
d <- rbind(solm,obsm)
# and the plot
ggplot(d,aes(x=group, y=mean, col=class)) + 
  geom_pointrange(aes(ymin = mean+std.dev, ymax = mean-std.dev), position = position_dodge(0.5))+
  theme (axis.text.x = element_text(angle = 45, hjust = 1, 
                                    face="bold.italic"))

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

person Roman    schedule 17.02.2017
comment
@D.Lough Пожалуйста, примите ответ, нажав кнопку проверки слева. - person Roman; 22.02.2017

Я бы сделал это немного по-другому: сначала создайте кадр данных для построения:

obsm<-cbind(obsm,data=rep("obsm",nrow(obsm)))
solm<-cbind(solm,data=rep("solm",nrow(solm)))
df<-rbind(obsm,solm)

Затем постройте, используя:

ggplot()+geom_pointrange(data=df, aes(x=data, y=mean, ymax=mean+std.dev, ymin=mean-std.dev,col=data))+facet_grid(.~group,scal="free")+scale_colour_manual(values=c("red", "blue"))+theme(axis.text.x= element_blank())+theme(strip.text.x = element_text(size = 14,angle=90,face=c('bold')))

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

person thisisrg    schedule 17.02.2017