Bagaimana cara membuat garis tren pada plot sebar menghormati batas sumbu x?

Saya membuat plot di mana saya memplot variabel pada sumbu X terhadap sumbu Y, dan saya juga menambahkan histogram variabel. Saya telah menambahkan garis tren ke plot menggunakan abline().

Masalahnya adalah ia tampaknya tidak menghormati xlim = c(0, 20) di wilayah plot karena melampaui batas sumbu x. Saya mencoba bermain-main dengan opsi xpd, tetapi tidak berhasil. Selanjutnya saya mencoba mengutak-atik par()options yang berbeda, tetapi tidak menemukan apa pun yang dapat membantu mengatasi masalah ini.

Yang saya inginkan adalah garis tren sama persis dengan panjang sumbu x. Bantuan apa pun sangat dihargai. Dalam kasus ini garis trennya hampir datar, namun kemiringannya akan berubah ketika saya melakukan hal yang sama untuk variabel lainnya.

Grafik dengan keluaran yang tidak diinginkan

MWE -- CATATAN: Saya hanya menyediakan 15 titik data untuk mengilustrasikan masalah sehingga grafiknya akan berbeda dengan gambar yang disediakan.

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 sumber
comment
Perintah par(mfg) menimbulkan kesalahan, Error in par(mfg = c(0, 0, 0, 0)) : invalid value specified for graphical parameter "mfg". Untuk pertanyaannya, mungkin Anda bisa menggunakan segments daripada abline?   -  person Rui Barradas    schedule 05.09.2017
comment
Anda benar - par(mfg) memang membuat kesalahan. Itu tidak terjadi ketika saya membuat MWE, tetapi ketika saya menjalankannya dalam sesi yang bersih, hal itu terjadi. Tampaknya tidak ada efek yang terlihat, jadi saya mengedit MWE dan menghapus baris ini. Sedangkan untuk menggunakan segments() - itu mungkin. Namun, hal ini mengharuskan saya menentukan titik awal dan akhir garis. Sekarang mudah karena garis trennya datar, tetapi ketika kemiringannya berubah, saya harus menghitung ulang titik awal dan akhir dan akan sedikit rumit karena saya membuat beberapa grafik ini dengan kemiringan berbeda untuk garis tren.   -  person edsandorf    schedule 05.09.2017


Jawaban (1)


Untuk menghindari menentukan titik awal dan akhir segmen, Anda dapat memprogram fungsi pembantu untuk melakukannya untuk Anda.

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

Lalu, saya telah menggunakan kode Anda dengan perubahan berikut. abline digantikan oleh segments, dengan semua parameter grafis yang Anda gunakan pada panggilan awal.

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)

Panggilan ke segment ini ditempatkan di tempat ablineberada.
Pada grafik terakhir, saya melihat segmen yang berperilaku baik.

person Rui Barradas    schedule 05.09.2017
comment
Sempurna! Memecahkan masalah dengan cemerlang. - person edsandorf; 05.09.2017