2015-04-06 15 views
27

Ggplot2'deki oklarla bir arsa oluşturmaya çalışıyorum, böyle bir şeye benzemekteyim ki bu taban R grapics kullanılarak yapıldı.ggplot2'de okların görünümü geom_segment()

library(ggplot2) 
library(scales) 
library(grid) 


df3 <- structure(list(value1 = c(51L, 57L, 59L, 57L, 56L, 56L, 60L, 
66L, 61L, 61L), value2 = c(56L, 60L, 66L, 61L, 61L, 59L, 61L, 
66L, 63L, 63L), group = c("A", "B", "C", "D", "E", "A", "B", 
"C", "D", "E"), time = c("1999", "1999", "1999", "1999", "1999", 
"2004", "2004", "2004", "2004", "2004"), y_position = c(1L, 2L, 
3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L)), .Names = c("value1", "value2", 
"group", "time", "y_position"), row.names = c(NA, -10L), class = "data.frame") 




ggplot(df3, aes(x = value1, y = y_position, group = time, color = time)) + 

geom_segment(x = min(df3$value1, df3$value2), xend = max(df3$value1, df3$value2), 
       aes(yend = y_position), color = "lightgrey", size = 19) + 


scale_y_continuous( labels = df3$group, breaks = df3$y_position) + 

theme_classic() + theme(axis.line = element_blank(), axis.title = element_blank() ) + 

geom_segment(aes(yend = y_position, xend = value2, color = time, group = time), size = 19, alpha = 0.9, 

       arrow = arrow(length = unit(40, "points"),type = "closed", angle = 40) ) 

Ben bu olsun: ggplot2 kullanma

enter image description here

(renkler önemli değildir)

sorun okları ki (yanlış bakmak olmasıdır

enter image description here

onlar ilk arsa gibi görünmüyor). Geom_segment() kullanmak önemli değildir.

Bu soru cevabını verebilir ama az hacky bir şey umuyordum: Specifying gpar settings for grid arrows in R

cevap

17

güncelleme: arsa geçerli pencerede ise ggplot2 v2.1.0.9001

sen şeklini düzenleyebilirsiniz arsa mevcut pencerede ise

grid.force() 
# change shape of arrows 
grid.gedit("segments", gp=gpar(linejoin ='mitre')) 
# change the shape in legend also 
grid.gedit("layout", gp=gpar(linejoin ='mitre')) 

doğrudan ok doğrudan okun şeklini düzenleyebilir

grid.gedit("segments", gp=gpar(linejoin ='mitre')) 

ggplot ile ly şimdi bir ok şekline efsane anahtarı değişmiş gibi görünüyor, bu nedenle de bu şeklini değiştirmek istiyorsanız,

grid.gedit("gTableParent", gp=gpar(linejoin ='mitre')) 
tam arsa üzerinde yapabilirsiniz

orijinal cevap

az hacky, ama belki daha kolay değil ?? ggplotGrob tarafından döndürülen kurbağaları düzenleyebilirsiniz.

g <- ggplotGrob(p) 

idx <- grep("panel", g$layout$name) 

nms <- sapply(g$grobs[[idx]]$children[[3]]$children , '[[', "name") 

for(i in nms) { 
    g$grobs[[idx]]$children[[3]] <- 
       editGrob(g$grobs[[idx]]$children[[3]], nms[i], 
         gp=gpar(linejoin ='mitre'), grep=TRUE) 
} 

grid.newpage() 
grid.draw(g) 

enter image description here

+0

İkinci oku, ilk olanın bittiği yerde otomatik olarak başlayabilir mi, yoksa bir şekilde bunu elle yapmak zorunda mıyım? –

+0

Bunun kolayca Rasmus yapılabileceğini sanmıyorum. Okun sonunun gerçek xend konumunun ötesine geçtiğini fark ederseniz, ancak (yerel ölçekte) ne kadar uzakta öbek genişliğine bağlıdır. Öyleyse ikinci ok için başlangıç ​​pozisyonunu belirlemek zor olurdu (eğer birisi nasıl olduğunu gösterebilirse harika olurdu). Belki de, ikinci oku birinci /? – user20650

+0

@ user20650 Maalesef çok güzel bir cevabınız artık ggplot 2.2.0'da çalışmıyor gibi görünüyor. Cevabınızı güncellemek için herhangi bir zamanınız ve imkanınız varsa, çok takdir edilecektir. Şimdiden teşekkürler. – Henrik

5

meydan sizegeom_segment blokta çağrılır ise ızgara paketinden ok yapıcı berbat olur o gibi görünüyor: p Eğer

sizin komplodur. Göstermek olarak

yüzden

p <- ggplot(df3) + coord_flip() 

p1 <- p + geom_bar(aes(x=group,y=max(c(value1,value2))*1.1),width=0.2, stat="identity",position="identity",alpha=0.2) 

df1<-filter(df3,time=="1999") 

p1 + geom_segment(data=df1,aes(x=group,xend=group,y=value1,yend=value2),color="blue",size=8,arrow=arrow(angle=20,type="closed",ends="last",length=unit(1,"cm"))) 

saçma görünüyor.

p2<-p1 + geom_segment(data=df1,aes(x=group,xend=group,y=value1,yend=value2), color="blue",arrow=arrow(angle=20,type="closed",ends="last",length=unit(1,"cm"))) 

p2 + geom_segment(data=df1,aes(x=group,xend=group,y=value1,yend=value2), color="blue",size=8) 

ama şimdi yağ parçası ucu şevli değildir ve bu nedenle ok gizler: Sadece bir yağ segmentine segmenti ayırma arasında geçici ve bu gibi zayıf kesimi üzerinde bir ok (iki kat) denedik.

arrow parametresinin düzeltilmesi gerekli gibi görünüyor.

İlgili konular