简体   繁体   中英

A ggplot2 equivalent of the lines() function in basic plot

For reasons I won't go into I need to plot a vertical normal curve on a blank ggplot2 graph. The following code gets it done as a series of points with x,y coordinates

dfBlank <- data.frame()

g <- ggplot(dfBlank) + xlim(0.58,1) + ylim(-0.2,113.2)

hdiLo <- 31.88
hdiHi <- 73.43
yComb <- seq(hdiLo, hdiHi, length  = 75)
xVals <- 0.79 - (0.06*dnorm(yComb, 52.65, 10.67))/0.05
dfVertCurve <- data.frame(x = xVals, y = yComb)

g + geom_point(data = dfVertCurve, aes(x = x, y = y), size = 0.01)

The curve is clearly discernible but is a series of points. The lines() function in basic plot would turn these points into a smooth line.

Is there a ggplot2 equivalent?

I see two different ways to do it.

geom_segment

The first uses geom_segment to 'link' each point with its next one.

hdiLo <- 31.88
hdiHi <- 73.43
yComb <- seq(hdiLo, hdiHi, length  = 75)
xVals <- 0.79 - (0.06*dnorm(yComb, 52.65, 10.67))/0.05
dfVertCurve <- data.frame(x = xVals, y = yComb)


library(ggplot2)
ggplot() + 
    xlim(0.58, 1) + 
    ylim(-0.2, 113.2) +
    geom_segment(data = dfVertCurve, aes(x = x, xend = dplyr::lead(x), y = y, yend = dplyr::lead(y)), size = 0.01)
#> Warning: Removed 1 rows containing missing values (geom_segment).

As you can see it just link the points you created. The last point does not have a next one, so the last segment is removed (See the warning )

stat_function

The second one, which I think is better and more ggplot ish, utilize stat_function() .

library(ggplot2)
f = function(x) .79 - (.06 * dnorm(x, 52.65, 10.67)) / .05

hdiLo <- 31.88
hdiHi <- 73.43
yComb <- seq(hdiLo, hdiHi, length  = 75)

ggplot() + 
    xlim(-0.2, 113.2) + 
    ylim(0.58, 1) + 
    stat_function(data = data.frame(yComb), fun = f) +
    coord_flip()

This build a proper function ( y = f(x) ), plot it. Note that it is build on the X axis and then flipped. Because of this the xlim and ylim are inverted.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM