geom_smooth с гипотетической обратной экспоненциальной подгонкой

Возьмите следующий код, я могу создать простую гистограмму:

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), (2200), (3100), (4,50), (5,10) без изменения пределов y?


person lukeg    schedule 13.06.2020    source источник


Ответы (2)


Используя данные в вопросе с именем df2, решение состоит в том, чтобы определить функцию f с помощью approxfun, а затем 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')
person Rui Barradas    schedule 13.06.2020

Создайте новый 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. Это дает вам

person Martin Gal    schedule 13.06.2020
comment
@lukeg Я понял, что это не отвечает на вопрос, так как я проигнорировал часть geom_smooth. Я скоро удалю этот ответ, но, возможно, часть coord_cartesian решит вашу проблему. - person Martin Gal; 13.06.2020