आधार ग्राफिक्स में प्लॉटिंग क्षेत्र के बाहर एक किंवदंती प्लॉट करें?


185

जैसा कि शीर्षक कहता है: आधार ग्राफिक्स का उपयोग करते समय मैं प्लॉटिंग क्षेत्र के बाहर एक किंवदंती की साजिश कैसे कर सकता हूं?

मैंने सोचा था कि layoutकेवल कथा को समाहित करने के लिए एक खाली भूखंड के साथ आसपास घूमने और उत्पादन करने के बारे में सोचा गया था , लेकिन मुझे बस आधार ग्राफ सुविधाओं का उपयोग करने के तरीके में दिलचस्पी होगी और उदाहरण के par(mar = )लिए, किंवदंती के लिए भूखंड के दाईं ओर कुछ स्थान प्राप्त करने के लिए।


यहाँ एक उदाहरण है:

plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2))
lines(1:3, rnorm(3), pch = 2, lty = 2, type="o")
legend(1,-1,c("group A", "group B"), pch = c(1,2), lty = c(1,2))

पैदा करता है:

वैकल्पिक शब्द

लेकिन जैसा कि कहा गया है, मैं यह चाहूंगा कि किंवदंती प्लॉटिंग क्षेत्र (उदाहरण के लिए, ग्राफ / प्लॉट के दाईं ओर) के बाहर हो।


... आप किंवदंती के लिए डमी कंटेनर के साथ बराबर हैक कर सकते हैं, आसान और काफी सुविधाजनक समय-समय पर। इसी तरह का सवाल यहाँ
hhh

3
@hhh लिंक अब काम नहीं कर रहा है। क्या आप इसे अपडेट कर सकते हैं या इस दृष्टिकोण का उपयोग करके उत्तर पोस्ट कर सकते हैं?
हेनरिक

जवाबों:


111

हो सकता है कि आपको par(xpd=TRUE)प्लॉट क्षेत्र के बाहर की चीजों को खींचने में सक्षम बनाने की आवश्यकता हो। इसलिए यदि आप मुख्य साजिश करते हैं bty='L'तो आपके पास एक किंवदंती के लिए दाईं ओर कुछ स्थान होगा। आम तौर पर यह प्लॉट क्षेत्र से जुड़ा हुआ होता है, लेकिन ऐसा करें par(xpd=TRUE)और थोड़े से समायोजन के साथ आप एक किंवदंती प्राप्त कर सकते हैं जहाँ तक आप यह कर सकते हैं:

 set.seed(1) # just to get the same random numbers
 par(xpd=FALSE) # this is usually the default

 plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2), bty='L')
 # this legend gets clipped:
 legend(2.8,0,c("group A", "group B"), pch = c(1,2), lty = c(1,2))

 # so turn off clipping:
 par(xpd=TRUE)
 legend(2.8,-1,c("group A", "group B"), pch = c(1,2), lty = c(1,2))

33
ध्यान दें कि आप xpd को सीधे किंवदंती में पास कर सकते हैं ताकि आपको बाद में बराबर रीसेट करने के बारे में चिंता करने की आवश्यकता न हो। इसके अलावा, एक प्रकार से लीजेंड के स्थान को निर्दिष्ट करने के तरीके के लिए grconvertX & Y देखें, जिस डेटा की आप साजिश कर रहे हैं, उसकी सीमा पर निर्भर नहीं है।
चार्ल्स

6
जैसा कि यह सवाल और जवाब अभी भी बहुत लोकप्रिय है, par(xpd=NA)और भी अधिक शक्तिशाली है (यानी, अधिक क्षेत्रों के लिए भूखंड)।
हेनरिक

+1। हमें यह उल्लेख करना चाहिए कि यह parकिंवदंती से ठीक पहले एक अलग कॉल करने के लिए समझ में आता है । अपने प्लॉट में, मैंने par(new=T)कई अन्य अवसरों पर उपयोग किया और बस xpdउसी कॉल में परम को जोड़ना चाहता था , जिससे परेशानी होती है।
मैट बैनर्ट

146

किसी ने भी नकारात्मक insetमूल्यों का उपयोग करने का उल्लेख नहीं किया है legend। यहां एक उदाहरण है, जहां किंवदंती भूखंड के दाईं ओर है, शीर्ष (कीवर्ड का उपयोग करके "topright") से जुड़ा हुआ है ।

# Random data to plot:
A <- data.frame(x=rnorm(100, 20, 2), y=rnorm(100, 20, 2))
B <- data.frame(x=rnorm(100, 21, 1), y=rnorm(100, 21, 1))

# Add extra space to right of plot area; change clipping to figure
par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE)

# Plot both groups
plot(y ~ x, A, ylim=range(c(A$y, B$y)), xlim=range(c(A$x, B$x)), pch=1,
               main="Scatter plot of two groups")
