বেস গ্রাফিকগুলিতে প্লট করার ক্ষেত্রের বাইরে কোনও কিংবদন্তি প্লট করবেন?


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

সৃষ্টি করে:

বিকল্প পাঠ

তবে যেমনটি বলা হয়েছে, আমি কিংবদন্তিটি প্লট করার জায়গার (যেমন, গ্রাফ / প্লটের ডানদিকে) বাইরে থাকতে চাই।


... আপনি কিংবদন্তির জন্য ডামি ধারকটির সাথে সামান্য হ্যাক করতে পারেন, সহজ এবং বেশ সুবিধাজনক সময়ে সময়ে। অনুরূপ প্রশ্ন এখানে
এইচ এইচ

2
@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
নোট করুন যে আপনি এক্সপডি সরাসরি কিংবদন্তিতে পাস করতে পারেন যাতে আপনার পরে সমতা পুনরায় সেট করার বিষয়ে চিন্তা করার দরকার নেই। গ্র্যান্ডকন্টারএক্স এবং ওয়াই দেখুন আপনার পরিকল্পনার ডেটার সীমাতে নির্ভর করে না এমন উপায়ে কিংবদন্তির অবস্থান নির্দিষ্ট করার জন্য।
চার্লস

6
যেহেতু এই প্রশ্ন এবং উত্তর এখনও খুব জনপ্রিয়, par(xpd=NA)আরও বেশি শক্তিশালী (যেমন, আরও অঞ্চলে প্লট)।
হেনরিক

+1 টি। আমাদের উল্লেখ করা উচিত যে parকিংবদন্তির আগে আলাদা কল করা বোধগম্য । আমার চক্রান্তে, আমি par(new=T)অন্যান্য বেশ কয়েকটি অনুষ্ঠানে ব্যবহার করেছি এবং কেবল xpdএকই কলটিতে পরম যুক্ত করতে চেয়েছিলাম , যা সমস্যার সৃষ্টি করে।
ম্যাট ব্যানার 9

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 সেট করা ভাল।
স্টাফেন লরেন্ট

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। কোন অন্তর্দৃষ্টি? আমি কি আমার যুক্তি পেরিয়ে যেতেই বিভ্রান্ত?
ব্যবহারকারী 3386170

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 বিভিন্ন ধরণের লেবেল রয়েছে তবে তাদের মধ্যে অনেকগুলি ফাঁকা জায়গা রয়েছে।
সমুদ্রের এক বৃদ্ধ।

আমি আরও বিশদ সহ একটি প্রশ্ন লিখেছি stackoverflow.com/questions/42707308/…
সমুদ্রের একজন বৃদ্ধ।

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
এমনকি পুরানোপাড় <- পার (এক্সপিডি = টি, মার = পার () + মার + সি (0,0,0,6)) ... পার (ওল্ডপার) (পারের সহায়তা দেখুন)
রেকেন্সি

এই সমাধানটি আরও ভাল কারণ কিংবদন্তির জন্য স্ট্রিং স্থির করা হয়েছে কিংবদন্তির স্ট্রিংগুলির দৈর্ঘ্য বিবেচনা না করে
সেরজিও

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

এখানে চিত্র বর্ণনা লিখুন


এক্সপিডি = টি বা এক্সপিডি = এনএ ব্যবহার করা আমার 'মেইন' (শিরোনাম )টিকে ক্লিপ হওয়া থেকে আটকাবে না যখন প্রশস্ত ডান মার্জিনের সাথে যুক্ত অঞ্চলটি ব্যবহার করার চেষ্টা করার জন্য প্রসারিত করা হবে।
ফিল গয়েটজ

@ ফিলিগোয়েটস আপনি কি নিশ্চিত যে আপনি প্লট অঞ্চলে মূল প্লট করছেন? এটা কি সম্ভব যে সেখানে প্লট করার জন্য আপনার পর্যাপ্ত লাইন মার্জিন না রয়েছে?
jbaums

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 টি দিকের চক্রান্তকারী অঞ্চলগুলি দ্বারা সরানো হয় (সুতরাং "ডানদিকে" থাকে) এবং 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()যা সম্পর্কে আপনাকে আরম্ভ করা উচিত।


যেমন ইতিমধ্যে প্রশ্নে বলা হয়েছে, এটি সম্পর্কে আমিও ভেবেছিলাম। তবে এটি আদর্শ হবে, যদি অন্য কোনও উপায় থাকে। একরকম মনে করি সেখানে নেই isn't
হেনরিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.