Воссоздать фоновое изображение geom_smooth в ggplot - в R basic? - PullRequest
1 голос
/ 04 июля 2010

Я хочу воссоздать этот график: альтернативный текст http://had.co.nz/stat405/resources/drills/plot-drills/ggplots/hrline7.png

(из здесь )

Использование базовой графики R.

У меня естьПонятия не имею, как это сделать.Любой совет?

(Моя мотивация состоит в том, что я хочу создать график, где ширина линии (и / или цвет) будет отражать другое измерение. До сих пор - ggplot2 - единственное место, которое я нашел в R для того, каксделаю это. Я был бы счастлив сделать это также в базе R)

Ответы [ 5 ]

3 голосов
/ 04 июля 2010

Я не знаю, возможна ли точная репликация графика в базовой графике.В сетке графики это возможно.Тем не менее, следующий код дает вам пример того, что вы хотите.Адаптируйте его к набору данных.

n <- 20
x <- rnorm(n)
y <- rnorm(n)
o <- order(x)
x <- x[o]
y <- y[o]
m <- loess(y~x, span = 1) #ggplot seems to smooth more than default
f <- predict(m, se = TRUE)
ci <- f$se * qt(0.975, f$df)
cih <- f$fit + ci
cil <- f$fit - ci
plot(x,y, ylim = c(min(cil,y), max(cih,y)))
lines(x, f$fit, lwd = 2)
xx <- c(x, rev(x))
yy <- c(cil, rev(cih))
polygon(xx, yy, col="#A9A9A930", border = NA)
3 голосов
/ 04 июля 2010

См. help(polygon) и example(polygon) (особенно пример броуновского движения) - переменная ширина довольно распространена в некоторых областях, чтобы показать изменчивость во времени.

Тот же пример также в demo(graphics):

## An example showing how to fill between curves.

par(bg="white")
n <- 100
x <- c(0,cumsum(rnorm(n)))
y <- c(0,cumsum(rnorm(n)))
xx <- c(0:n, n:0)
yy <- c(x, rev(y))
plot(xx, yy, type="n", xlab="Time", ylab="Distance")
polygon(xx, yy, col="gray")
title("Distance Between Brownian Motions")
2 голосов
/ 05 июля 2010

Хорошо, я потратил слишком много времени на то, чтобы возиться с этим ... обратите внимание, что последняя строка - версия ggplot, чтобы вы могли сравнить их.

#loess and error curves almost just like ggplot2
op <- par(las=1, mar = c(3,3,1,1))
n <- 30
x <- sort(rnorm(n)) #(varying density in predictor)
x <- x + abs(min(x))
x <- x/max(x)*2*pi 
y <- sin(x)+rnorm(n) #(curvy)
m <- loess(y~x)
xx <- seq(min(x), max(x), (max(x)-min(x))/1000) #increase density of values to predict over to increase quality of curve
f <- predict(m, xx, se = TRUE)
ci <- f$se * qt(0.975, f$df)
cih <- f$fit + ci
cil <- f$fit - ci
plot(x,y, ylim = c(min(cil,y), max(cih,y)), cex.axis = 0.85, xlab = '', ylab = '', type = 'n')
title(xlab = 'x', ylab = 'y',line = 2)
grid(col = 'gray')
points(x,y, pch = 19, cex = 0.65)
lines(xx, f$fit, col = 'blue', lwd = 1.2)
xx <- c(xx, rev(xx))
yy <- c(cil, rev(cih))
polygon(xx, yy, col=rgb(0.1,0.1,0.1,0.25), border = NA)
par(op)

#qplot(x,y, geom = 'point') + stat_smooth()
1 голос
/ 04 июля 2010

И чтобы получить плавную кривую, посмотрите на loess и predict.loess

0 голосов
/ 08 июля 2010

Будет ли geom_ribbon в GGPlot то, что вам нужно? Это создает линию переменной ширины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...