geom_smooth 具有假设的逆指数拟合

geom_smooth with hypothetical inverse exponential fit

拿下面的代码,我可以生成一个简单的直方图:

A <- c(rep(0,200),rep(1,1000),rep(2,200),rep(3,100),rep(4,50),rep(5,10))
B <- c(rep("Apple",200),rep("Orange",1000),rep("Pear",200),rep("Grape",100),rep("Banana",50),rep("Nuts",10))

df1 <- data.frame(A,B)


library(ggplot2)
g <- ggplot(df1, aes(A)) + 
  geom_bar() + theme_bw() +
  ylim(0, 1500) 
g

如何在不改变的情况下添加红色虚线拟合通过点 (A=1,y=2000), (2,200), (3,100), (4,50), (5,10) Y 限制?

新建 data.frame:

df2 <- data.frame(A=0:5, B=c(0, 2000, 200, 100, 50, 10))

为了完整起见,我还包括了 A = 0。现在让我们绘制图表:

ggplot(df1, aes(A)) + 
  geom_bar() + 
  theme_bw() +
  geom_line(data=df2, aes(x=A, y=B, color="red")) + 
  coord_cartesian(ylim = c(0, 1500))

关键是使用 coord_cartesian,它在不丢弃数据的情况下重新缩放 y 轴,而不是 ylim。这给你

使用问题中名为 df2 的数据,解决方案是用 approxfun 定义一个函数 f,然后让 stat_function 绘制它的图形。

library(ggplot2)

f <- approxfun(df2$A, df2$B, rule = 2:1)

ggplot(df1, aes(A)) +
  geom_bar() +
  theme_bw() +
  stat_function(fun = f, color = "red", linetype = "dashed") +
  coord_cartesian(ylim = c(0, 1500))

数据

df2 <- list(c(1,2000), c(2,200), c(3,100), c(4,50), c(5,10))
df2 <- do.call(rbind.data.frame, df2)
names(df2) <- c('A', 'B')