আমি কীভাবে 2 টি ভিন্ন y- অক্ষ দিয়ে প্লট করতে পারি?


122

আমি আর তে দুটি স্ক্যাটার প্লট সুপারমপোজ করব যাতে প্রতিটি পয়েন্টের নিজস্ব সেট (আলাদা) ওয়াই-অক্ষ থাকে (অর্থাত্ চিত্রের 2 এবং 4 পজিশনে) তবে পয়েন্টগুলি একই চিত্রের উপরে সুপারিমোজড প্রদর্শিত হয়।

এটি দিয়ে কি এটি সম্ভব plot?

সমস্যা কোড দেখাচ্ছে উদাহরণ কোড সম্পাদনা করুন

# example code for SO question
y1 <- rnorm(10, 100, 20)
y2 <- rnorm(10, 1, 1)
x <- 1:10
# in this plot y2 is plotted on what is clearly an inappropriate scale
plot(y1 ~ x, ylim = c(-1, 150))
points(y2 ~ x, pch = 2)

নমুনা তথ্য সরবরাহ করুন। এটি একটি নান্দনিক দৃষ্টিকোণ থেকে সাধারণত একটি খারাপ ধারণা।
26:51

3
এর নির্দিষ্ট ক্ষেত্রে উত্তর এবং আলোচনা ggplot2: স্ট্যাকওভারফ্লো / প্রশ্ন / 3099219/… (এসও অনুসন্ধান করা [r] two y-axesবা এর জন্য [r] twoord.plot) - এর সাথে আরও কয়েকটি সম্পর্কিত উত্তর রয়েছে, যদিও (এটি আমার আর এফএকিউ হওয়ার পরে আমার অবাক হওয়ার মত) কিছুই অভিন্ন
বেন বলকার

@ কেনাকাটা - আমি সমস্যার একটি কার্যকরী উদাহরণ যুক্ত করেছি। নান্দনিক বিষয়ে সতর্কতার জন্য ধন্যবাদ।
DQdlM

উত্তর:


126

আপডেট : অনুলিপি করা সামগ্রী যা আর উইকিটিতে ছিল : http://rwiki.sciviews.org/doku.php?id=tips : رافিক্স- বেসিক্সেসেক্সেস , লিঙ্কটি এখন ভাঙা: ওয়েবব্যাক মেশিন থেকেও উপলব্ধ

একই চক্রান্তে দুটি ভিন্ন y অক্ষ

(কিছু উপাদান মূলত ড্যানিয়েল রাজডল 2006/03/31 15:26)

দয়া করে মনে রাখবেন যে খুব কম পরিস্থিতি রয়েছে যেখানে একই চক্রান্তে দুটি পৃথক স্কেল ব্যবহার করা উপযুক্ত। গ্রাফিকের দর্শকদের বিভ্রান্ত করা খুব সহজ। নিম্নলিখিত দুটি উদাহরণ এবং মন্তব্য এই বিষয়ে (চেক example1 , example2 থেকে জাঙ্ক চার্ট ), সেইসাথে দ্বারা এই নিবন্ধটি স্টিফেন কয়েক (যা উপসংহারে "আমি অবশ্যই এই উপসংহারে না পারেন, একবার, যে ডুয়াল ছোটো অক্ষ সঙ্গে গ্রাফ কখনোই হয় দরকারী; কেবলমাত্র আমি এমন পরিস্থিতি সম্পর্কে ভাবতে পারি না যা তাদের অন্যান্য, আরও ভাল সমাধানের আলোকে পরোয়ানা দেয়। ") এছাড়াও এই কার্টুনের পয়েন্ট # 4 দেখুন ...

আপনি যদি নির্ধারিত হন তবে প্রাথমিক রেসিপিটি হ'ল আপনার প্রথম প্লট par(new=TRUE)তৈরি করা, গ্রাফিক্স ডিভাইস সাফ করা থেকে আরকে প্রতিরোধের জন্য সেট করা, axes=FALSE(এবং সেটিং xlabএবং ylabফাঁকা ann=FALSEহওয়া - এছাড়াও কাজ করা উচিত) দিয়ে দ্বিতীয় প্লট তৈরি করা এবং তারপরে axis(side=4)একটি নতুন অক্ষ যুক্ত করা ডানদিকে এবং ডানদিকে mtext(...,side=4)একটি অক্ষ লেবেল যুক্ত করতে। এখানে কিছুটা মেক-আপ ডেটা ব্যবহার করে একটি উদাহরণ দেওয়া হল:

set.seed(101)
x <- 1:10
y <- rnorm(10)
## second data set on a very different scale
z <- runif(10, min=1000, max=10000) 
par(mar = c(5, 4, 4, 4) + 0.3)  # Leave space for z axis
plot(x, y) # first plot
par(new = TRUE)
plot(x, z, type = "l", axes = FALSE, bty = "n", xlab = "", ylab = "")
axis(side=4, at = pretty(range(z)))
mtext("z", side=4, line=3)

twoord.plot()মধ্যে plotrixপ্যাকেজ এই প্রক্রিয়া স্বয়ংক্রিয়রূপে, ঠিক যেমন doubleYScale()মধ্যে latticeExtraপ্যাকেজ।

