จะทำให้เส้นแนวโน้มในพล็อตกระจายเคารพขอบเขตของแกน x ได้อย่างไร

ฉันกำลังสร้างพล็อตโดยพล็อตตัวแปรบนแกน X เทียบกับตัวแปรบนแกน Y และฉันกำลังเพิ่มฮิสโตแกรมของตัวแปรด้วย ฉันได้เพิ่มเส้นแนวโน้มลงในโครงเรื่องโดยใช้ abline()

ปัญหาคือดูเหมือนว่าจะไม่เคารพ xlim = c(0, 20) ในพื้นที่การลงจุด เนื่องจากขยายเกินขีดจำกัดของแกน x ฉันลองใช้ตัวเลือก xpd แล้ว แต่ก็ไม่มีประโยชน์ ต่อไป ฉันลองเล่นซอกับ par()options ต่างๆ แต่ไม่พบสิ่งใดที่สามารถแก้ปัญหานี้ได้

สิ่งที่ฉันต้องการคือให้เส้นแนวโน้มเท่ากับความยาวที่แน่นอนของแกน x ความช่วยเหลือใด ๆ ที่ชื่นชมมาก ในกรณีนี้ เส้นแนวโน้มเกือบจะราบเรียบ แต่ความชันจะเปลี่ยนเมื่อฉันทำเช่นเดียวกันกับตัวแปรอื่นๆ

กราฟที่มีผลลัพธ์ที่ไม่พึงประสงค์

MWE -- หมายเหตุ: ฉันให้ข้อมูลเพียง 15 จุดเพื่ออธิบายปัญหา ดังนั้นกราฟจะแตกต่างจากภาพที่ให้ไว้

df.data <- data.frame(id = 1:15,
                      ll = c(-9.53026, -6.50640,-6.50640, -7.68535, -11.80899, -8.42790,
                             -6.50640, -6.50640, -7.92405, -6.50640, -8.95522, -9.99228,
                             -10.02286, -8.95969, -6.07313),
                      aspm = c(4.582104, 0.490244, 0.737765, 0.256699, 1.575931, 1.062693,
                               1.006984, 0.590355, 1.014370, 0.924855, 0.735989, 0.831025,
                               1.197886, 1.143220, 0.928068))

str.col.light.blue <- c(rgb(r = 110/255, g = 155/255, b = 225/255))
str.col.dark.blue <- c(rgb(r = 50/255, g = 100/255, b = 185/255))

layout(matrix(c(2, 4, 1, 3), 2, 2, byrow = TRUE), widths = c(5, 2), heights = c(2, 5))
layout.show(4)

par(omi = c(0.1, 0.1, 0.1, 0.1))
par(mar = c(2, 2, 0, 0))
par(mai = c(1, 1, 0, 0))

plot(df.data[, "ll"] ~ df.data[, "aspm"], col  = str.col.light.blue,
    xlim = c(0, 20), ylim = c(-15, -5), axes = FALSE,
    xlab = "X1", ylab = "X2",
    cex.lab = 1.25)

abline(a = -8.156670, b = -0.000879, lty = 5, col = "black", lwd = 2, xpd = FALSE)

axis(1, at = seq(0, 20, by = 5), labels = seq(0, 20, by = 5), cex.axis = 1)
axis(2, at = seq(-15, -5, by = 3), labels = seq(-15, -5, by = 3), cex.axis = 1, las = 1)

rect(0, -15, 20, log(1/3)*8, density = 10, angle = 45, lwd = 0.5, col = "gray")

par(mar = c(0, 2, 0, 0))
par(mai = c(0, 1, 0.25, 0))

x.hist <- hist(df.data[, "aspm"], plot = FALSE, breaks = 20)
barplot(x.hist$density, axes = FALSE, horiz = FALSE, space = 0, col = str.col.dark.blue)

par(mar = c(2, 0, 0, 0))
par(mai = c(1, 0, 0, 0.25))

y.hist <- hist(df.data[, "ll"], plot = FALSE, breaks = 20) 
barplot(y.hist$density, axes = FALSE, horiz = TRUE, space = 0, col = str.col.dark.blue)

person edsandorf    schedule 05.09.2017    source แหล่งที่มา
comment
คำสั่ง par(mfg) ส่งข้อผิดพลาด Error in par(mfg = c(0, 0, 0, 0)) : invalid value specified for graphical parameter "mfg" สำหรับคำถาม คุณอาจใช้ segments แทน abline ก็ได้   -  person Rui Barradas    schedule 05.09.2017
comment
คุณพูดถูก - par(mfg) เกิดข้อผิดพลาด ไม่ใช่ตอนที่ฉันสร้าง MWE แต่เมื่อฉันรันมันในเซสชั่นใหม่ทั้งหมด มันก็เป็นเช่นนั้น ดูเหมือนจะไม่มีเอฟเฟกต์ที่มองเห็นได้ ดังนั้นฉันจึงแก้ไข MWE และลบบรรทัดนี้ออก สำหรับการใช้ segments() - เป็นไปได้ อย่างไรก็ตาม ฉันจำเป็นต้องหาจุดเริ่มต้นและจุดสิ้นสุดของเส้นด้วย ตอนนี้เป็นเรื่องง่ายที่เส้นแนวโน้มจะราบเรียบ แต่เมื่อความชันเปลี่ยนแปลง ฉันจะต้องคำนวณจุดเริ่มต้นและจุดสิ้นสุดอีกครั้ง และอาจจะยุ่งยากเล็กน้อยเนื่องจากฉันกำลังสร้างกราฟหลายกราฟที่มีความชันที่แตกต่างกันสำหรับเส้นแนวโน้ม   -  person edsandorf    schedule 05.09.2017


คำตอบ (1)


เพื่อหลีกเลี่ยงการหาจุดเริ่มต้นและจุดสิ้นสุดของเซ็กเมนต์ คุณสามารถตั้งโปรแกรมฟังก์ชันตัวช่วยให้ดำเนินการแทนคุณได้

linear <- function(x, a, b) a + b*x

จากนั้น ฉันได้ใช้รหัสของคุณกับการเปลี่ยนแปลงต่อไปนี้ abline ถูกแทนที่ด้วย segments พร้อมด้วยพารามิเตอร์กราฟิกทั้งหมดที่คุณใช้ในการโทรครั้งแรก

x0 <- 0
y0 <- linear(x0, a = -8.156670, b = -0.000879)
x1 <- 20
y1 <- linear(x1, a = -8.156670, b = -0.000879)

segments(x0, y0, x1, y1, lty = 5, col = "black", lwd = 2, xpd = FALSE)

การเรียก segment นี้ถูกวางไว้ในตำแหน่งที่ ablinewas
ในกราฟสุดท้าย ฉันเห็นส่วนที่ประพฤติตัวดี

person Rui Barradas    schedule 05.09.2017
comment
สมบูรณ์แบบ! แก้ไขปัญหาได้อย่างยอดเยี่ยม - person edsandorf; 05.09.2017