добавьте линию x=y к диаграмме рассеяния


Я использую функцию scatterplot из пакета car для создания диаграммы рассеяния. Я хочу иметь возможность генерировать опорную линию на графике, которая должна быть x=y. Я попробовал использовать abline, и он добавляет линию, но это не линия x=y. Может кто-нибудь помочь?

Мой код выглядит следующим образом:

scatterplot(phenos$P1~pheno$P0, data=pheno,spread=FALSE,ylab="6 month timepoint", xlab="Baseline Timepoint", jitter=list(x=1, y=1))
abline(0,1)

Спасибо.

3 8

3 ответа:

Это на самом деле довольно сложно/hackish, потому что scatterplot() внутренне использует layout, что затрудняет управление подзаголовком, используемым в настоящее время графическим драйвером. (Update : это сложнее, чем я думал-настройка par("mfg"), должно быть, работала более или менее случайно.)

Составьте данные (обновление : использование данных со средними x и y не равными нулю и не равными друг другу, так как это иллюстрирует трудности наивного использования abline() Подробнее ясно)

set.seed(1)
d <- data.frame(x=rnorm(10,mean=10),y=rnorm(10,mean=12))
library(car)
Попробуйте мою старую стратегию (которая на самом деле не работает или работает только непредсказуемо):
scatterplot(y~x,data=d,reset.par=FALSE)
k <- 1              
for (i in 1:2) {
   for (j in 1:2) {
      par(mfg=c(i,j,2,2))
        abline(0,1,lwd=3,col=k)
        k <- k+1
  }

}

В зависимости от того, как я это делаю, я либо получаю предупреждения и ошибки, либо ложные ответы. Кажется, имеет значение, выполняю ли я вызов scatterplot() внутри функции ... ??

Введите описание изображения здесь

Вторая попытка, более консервативная: реконструировать макет с нуля.
 scatterplot(y~x,data=d)
 uu <- par("usr")
 ## mimic layout frolm car:::scatterplot.default.  Would be different if we were drawing only one
 ## of x-boxes or y-boxes
 layout(matrix(c(1, 0, 3, 2), 2, 2), widths = c(5, 95), 
        heights = c(95, 5))
 oldmar <- par(mar=rep(0,4))  ## zero out margins so we can plot in sub-boxes without errors
 ## now skip through the first two sub-plots
 par(new=TRUE); plot.new(); par(new=TRUE); plot.new()
 par(oldmar)  ## reset margins
 ## blank plot with user limits set and 'interior' axis calculations
 plot(0:1,0:1,xlab="",ylab="",xlim=uu[1:2],ylim=uu[3:4],xaxs="i",yaxs="i")
 ## add annotation
 abline(a=0,b=1,col=4,lwd=3)              

Введите описание изображения здесь

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

Я просто использую функцию сегментов: сегменты (x0=0, y0=0, x1=45, y1=45)

Просто сделайте так, чтобы значения y были чуть выше границ вашего участка.

Эта функция также хороша, потому что она не изменяет ваши пределы x и y, так что линия может работать чисто через ваш график без необходимости точно выбирать значения x и Y.

Вы можете достичь своей цели с помощью той же функции abline. Используйте функцию abline(a=0, b=1), где a и b - перехват и Слоп линии соответственно. Это рисует вам прямую линию вида Y = a + b*x.

Надеюсь, это поможет.