добавьте линию 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 ответа:
Это на самом деле довольно сложно/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.