points(y ~ x, B, pch=3)

# Add legend to top right, outside plot region
legend("topright", inset=c(-0.2,0), legend=c("A","B"), pch=c(1,3), title="Group")

inset=c(-0.2,0)किंवदंती की चौड़ाई के आधार पर पहले मूल्य को समायोजित करने की आवश्यकता हो सकती है।

legend_right


14
@ हेनरिक नहीं यह xpd = TRUE के बिना काम नहीं करता है। यह भी ध्यान दें कि किंवदंती () फ़ंक्शन के तर्क के रूप में xpd = TRUE सेट करना बेहतर है।
स्टीफन लॉरेंट

1
कभी-कभी xpdकाम करने TRUEके लिए नकारात्मक इनसेट के लिए सेट होना चाहिए । लेकिन कभी-कभी नहीं। कमांड के साथ args.legend=list(x="bottom", horiz=TRUE, inset=-0.2)इसकी barplot(...जरूरत नहीं लगती, xpd=TRUEलेकिन इसके साथ ही legend(x="bottom", horiz=TRUE, inset=-0.2)इसकी जरूरत भी लगती है xpd=TRUE। कोई अंतर्दृष्टि? मैं सिर्फ अपने तर्कों को पारित करने में भ्रमित हूं?
user3386170

28

एक अन्य समाधान, ondes के अलावा पहले ही उल्लेख किया (का उपयोग कर layoutया par(xpd=TRUE)) है पूरे डिवाइस पर एक पारदर्शी साजिश के साथ अपने भूखंड ओवरले करने के लिए और फिर उस के लिए कथा जोड़ें।

चाल पूरी साजिश रचने वाले क्षेत्र पर (खाली) ग्राफ को ओवरले करने के लिए और उस के लिए किंवदंती को जोड़ना है। हम par(fig=...)विकल्प का उपयोग कर सकते हैं । पहले हम आर को निर्देश देते हैं कि पूरे प्लॉटिंग डिवाइस पर एक नया प्लॉट बनाएं:

par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE)

सेटिंग omaऔर marजरूरत है क्योंकि हम चाहते हैं कि प्लॉट का इंटीरियर पूरे डिवाइस को कवर करे। new=TRUEआर को एक नया उपकरण शुरू करने से रोकने के लिए आवश्यक है। हम फिर खाली प्लॉट जोड़ सकते हैं:

plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')

और हम किंवदंती जोड़ने के लिए तैयार हैं:

legend("bottomright", ...)

डिवाइस के नीचे दाईं ओर एक किंवदंती जोड़ देगा। इसी तरह, हम लीजेंड को टॉप या राइट मार्जिन से जोड़ सकते हैं। केवल यह सुनिश्चित करने की आवश्यकता है कि मूल प्लाट का मार्जिन किंवदंती को समायोजित करने के लिए पर्याप्त है।

एक समारोह में यह सब डाल;

add_legend <- function(...) {
  opar <- par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), 
    mar=c(0, 0, 0, 0), new=TRUE)
  on.exit(par(opar))
  plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')
  legend(...)
}

और एक उदाहरण है। सबसे पहले यह सुनिश्चित करें कि किंवदंती को जोड़ने के लिए हमारे पास पर्याप्त स्थान है जो नीचे की तरफ है:

par(mar = c(5, 4, 1.4, 0.2))
plot(rnorm(50), rnorm(50), col=c("steelblue", "indianred"), pch=20)

फिर किंवदंती जोड़ें

add_legend("topright", legend=c("Foo", "Bar"), pch=20, 
   col=c("steelblue", "indianred"),
   horiz=TRUE, bty='n', cex=0.8)

जिसके परिणामस्वरूप:

उदाहरण आंकड़ा शीर्ष मार्जिन में किंवदंती दिखाया


2
यहाँ सूची के अलावा महान। यहाँ ग्राफिक में कई भूखंडों के साथ यह काम कैसे करें, इसके बारे में एक स्पष्टीकरण है
शिरि

जनवरी, क्या किंवदंती में फॉन्ट का आकार बढ़ाने का कोई तरीका है, बिना किसी पाठ को क्लिप किए? उदाहरण के लिए, मेरे पास एक ग्राफिक 4 विभिन्न प्रकार के लेबल हैं, लेकिन उनके बीच बहुत सारी खाली जगह है।
समुद्र में एक बूढ़ा आदमी।


16

एक पुराने धागे को फिर से जीवित करने के लिए क्षमा करें, लेकिन मैं आज भी उसी समस्या के साथ था। सबसे सरल तरीका जो मैंने पाया है वह निम्नलिखित है:

# Expand right side of clipping rect to make room for the legend
par(xpd=T, mar=par()$mar+c(0,0,0,6))

