#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 работает со всем диапазоном данных для обоих графиков, но я не мог придумать способ обойти это. То, что вы создали, было превосходным и делает именно то, что я хотел. Я пробовал это для различных функций, включая стандартную нормальную кривую, и она отлично работает. Большое вам спасибо! Тони