Используйте geom_segment для построения стрелок для выбранных точек данных на существующем графике.

Я создал график, используя пакет ggplot2 в R, используя следующие данные:

# Ind filt objs        flux  filt    objs err_flux#

01   4590 obj1 1005.448892  4590 errobj1   0.0401  
02   6220 obj1 1420.626789  6220 errobj1   0.0392  
03   7640 obj1 1855.581355  7640 errobj1   0.0432  
 *.......skipped lines...*    
20 21512 obj2  949.642188 21512 errobj2     0.1516    
21  2030 obj2    9.838299  2030 errobj2   **0.0000**  
22  2253 obj2   17.097003  2253 errobj2   **0.0000**  
23  2612 obj2   14.754347  2612 errobj2   **0.0000**  
24  3470 obj2   14.890868  3470 errobj2   **0.0000**  

Я строю график flux и filt с помощью ggplot, а затем добавляю столбцы y-ошибок, как указано в столбце err_flux. Я хотел бы нарисовать стрелки из точек данных, для которых err_flux==0..

Вот моя программа на данный момент:

g <- ggplot(finaldata[1:26, ], aes(x = filt, y = log10(flux), color = objs))
gf1 <- g + geom_point(size = 2, alpha = 0.8, pch = 15) + theme_bw()
gf <- gf1 + geom_errorbar(aes(ymax = log10(flux) + err_flux,
                              ymin = log10(flux) - err_flux),
                           size = 0.5, color = "darkgrey")
gff <-gf + xlab("wavelength") + ylim(0.3,4.5) +
          geom_smooth(method = "loess", se = FALSE)
gfinal <- gff + scale_color_hue(l = 10, c = 75)

Результирующий график показан ниже: введите здесь описание изображения

Вот что я пытался добавить стрелками (например, 4 крайние левые точки для «obj2» на графике, показанном выше, но это не работает:

for (i in 1:nrow(finaldata)) {
 if (finaldata$err_flux==0.){
   gfinal<-gfinal + geom_segment(x=finaldata$filt[i], y=finaldata$flux[i], xend=finaldata$filt[i], yend=finaldata$flux[i]-0.5,arrow=arrow(length=unit(0.25,"cm")))
  }
 }

Более того, если я применю 'geom_segment' к подмножеству моих фактических данных, он не будет добавлен к моему существующему графику (gfinal) из-за разных размеров.

Любые предложения/помощь будут оценены.


person Phyast10    schedule 12.10.2015    source источник
comment
Используйте annotate и не используйте цикл for. Подставьте данные к тому, что вы хотите аннотировать, и используйте аргумент data.   -  person Gregor Thomas    schedule 13.10.2015
comment
@Грегор: Я впервые пытаюсь работать с R для построения графиков, вот что я пробовал: sub<-subset(finaldata[1:26,],finaldata$err_flux==0.) gfinal+annotate(sub,x=sub$filt,xend=sub$filt,y=sub$flux,yend=sub$flux-0.5,color="red")   -  person Phyast10    schedule 13.10.2015
comment
неважно ! Мне нужно было определить это следующим образом: annotate("segment",x=sub$filt,xend=sub$filt,y=log10(sub$flux),yend=log10(sub$flux)-0.5,color="red")   -  person Phyast10    schedule 13.10.2015
comment
Если вы хотите, ответ на ваш собственный вопрос поощряется, когда вы работаете над решением самостоятельно.   -  person Gregor Thomas    schedule 13.10.2015


Ответы (1)


Функция Annotate помогла мне нарисовать направленные вниз стрелки (верхние границы) из выбранных точек данных.

Я заменяю последнюю часть моей программы, в которой использовались циклы for и if, с geom_segment на annotate следующим образом:

sub<-subset(finaldata[1:26,],finaldata[1:26,]$err_flux==0.)
gfinal+annotate("segment",x=sub$filt,xend=sub$filt,y=log10(sub$flux),yend=log10(sub$flux)-0.25,color="red",arrow = arrow(length = unit(0.2, "cm")))

что привело к следующему рисунку: Посмотрите на 4 стрелки ‹code›красные‹/code› на 4 крайних левых точках данных для obj2

person Phyast10    schedule 13.10.2015