# Plot graph normally
plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2))
lines(1:3, rnorm(3), pch = 2, lty = 2, type="o")

# Plot legend where you want
legend(3.2,1,c("group A", "group B"), pch = c(1,2), lty = c(1,2))

# Restore default clipping rect
par(mar=c(5, 4, 4, 2) + 0.1)

यहां मिला: http://www.harding.edu/fmccown/R/


4
इससे भी बेहतर पुराना है <- बराबर (xpd = T, mar = par () $ mar + c (0,0,0,6)) ... par (oldpar) (बराबर की मदद देखें)
rakensi

यह समाधान बेहतर है क्योंकि किंवदंती के लिए स्थान तय हो गया है कि किंवदंती के तारों की लंबाई से कोई फर्क नहीं पड़ता
सर्जियो

15

मैं इसे इस तरह करना पसंद करता हूं:

par(oma=c(0, 0, 0, 5))
plot(1:3, rnorm(3), pch=1, lty=1, type="o", ylim=c(-2,2))
lines(1:3, rnorm(3), pch=2, lty=2, type="o")
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,
       c("group A", "group B"), pch=c(1, 2), lty=c(1,2))

यहां छवि विवरण दर्ज करें

एकमात्र ट्विकिंग की आवश्यकता है कि किंवदंती को समायोजित करने के लिए सही मार्जिन पर्याप्त चौड़ा हो।

हालाँकि, यह स्वचालित भी हो सकता है:

dev.off() # to reset the graphics pars to defaults
par(mar=c(par('mar')[1:3], 0)) # optional, removes extraneous right inner margin space
plot.new()
l <- legend(0, 0, bty='n', c("group A", "group B"), 
            plot=FALSE, pch=c(1, 2), lty=c(1, 2))
# calculate right margin width in ndc
w <- grconvertX(l$rect$w, to='ndc') - grconvertX(0, to='ndc')
par(omd=c(0, 1-w, 0, 1))
plot(1:3, rnorm(3), pch=1, lty=1, type="o", ylim=c(-2, 2))
lines(1:3, rnorm(3), pch=2, lty=2, type="o")
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,
       c("group A", "group B"), pch=c(1, 2), lty=c(1, 2))

यहां छवि विवरण दर्ज करें


Xpd = T या xpd = NA का उपयोग करने से मेरे 'मुख्य' (शीर्षक) को उस समय क्लिप होने से नहीं रोका जा सकता जब इसे विस्तृत दाएँ मार्जिन के साथ जोड़े गए क्षेत्र का उपयोग करने का प्रयास करने के लिए बढ़ाया जाता है।
फिल गोएट्ज

@PhilGoetz क्या आप सुनिश्चित हैं कि आप प्लॉट क्षेत्र में मुख्य साजिश कर रहे हैं? क्या यह संभव है कि आपके पास वहां प्लॉट करने के लिए मार्जिन की पर्याप्त लाइनें न हों?
3

10

हाल ही में मुझे प्लॉट क्षेत्र के बाहर किंवदंती को प्रिंट करने के लिए बहुत आसान और दिलचस्प फ़ंक्शन मिला जहां आप चाहते हैं।

भूखंड के दाईं ओर बाहरी मार्जिन बनाएं।

par(xpd=T, mar=par()$mar+c(0,0,0,5))

एक प्लॉट बनाएं

plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2))
lines(1:3, rnorm(3), pch = 2, lty = 2, type="o")

किंवदंती जोड़ें और नीचे दिए अनुसार बस लोकेटर (1) फ़ंक्शन का उपयोग करें। फिर आपको बस उस स्क्रिप्ट पर क्लिक करना होगा जहां आप स्क्रिप्ट के बाद लोड करना चाहते हैं।

legend(locator(1),c("group A", "group B"), pch = c(1,2), lty = c(1,2))

कोशिश करो


9

मैं पहले से ही बताए गए लेआउट समाधान का केवल एक उदाहरण प्रस्तुत कर सकता हूं।

layout(matrix(c(1,2), nrow = 1), widths = c(0.7, 0.3))
par(mar = c(5, 4, 4, 2) + 0.1)
plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2))
lines(1:3, rnorm(3), pch = 2, lty = 2, type="o")
par(mar = c(5, 0, 4, 2) + 0.1)
plot(1:3, rnorm(3), pch = 1, lty = 1, ylim=c(-2,2), type = "n", axes = FALSE, ann = FALSE)
legend(1, 1, c("group A", "group B"), pch = c(1,2), lty = c(1,2))

एक बदसूरत तस्वीर: एस


9

एक और सरल विकल्प जोड़ना जो मेरी राय में काफी सुरुचिपूर्ण है।

आपका प्लॉट:

plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2))
lines(1:3, rnorm(3), pch = 2, lty = 2, type="o")

