Хотите построить функцию между [a, b] и на том же графике заштриховать область под [c, d], где c и d лежат между a и b

#r #ggplot2

#r #ggplot2

Вопрос:

Я пытаюсь построить функцию с помощью ggplot, что я могу сделать. Например, y = x. Я строю график между -1 и 4. Отлично работает. На том же графике я теперь хочу затенить область под кривой между 1 и 3. Я не могу заставить ее работать и не могу найти никакой документации. Кто-нибудь может мне помочь?

Скелетный код, который я пытаюсь:

 eq<-function(x){(x)}

ggplot(data.frame(x=c(-1,4)),aes(x))   
stat_function(fun=eq,geom="line",color="red")   
stat_function(fun=eq,geom="area",fill="blue")
  

Я перепробовал все разные перестановки. Если бы был способ ограничить вторую stat_function другим доменом, это могло бы сработать. Есть идеи?

Ответ №1:

Похоже, что stat_function это работает со всем диапазоном данных, а не с конкретными указанными значениями. Один из вариантов — сначала сгенерировать данные, которые вы хотите отобразить, а затем передать их конкретному geom_* . Однако, если вы действительно хотите остаться stat_function , вам, возможно, придется немного поработать. Одним из подходов было бы создание двух функций, одна из которых ограничивает выходные данные нужным диапазоном.

 eq<-function(x){(x)}
eqB<-function(x){ifelse(x < 3 amp; x > 0, x, NA)}

ggplot(data.frame(x=c(-1,4)),aes(x))   
  stat_function(fun=eq,geom="line",color="red")   
  stat_function(fun=eqB,geom="area",fill="blue")
  

Более надежным решением является создание единой функции, которая принимает ограничения диапазона, а затем передает их при использовании args :

 eqC <- function(x,upr = max(x), lwr = min(x)){
  ifelse(x <= upr amp; x >= lwr, x, NA)
}

ggplot(data.frame(x=c(-1,4)),aes(x))   
  stat_function(fun=eqC,geom="line",color="red")   
  stat_function(fun=eqC,geom="area",fill="blue"
                , args = list(upr = 3, lwr = 0))
  

Оба они генерируют график, который выглядит следующим образом:

введите описание изображения здесь

Комментарии:

1. Отметьте, я предположил, что stat_function работает со всем диапазоном данных для обоих графиков, но я не мог придумать способ обойти это. То, что вы создали, было превосходным и делает именно то, что я хотел. Я пробовал это для различных функций, включая стандартную нормальную кривую, и она отлично работает. Большое вам спасибо! Тони