รับ xlim จากพล็อตใน R

ฉันต้องการประวัติและความหนาแน่นในพล็อตเดียวกัน ฉันกำลังลองสิ่งนี้:

myPlot <- plot(density(m[,1])), main="", xlab="", ylab="")
par(new=TRUE)

Oldxlim <- myPlot$xlim
Oldylim <- myPlot$ylim

hist(m[,3],xlim=Oldxlim,ylim=Oldylim,prob=TRUE)

แต่ฉันไม่สามารถเข้าถึง xlim และ ylim ของ myPlot ได้

มีวิธีรับพวกมันจาก myPlot หรือไม่? ฉันควรทำอะไรอีกแทน?


person jimifiki    schedule 12.12.2012    source แหล่งที่มา
comment
คุณสามารถใช้ hist(..., add = TRUE) เพื่อวาดบนโครงเรื่องเดียวกันได้   -  person liuminzhao    schedule 12.12.2012
comment
@liuminzhao ฉันอาจจะตั้งความคิดเห็นของคุณเป็นคำตอบที่ฉันยอมรับ   -  person jimifiki    schedule 12.12.2012


คำตอบ (5)


คุณได้พิจารณาระบุ xlim และ ylim ของคุณเองในพล็อตแรก (ตั้งค่าให้เป็นค่าที่เหมาะสม) จากนั้นใช้ค่าเหล่านั้นอีกครั้งเพื่อกำหนดขีดจำกัดของฮิสโตแกรมในพล็อตที่สองหรือไม่?

เพียงวางแผนความหนาแน่นด้วยตัวเอง คุณก็น่าจะสามารถหาค่าที่เหมาะสมสำหรับค่าต่ำสุดและค่าสูงสุดของทั้งสองแกนได้ จากนั้นแทนที่ xmin, xmax, ymin และ ymax สำหรับค่าเหล่านั้นในโค้ดด้านล่าง

สิ่งที่ต้องการ;

myPlot <- plot(density(m[,1])), main="", xlab="", ylab="", xlim =c(xmin, xmax), ylim = c(ymin, ymax)

par(new=TRUE)

hist(m[,3],xlim=c(min, max),ylim=c(min, max),prob=TRUE)
person Adam Kimberley    schedule 12.12.2012

การใช้ par(new=TRUE) แทบจะไม่ใช่ทางออกที่ดีที่สุดเลย ฟังก์ชันการลงจุดจำนวนมากมีตัวเลือกเช่น add=TRUE ที่จะเพิ่มลงในการลงจุดที่มีอยู่ (รวมถึงฟังก์ชันการลงจุดสำหรับฮิสโตแกรมดังที่กล่าวไว้ในความคิดเห็น)

หากคุณต้องการทำเช่นนี้จริงๆ ให้ดูที่อาร์กิวเมนต์ usr ของฟังก์ชัน par การทำ mylims <- par("usr") จะให้ขีดจำกัด x และ y ของพล็อตที่มีอยู่ในพิกัดผู้ใช้ อย่างไรก็ตาม เมื่อคุณใช้ข้อมูลนั้นในพล็อตใหม่ ตรวจสอบให้แน่ใจว่าได้ตั้งค่า xaxs='i' ไม่เช่นนั้นพิกัดจริงที่ใช้ในพล็อตใหม่จะถูกขยายเกินกว่าที่คุณระบุ 4%

ฟังก์ชัน grconvertX และ grconvertY ก็มีประโยชน์เช่นกัน อาจนำไปใช้หรือจุดประสงค์นี้ได้ แต่อาจเกินความจำเป็นเมื่อเทียบกับ par("usr") แต่อาจมีประโยชน์สำหรับการค้นหาขีดจำกัดในระบบพิกัดอื่นๆ หรือการค้นหาค่าเช่นตรงกลางของขอบเขตการลงจุดในพิกัดผู้ใช้

person Greg Snow    schedule 12.12.2012

หากคุณไม่สามารถใช้ range() เพื่อรับขีดจำกัดไม่ว่าด้วยเหตุผลใดก็ตาม ฉันจะทำตามคำแนะนำของ @Greg วิธีนี้จะใช้งานได้ก็ต่อเมื่อพารามิเตอร์ par "xaxs" และ "yaxs" ถูกตั้งค่าเป็น "s" (ซึ่งเป็นค่าเริ่มต้น) และช่วงพิกัดถูกขยาย 4%:

plot(seq(0.8,9.8,1), 10:19)
usr <- par('usr')
xr <- (usr[2] - usr[1]) / 27 # 27 = (100 + 2*4) / 4
yr <- (usr[4] - usr[3]) / 27
xlim <- c(usr[1] + xr, usr[2] - xr)
ylim <- c(usr[3] + yr, usr[4] - yr)
person dojuba    schedule 31.10.2013

ฉันคิดว่าทางออกที่ดีที่สุดคือแก้ไขเมื่อคุณพล็อตความหนาแน่น

มิฉะนั้นจะแฮ็กในโค้ดของ plot.default (plot.R)

xlab=""
ylab=""
log =""
xy <- xy.coords(x, y, xlab, ylab, log)
xlim1 <- range(xy$x[is.finite(xy$x)])
ylim1 <- range(xy$y[is.finite(xy$y)])

หรือใช้โค้ดด้านบนเพื่อสร้าง xlim และ ylim จากนั้นเรียกพล็อตของคุณเพื่อความหนาแน่น

dd <- density(c(-20,rep(0,98),20))
plot(dd,xlim=xlim1,ylim=ylim1)
x <- rchisq(100, df = 4)
hist(x,xlim=xlim1,ylim=xlim1,prob=TRUE,add=TRUE)

ป้อนคำอธิบายรูปภาพที่นี่

person agstudy    schedule 12.12.2012

ทำไมไม่ใช้ ggplot2?

library(ggplot2)

set.seed(42)
df <- data.frame(x = rnorm(500,mean=10,sd=5),y = rlnorm(500,sdlog=1.1))

p1 <- ggplot(df) + 
  geom_histogram(aes(x=y,y = ..density..),binwidth=2) +
  geom_density(aes(x=x),fill="green",alpha=0.3) 
print(p1)

ความหนาแน่นและประวัติ

person Roland    schedule 12.12.2012