2015-04-06 6 views
27

में तीरों की खोज मैं ggplot2 में तीरों के साथ एक साजिश बनाने की कोशिश कर रहा हूं, जो कुछ ऐसा दिख रहा है, जिसे बेस आर ग्रैपिक्स का उपयोग करके बनाया गया था। (रंग महत्वपूर्ण नहीं हैं)ggplot2 geom_segment()

enter image description here

ggplot2 का उपयोग करना:

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) ) 

मैं इस मिल:

enter image description here

समस्या यह है कि तीर (गलत लग रही है कि में है वे पहली साजिश की तरह मत दिखो)। Geom_segment() का प्रयोग करना महत्वपूर्ण नहीं है।

इस सवाल का जवाब दे सकता है, लेकिन मैं कुछ कम hacky के लिए उम्मीद की गई थी: Specifying gpar settings for grid arrows in R

उत्तर

17

अद्यतन: ggplot2 v2.1.0.9001

साजिश आपकी वर्तमान विंडो में है, तो आप आकार संपादित कर सकते हैं

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')) 

साथ तीर सीधे की साजिश आपकी वर्तमान विंडो में है, तो आप सीधे तीर के आकार संपादित कर सकते हैं साथ

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

ggplot ly अब एक तीर आकार के कथा कुंजी को बदल दिया है लगता है, तो आप इन का आकार बदलने के साथ ही चाहते हैं तो आपको

grid.gedit("gTableParent", gp=gpar(linejoin ='mitre')) 
के साथ पूर्ण साजिश भर में ऐसा कर सकते हैं

मूल जवाब

कम hacky नहीं, लेकिन शायद आसान ?? आप ggplotGrob द्वारा लौटे गए ग्रब्स को संपादित कर सकते हैं।

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

क्या दूसरा तीर शुरू करना संभव है जहां पहला वाला, स्वचालित रूप से समाप्त होता है, या मुझे मैन्युअल रूप से ऐसा करना पड़ता है? –

+0

मुझे नहीं लगता कि यह आसानी से रasmस किया जा सकता है। यदि आप देखते हैं कि तीर का अंत वास्तविक xend स्थिति से परे चला जाता है, लेकिन साजिश की चौड़ाई पर कितनी दूर (मूल पैमाने पर) निर्भर करता है। इसलिए दूसरे तीर के लिए प्रारंभ स्थिति निर्दिष्ट करना मुश्किल होगा (अगर कोई दिखा सकता है तो अच्छा होगा)। शायद, एक त्वरित फिक्स स्तर को उलटना होगा ताकि दूसरा तीर पहले/के नीचे हो? – user20650

+0

@ user20650 दुर्भाग्य से ऐसा लगता है कि आपका बहुत अच्छा जवाब अब 'ggplot 2.2.0' में काम नहीं करता है। यदि आपके पास अपना उत्तर अपडेट करने का कोई समय और संभावना है, तो इसकी अत्यधिक सराहना की जाएगी। अग्रिम में धन्यवाद। – Henrik

5

चुनौती है कि ग्रिड पैकेज से तीर निर्माता में गड़बड़ हो जाता है sizegeom_segment ब्लॉक में शुरू हो जाती है लगता है:

तो p अपने भूखंड है।

तो

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"))) 

के रूप में आपको बताएंगे कि हास्यास्पद लग रहा है।

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) 

लेकिन अब वसा खंड अंत mitred नहीं है और इतने तीर को धुंधला: मैं बस एक वसा खंड में खंड को अलग करने का का वैकल्पिक हल और इतने की तरह एक पतला खंड पर एक तीर (दो परतों) की कोशिश की।

arrow पैरामीटर को ठीक करने की आवश्यकता है।