लीजेंड:

legend("bottomright", c("group A", "group B"), pch=c(1,2), lty=c(1,2),
       inset=c(0,1), xpd=TRUE, horiz=TRUE, bty="n"
       )

परिणाम:

किंवदंती के साथ चित्र

यहाँ किंवदंती की केवल दूसरी पंक्ति आपके उदाहरण में जोड़ी गई थी। के बदले में:

  • inset=c(0,1)- (x, y) दिशाओं में भूखंड क्षेत्र के अंश से किंवदंती को स्थानांतरित करता है। इस मामले में किंवदंती "bottomright"स्थिति में है। इसे x दिशा में 0 प्लॉटिंग क्षेत्रों द्वारा स्थानांतरित किया जाता है (इसलिए "सही" पर रहता है) और y दिशा में 1 प्लॉटिंग क्षेत्र से (नीचे से ऊपर तक)। और ऐसा होता है कि यह भूखंड के ठीक ऊपर दिखाई देता है।
  • xpd=TRUE - चलो किंवदंती भूखंड क्षेत्र के बाहर दिखाई देते हैं।
  • horiz=TRUE - एक क्षैतिज किंवदंती का उत्पादन करने का निर्देश।
  • bty="n" - किंवदंती बाउंडिंग बॉक्स से छुटकारा पाने के लिए एक शैली विस्तार।

किंवदंती को जोड़ने पर समान लागू होता है:

par(mar=c(5,4,2,6))
plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2))
lines(1:3, rnorm(3), pch = 2, lty = 2, type="o")

legend("topleft", c("group A", "group B"), pch=c(1,2), lty=c(1,2),
       inset=c(1,0), xpd=TRUE, bty="n"
       )

यहां हमने बस किंवदंती पदों को समायोजित किया और भूखंड के दाईं ओर अतिरिक्त मार्जिन स्थान जोड़ा। परिणाम:

चित्र 2 किंवदंती के साथ


4

आप प्लॉटली आर एपीआई के साथ या तो कोड के साथ, या जीयूआई से लीजेंड को खींचकर ऐसा कर सकते हैं, जहां आप इसे चाहते हैं।

यहाँ एक उदाहरण है। ग्राफ और कोड भी यहाँ हैं

x = c(0,1,2,3,4,5,6,7,8) 
y = c(0,3,6,4,5,2,3,5,4) 
x2 = c(0,1,2,3,4,5,6,7,8) 
y2 = c(0,4,7,8,3,6,3,3,4)

आप x और y मानों में से किसी एक को 100 या -100 पर निर्दिष्ट करके ग्राफ के बाहर की स्थिति को बता सकते हैं।

legendstyle = list("x"=100, "y"=1)
layoutstyle = list(legend=legendstyle)

यहाँ अन्य विकल्प हैं:

  • list("x" = 100, "y" = 0) सही नीचे के लिए
  • list("x" = 100, "y"= 1) आउट राइट टॉप
  • list("x" = 100, "y" = .5) सही मध्य के बाहर
  • list("x" = 0, "y" = -100) लेफ्ट के तहत
  • list("x" = 0.5, "y" = -100) केंद्र के अंतर्गत
  • list("x" = 1, "y" = -100) अधिकार के तहत

फिर प्रतिक्रिया।

response = p$plotly(x,y,x2,y2, kwargs=list(layout=layoutstyle));

जब आप कॉल करते हैं, तो अपने ग्राफ़ के साथ एक URL लौटाता है। आप कॉल browseURL(response$url)करके इसे और अधिक तेज़ी से एक्सेस कर सकते हैं, जिससे यह आपके लिए आपके ब्राउज़र में आपका ग्राफ़ खोल देगा।

url = response$url
filename = response$filename

यही हमें यह ग्राफ देता है। आप GUI के भीतर से लीजेंड को स्थानांतरित कर सकते हैं और फिर ग्राफ उसी के अनुसार स्केल करेगा। पूर्ण प्रकटीकरण: मैं प्लॉटली टीम पर हूं।

ग्राफ के पक्ष में किंवदंती


2

कोशिश करो layout()जो मैंने अतीत में इसके लिए इस्तेमाल किया है बस नीचे एक खाली भूखंड बनाकर, ठीक से लगभग 1/4 या तो स्केल किया गया और इसमें लीजेंड भागों को मैन्युअल रूप से रखकर।

यहां कुछ पुराने प्रश्न हैं legend()जिनके बारे में आपको शुरू करना चाहिए।


जैसा कि पहले ही सवाल में कहा गया है, यह वही है जिसके बारे में मैंने भी सोचा था। लेकिन यह आदर्श होगा, अगर कोई दूसरा तरीका होगा। किसी तरह मुझे लगता है वहाँ नहीं है।
हेनरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.