Незначительная проблема с участком в базе R - нежелательные линии, отображаемые в верхней части участка - PullRequest
0 голосов
/ 27 января 2020

Я создал график в базе R, включая 3 обрезанных «аблайна». Несмотря на использование функции «frame.plot = FALSE», которая удаляет рамку вокруг графика (см. Изображение example1), когда я добавляю свои обрезанные абзацы [используя ablineclip], над ними появляются новые линии кадрирования (см. Image example2).

Код, который я использую, показан ниже:

library(plotrix)

op <- par(mar=c(5, 6, 4, 2) + 0.1)
plot(dif2$land_area ~ dif2$Year_no, ylim = c(1,4000), col.axis = rgb(68, 84, 106,max=255),xaxt='n', type='o', pch=16, col='red', font.axis=2, font.lab=2, col.lab=rgb( 113, 113, 113, max=255), xlab = 'Year', ylab = 'Total Land Area Changed to \nResidential Development (Ha)', frame.plot = FALSE, cex=1.3) 
rect(23.2,0,25.8,4000,col='grey',density = 8,border=T) 
rect(10.2,0,11.8,4000,col='grey',density = 8,border=T)
xlim(0,30)
axis(1,at= 1:30,labels=F)
axis(1,at= 1:30,tick=F, font.axis=2, col.axis = rgb(68, 84, 106, max=255),labels= c(1989:2018))
# the below section is that which seems to create the issue #
ablineclip(lm(land_area ~ Year_no, data = subset(dif2, int==0)), col='blue', lty=2, x1=1,x2=10, lwd=0.8)
ablineclip(lm(land_area ~ Year_no, data = subset(dif2, int==0)), col='blue', lty=2, x1=12,x2=23, lwd=0.8)
ablineclip(lm(land_area ~ Year_no, data = subset(dif2, int==1)), col='blue', lty=2, x1=26,x2=30, lwd=0.8)

Есть ли у кого-нибудь идеи, почему функция ablineclip изменяет границы графика?

example1 - before addition of ablineclip function example 2 - after addition of ablineclip function

Приветствия

Ответы [ 2 ]

1 голос
/ 27 января 2020

Вам просто нужно установить пределы y для области, обрезанной на ablineclip, используя параметры y1 и y2, гарантируя, что y2 находится ниже верхней части вашего графика.

ablineclip(lm(land_area ~ Year_no, data = subset(dif2, int==0)), 
           col = 'blue', lty = 2, x1 = 1, x2 = 10, y1 = 1, y2 = 3500, lwd = 0.8)

ablineclip(lm(land_area ~ Year_no, data = subset(dif2, int==0)), 
           col = 'blue', lty = 2, x1 = 12, x2 = 23, y1 = 1, y2 = 3500, lwd = 0.8)

ablineclip(lm(land_area ~ Year_no, data = subset(dif2, int==1)), 
           col = 'blue', lty = 2, x1 = 26, x2 = 30, y1 = 1, y2 = 3500,  lwd = 0.8)

Результат: enter image description here

Конечно, у меня не было ваших данных для работы, поэтому мне пришлось составить набор, который был похож (поэтому форма графа отличается от вашего). Я использовал следующие данные:

dif2 <- structure(list(Year_no = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 
28), land_area = c(3165, 3179, 3076, 2772, 2816, 2605, 2565, 
2525, 2446, 2361, NA, 1966, 1911, 1790, 1819, 1710, 1673, 1555, 
1434, 1220, 1174, 1021, 1564, NA, NA, 2479, 2539, 2872), int = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, NA, NA, 1, 1, 1)), row.names = c(NA, -28L), class = "data.frame")
0 голосов
/ 27 января 2020

Это что-то в коде, см. Ниже, когда вы предоставляете x1 и x2, это dr aws строка на границах y + 1:

> ablineclip
function (a = NULL, b = NULL, h = NULL, v = NULL, reg = NULL, 
    coef = NULL, untf = FALSE, x1 = NULL, x2 = NULL, y1 = NULL, 
    y2 = NULL, ...) 
{
    if (!is.null(c(x1, x2, y1, y2))) {
        oldclip <- par("usr")
        if (is.null(x1)) 
            x1 <- oldclip[1]
        if (is.null(x2)) 
            x2 <- oldclip[2]
        if (is.null(y1)) 
            y1 <- oldclip[3]
        if (is.null(y2)) 
            y2 <- oldclip[4]
        clip(x1, x2, y1, y2)
        abline(h = oldclip[4] + 1)

Вы можете взломать код и закомментировать эту строку, или просто используйте аблайн с комбинацией предикторов. Сначала мы моделируем что-то вроде ваших данных:

set.seed(123)
dif2 = data.frame(land_area= rnbinom(30,mu=1500,size=5),
Year_no = seq_along(1989:2018))
dif2$int = rep(0:1,c(23,7))
dif2$int[23:27] = 1
dif2[1989:2018 %in% c(1999,2012,2013),c("land_area","int")] = NA

И график:

library(plotrix)
op <- par(mar=c(5, 6, 4, 2) + 0.1)
plot(dif2$Year_no, dif2$land_area,ylim = c(1,4000), col.axis = rgb(68, 84, 106,max=255),xaxt='n', type='o', pch=16, col='red', font.axis=2, font.lab=2, col.lab=rgb( 113, 113, 113, max=255), xlab = 'Year', ylab = 'Total Land Area Changed to \nResidential Development (Ha)', frame.plot = FALSE, cex=1.3) 
rect(23.2,0,25.8,4000,col='grey',density = 8,border=T) 
rect(10.2,0,11.8,4000,col='grey',density = 8,border=T)
axis(1,at= 1:30,labels=F)
axis(1,at= 1:30,tick=F, font.axis=2, col.axis = rgb(68, 84, 106, max=255),labels= c(1989:2018))

Мы делаем два подбора, и вы используете предикат, чтобы получить значения y

fit1=lm(land_area ~ Year_no, data = subset(dif2, int==0))
fit2=lm(land_area ~ Year_no, data = subset(dif2, int==1))
lines(1:10,predict(fit1,data.frame(Year_no=1:10)),lty=8,col="blue")
lines(12:23,predict(fit1,data.frame(Year_no=12:23)),lty=8,col="blue")
lines(26:30,predict(fit2,data.frame(Year_no=26:30)),lty=8,col="blue")

enter image description here

...