আরেকটি উদাহরণ (রবার্ট ডব্লিউ। বারের একটি আর মেলিং তালিকা পোস্ট থেকে গৃহীত):

## set up some fake test data
time <- seq(0,72,12)
betagal.abs <- c(0.05,0.18,0.25,0.31,0.32,0.34,0.35)
cell.density <- c(0,1000,2000,3000,4000,5000,6000)

## add extra space to right margin of plot within frame
par(mar=c(5, 4, 4, 6) + 0.1)

## Plot first set of data and draw its axis
plot(time, betagal.abs, pch=16, axes=FALSE, ylim=c(0,1), xlab="", ylab="", 
   type="b",col="black", main="Mike's test data")
axis(2, ylim=c(0,1),col="black",las=1)  ## las=1 makes horizontal labels
mtext("Beta Gal Absorbance",side=2,line=2.5)
box()

## Allow a second plot on the same graph
par(new=TRUE)

## Plot the second plot and put axis scale on right
plot(time, cell.density, pch=15,  xlab="", ylab="", ylim=c(0,7000), 
    axes=FALSE, type="b", col="red")
## a little farther out (line=4) to make room for labels
mtext("Cell Density",side=4,col="red",line=4) 
axis(4, ylim=c(0,7000), col="red",col.axis="red",las=1)

## Draw the time axis
axis(1,pretty(range(time),10))
mtext("Time (Hours)",side=1,col="black",line=2.5)  

## Add Legend
legend("topleft",legend=c("Beta Gal","Cell Density"),
  text.col=c("black","red"),pch=c(16,15),col=c("black","red"))

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

একই ধরণের রেসিপিগুলি বিভিন্ন ধরণের প্লট - বার প্লট, হিস্টোগ্রাম ইত্যাদির সুপারমপোজ করতে ব্যবহার করা যেতে পারে ..


এই কারণেই লিংক-কেবল উত্তরগুলি একটি খারাপ ধারণা ... উইকি.আর-প্রজেক্ট.অর্গ.র দেখা যায় না, আমি r-devel@r-project.org এ জিজ্ঞাসা করছি।
বেন বলকার

@ বেনবোলকার আপনার সমাধান প্রতিভা! তবে আমার একটা প্রশ্ন আছে যদি এটি উভয় পক্ষের একাধিক লাইনের থেকে থাকে তবে আমি এখনও এই পদ্ধতিটি ব্যবহার করতে সক্ষম তবে কেবল প্রতীক সহ। আমি যখন লাইন = প্লট ব্যবহার করার চেষ্টা করি তখন এটি ক্রমাগত প্লট করার চেষ্টা করে। আপনি কি এটিকে ঠিক করার জন্য কোনও কৌশল প্রস্তাব করবেন?
wthimdh

1
@ বেনবোলকার কী হবে যদি সময় তারিখের টাইপের ধরন হয়: "2019-01-01"। আপনি কিভাবে axis(1,pretty(range(time),10))লাইন পরিবর্তন করবেন ?
k.dkhk

35

তার নাম, প্রস্তাবক হিসাবে twoord.plot()মধ্যে plotrix দুই কোটি অক্ষ সাথে প্যাকেজ প্লট।

library(plotrix)
example(twoord.plot)

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

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

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

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

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


3
বাক্পটুতাপূর্ণ. উদাহরণ ট্রাক বোঝার জন্য ধন্যবাদ। আমি lineণাত্মক মানগুলির সাথে সেই লাইনগুলির একটি এবং বার উদাহরণগুলি দেখতে পছন্দ করব। এছাড়াও স্ট্যাকিং ভাল হবে।
ম্যাট ব্যানার 20

5

একটি বিকল্প পাশাপাশি দুটি প্লট করা। ggplot2এর সাথে এর জন্য একটি দুর্দান্ত বিকল্প সরবরাহ করে facet_wrap():

dat <- data.frame(x = c(rnorm(100), rnorm(100, 10, 2))
  , y = c(rnorm(100), rlnorm(100, 9, 2))
  , index = rep(1:2, each = 100)
  )

require(ggplot2)
ggplot(dat, aes(x,y)) + 
geom_point() + 
facet_wrap(~ index, scales = "free_y")

4

যদি আপনি স্কেল / অক্ষ লেবেলগুলি ছেড়ে দিতে পারেন তবে আপনি (0, 1) ব্যবধানে ডেটা পুনরুদ্ধার করতে পারেন। এটি ক্রোমোসোমে বিভিন্ন 'উইগল' ট্র্যাকসের উদাহরণস্বরূপ কাজ করে, যখন আপনি সাধারণত ট্র্যাকগুলির মধ্যে স্থানীয় পারস্পরিক সম্পর্কের বিষয়ে আগ্রহী হন এবং তাদের বিভিন্ন স্কেল থাকে (হাজারে কভারেজ, Fst 0-1)।

