2012-04-02 10 views
8

एक बहुत ही सरल उदाहरण लें, mfrow=c(1,3); प्रत्येक आकृति एक अलग हिस्टोग्राम है; मैं एक क्षैतिज रेखा कैसे खींचूंगा (abline(h=10) के समान) जो पर सभी 3 आंकड़े गए? (यानी, उनके बीच मार्जिन भी है।) जाहिर है, मैं प्रत्येक आकृति में एक अपरिपक्व जोड़ सकता हूं, लेकिन यह वही नहीं है जो मैं चाहता हूं। मैं वास्तव में द्वारा polygon आदि का उपयोग करके प्रत्येक 'आकृति' को चित्रित करने के लिए एक बहुत ही जटिल तरीका के बारे में सोच सकता हूं। यह हास्यास्पद होगा। क्या ऐसा करने का कोई आसान तरीका नहीं है?आप आर में एक बहु-आंकड़े वातावरण में एक रेखा कैसे आकर्षित करते हैं?

उत्तर

13

@joran के रूप में बताया गया है, ग्रिड चित्रमय प्रणाली और अधिक लचीला प्रदान करता है एक ही डिवाइस पर एकाधिक भूखंडों की व्यवस्था पर नियंत्रण।

यहाँ, मैं पहले grconvertY() का उपयोग "सामान्यीकृत डिवाइस निर्देशांक" की इकाइयों में 50 y- अक्ष पर की ऊंचाई के स्थान क्वेरी करने के लिए। (यानी 0 = नीचे, और 1 = शीर्ष के साथ, प्लॉटिंग डिवाइस की कुल ऊंचाई के अनुपात के रूप में)। मैं फिर ग्रिड फ़ंक्शंस का उपयोग करता हूं: (1) viewport दबाएं जो डिवाइस को भरता है; और (2) grconvertY() द्वारा लौटाई गई ऊंचाई पर एक रेखा प्लॉट करें।

## Create three example plots 
par(mfrow=c(1,3)) 
barplot(VADeaths, border = "dark blue") 
barplot(VADeaths, border = "yellow") 
barplot(VADeaths, border = "green") 

## From third plot, get the "normalized device coordinates" of 
## a point at a height of 50 on the y-axis. 
(Y <- grconvertY(50, "user", "ndc")) 
# [1] 0.314248 

## Add the horizontal line using grid 
library(grid) 
pushViewport(viewport()) 
grid.lines(x = c(0,1), y = Y, gp = gpar(col = "red")) 
popViewport() 

enter image description here

संपादित: @joran एक लाइन है कि 3 साजिश में पिछले बार के किनारे करने के लिए 1 भूखंड के y- अक्ष से फैली प्लॉट करने के लिए कैसे पूछा।

library(grid) 
library(gridBase) 
par(mfrow=c(1,3)) 

# barplot #1 
barplot(VADeaths, border = "dark blue") 
X1 <- grconvertX(0, "user", "ndc") 
# barplot #2 
barplot(VADeaths, border = "yellow") 
# barplot #3 
m <- barplot(VADeaths, border = "green") 
X2 <- grconvertX(tail(m, 1) + 0.5, "user", "ndc") # default width of bars = 1 
Y <- grconvertY(50, "user", "ndc") 

## Horizontal line 
pushViewport(viewport()) 
grid.lines(x = c(X1, X2), y = Y, gp = gpar(col = "red")) 
popViewport() 

enter image description here

अंत में, यहाँ एक लगभग बराबर है, और अधिक आम तौर पर उपयोगी तरीका है: यहाँ विकल्प के एक जोड़े हैं।आपकी मदद के लिए

library(grid) 
library(gridBase) 
par(mfrow=c(1,3)) 

barplot(VADeaths); vps1 <- do.call(vpStack, baseViewports()) 
barplot(VADeaths) 
barplot(VADeaths); vps3 <- do.call(vpStack, baseViewports()) 

pushViewport(vps1) 
Y <- convertY(unit(50,"native"), "npc") 
popViewport(3) 

grid.move.to(x = unit(0, "npc"), y = Y, vp = vps1) 
grid.line.to(x = unit(1, "npc"), y = Y, vp = vps3, 
      gp = gpar(col = "red")) 
+0

+1 अच्छा! क्या आप इकाइयों/समन्वय/क्लिपिंग को मालिश करने के तरीके के बारे में जानते हैं, जैसे कि रेखा बाएं अधिकांश वाई धुरी से हरी बार के दाएं किनारे तक फैली हुई है? – joran

+0

मेरे पास एक विचार है, और अगर यह काम करता है तो मैं इसे जोड़ दूंगा। अभी, मैं सूरज सेट से पहले लॉन को उड़ाने के लिए बंद हूं ... –

+0

धन्यवाद, यह वास्तव में सहायक है! मैं अपने खाते पर लॉन-मowing को रोकने की आपकी इच्छा की सराहना करता हूं ;-) – gung

6

यह सबसे अच्छा मैं इसके बारे में कठिन बिना सोचे क्या कर सकते हैं:

par(mfrow = c(1,3),xpd = NA) 

for (i in 1:3){ 
    x <- rnorm(200,i) 
    hist(x) 
    if (i == 1) segments(par("usr")[1],10,30,10) 
} 

enter image description here

मुझे यकीन है कि नहीं यकीन है कि लाइन संवारता बिना सही जगह पर समाप्त होता है कैसे बनाने के लिए कर रहा हूँ। प्रत्येक क्षेत्र में एक सेगमेंट प्लॉट करने से यह हल हो जाएगा, लेकिन ऊंचाइयों को ठीक से लाइन करने का मुद्दा पेश करें। लेकिन यह कम से कम एक अच्छा प्रारंभिक बिंदु हो सकता है।

मुझे लगता है कि यह ग्रिड ग्राफिक्स में आसान है, लेकिन मुझे सत्यापित करने के लिए कुछ शोध करना होगा।

+0

धन्यवाद: यह काम करता है grid.move.to() और grid.line.to() लेख @ mdsumner के जवाब में से जुड़ा हुआ में पॉल मुरेल द्वारा demo'd कार्यरत हैं। – gung

4

पॉल मुरेल द्वारा इस लेख से पता चलता दो अलग समन्वय प्रणालियों के बीच लाइनों आकर्षित करने के लिए grid ग्राफिक्स का उपयोग इस मामले लाइनों अंत अंक दो अलग-अलग उप भूखंडों के मूल स्थान में निर्दिष्ट है कि में,:

पॉल मुरेल । ग्रिड ग्राफिक्स पैकेज। आर समाचार, 2 (2): 14-19, जून 2002

यह पीडीएफ लेख के पेज 17 पर है:

http://cran.r-project.org/doc/Rnews/Rnews_2002-2.pdf

+0

धन्यवाद, मैं लेख पढ़ रहा हूं। – gung

+0

हाँ, उस महान लिंक के लिए धन्यवाद। मैंने अभी अपने जवाब में एक तीसरा कोड ब्लॉक जोड़ा है, जो मुरेल के लेख में प्रदर्शित कुछ कार्यों ('grid.move.to()' और 'grid.line.to()') का उपयोग करता है। –

संबंधित मुद्दे

 संबंधित मुद्दे