# rescale numeric vector into (0, 1) interval
# clip everything outside the range 
rescale <- function(vec, lims=range(vec), clip=c(0, 1)) {
  # find the coeficients of transforming linear equation
  # that maps the lims range to (0, 1)
  slope <- (1 - 0) / (lims[2] - lims[1])
  intercept <- - slope * lims[1]

  xformed <- slope * vec + intercept

  # do the clipping
  xformed[xformed < 0] <- clip[1]
  xformed[xformed > 1] <- clip[2]

  xformed
}

তারপর, সঙ্গে একটি ডাটা ফ্রেম থাকার chrom, position, coverageএবং fstকলাম, আপনি কিছু পছন্দ করতে পারেন:

ggplot(d, aes(position)) + 
  geom_line(aes(y = rescale(fst))) + 
  geom_line(aes(y = rescale(coverage))) +
  facet_wrap(~chrom)

এর সুবিধা হ'ল আপনি দুটি ট্র্যাকসিতে সীমাবদ্ধ নন।


4

আমি খুব প্রস্তাব দেওয়া হয়, twoord.stackplot()এর মধ্যে plotrixআরো দুই কোটি axes সাথে প্যাকেজ প্লট।

data<-read.table(text=
"e0AL fxAL e0CO fxCO e0BR fxBR anos
 51.8  5.9 50.6  6.8 51.0  6.2 1955
 54.7  5.9 55.2  6.8 53.5  6.2 1960
 57.1  6.0 57.9  6.8 55.9  6.2 1965
 59.1  5.6 60.1  6.2 57.9  5.4 1970
 61.2  5.1 61.8  5.0 59.8  4.7 1975
 63.4  4.5 64.0  4.3 61.8  4.3 1980
 65.4  3.9 66.9  3.7 63.5  3.8 1985
 67.3  3.4 68.0  3.2 65.5  3.1 1990
 69.1  3.0 68.7  3.0 67.5  2.6 1995
 70.9  2.8 70.3  2.8 69.5  2.5 2000
 72.4  2.5 71.7  2.6 71.1  2.3 2005
 73.3  2.3 72.9  2.5 72.1  1.9 2010
 74.3  2.2 73.8  2.4 73.2  1.8 2015
 75.2  2.0 74.6  2.3 74.2  1.7 2020
 76.0  2.0 75.4  2.2 75.2  1.6 2025
 76.8  1.9 76.2  2.1 76.1  1.6 2030
 77.6  1.9 76.9  2.1 77.1  1.6 2035
 78.4  1.9 77.6  2.0 77.9  1.7 2040
 79.1  1.8 78.3  1.9 78.7  1.7 2045
 79.8  1.8 79.0  1.9 79.5  1.7 2050
 80.5  1.8 79.7  1.9 80.3  1.7 2055
 81.1  1.8 80.3  1.8 80.9  1.8 2060
 81.7  1.8 80.9  1.8 81.6  1.8 2065
 82.3  1.8 81.4  1.8 82.2  1.8 2070
 82.8  1.8 82.0  1.7 82.8  1.8 2075
 83.3  1.8 82.5  1.7 83.4  1.9 2080
 83.8  1.8 83.0  1.7 83.9  1.9 2085
 84.3  1.9 83.5  1.8 84.4  1.9 2090
 84.7  1.9 83.9  1.8 84.9  1.9 2095
 85.1  1.9 84.3  1.8 85.4  1.9 2100", header=T)

require(plotrix)
twoord.stackplot(lx=data$anos, rx=data$anos, 
                 ldata=cbind(data$e0AL, data$e0BR, data$e0CO),
                 rdata=cbind(data$fxAL, data$fxBR, data$fxCO),
                 lcol=c("black","red", "blue"),
                 rcol=c("black","red", "blue"), 
                 ltype=c("l","o","b"),
                 rtype=c("l","o","b"), 
                 lylab="Años de Vida", rylab="Hijos x Mujer", 
                 xlab="Tiempo",
                 main="Mortalidad/Fecundidad:1950–2100",
                 border="grey80")
legend("bottomright", c(paste("Proy:", 
                      c("A. Latina", "Brasil", "Colombia"))), cex=1,
        col=c("black","red", "blue"), lwd=2, bty="n",  
        lty=c(1,1,2), pch=c(NA,1,1) )

1

@ বেনবোলকারের গৃহীত উত্তরের অনুরূপ অন্য একটি বিকল্প পয়েন্টের দ্বিতীয় সেট যুক্ত করার সময় বিদ্যমান প্লটের স্থানাঙ্কগুলিকে নতুন করে সংজ্ঞায়িত করছে।

এখানে একটি ন্যূনতম উদাহরণ।

ডেটা:

x  <- 1:10
y1 <- rnorm(10, 100, 20)
y2 <- rnorm(10, 1, 1)

পটভূমি:

par(mar=c(5,5,5,5)+0.1, las=1)

plot.new()
plot.window(xlim=range(x), ylim=range(y1))
points(x, y1, col="red", pch=19)
axis(1)
axis(2, col.axis="red")
box()

plot.window(xlim=range(x), ylim=range(y2))
points(x, y2, col="limegreen", pch=19)
axis(4, col.axis="limegreen")

উদাহরণ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.