2015-11-12 8 views
5

Hier ist der Code von dem, was ich jetzt haben:Schattierung eine Region mit stat_function und ggplot

library(ggplot2) 

normal <- function(mu, sigma, x){ 
1/(sigma*sqrt(2*pi))*exp(-((x-mu)/sigma)^2) 
} 

normal_expr <- function(){ 
    expression(N~bgroup('(',paste(x, '; ',mu, ',', sigma),')') == frac(1, sigma~sqrt(2*pi)) ~ 
        exp~bgroup('[',-~bgroup('(',frac(x-mu,sigma),')')^2,']')) 

} 


ggplot(data.frame(x=c(-3,3)), aes(x=x, color=g)) + 
    stat_function(data=data.frame(x=c(-2, 3.5), g=factor(1)), fun=normal, geom='line', 
       args=list(mu=0.5, sigma=2)) + 
    stat_function(data=data.frame(x=c(-2, 3.5), g=factor(2)), fun=normal, geom='line', 
       args=list(mu=1, sigma=2)) + 
    scale_x_continuous(breaks=seq(from=-2, to = 3, by=1)) + 
    ylab(normal_expr()) + 
    coord_cartesian(ylim=c(0, 0.2)) + 
    scale_color_manual('',values=c('blue','red', 'red'), 
    labels=c(expression(N(mu == 0.5, sigma==2)),expression(N(mu == 1, sigma==2)))) + 
    theme(panel.background = element_rect(fill='white'), 
     #panel.background has a gray-like color by default 
     panel.border=element_rect(fill=NA), 
     #panel.border puts in fill by default 
     legend.background = element_blank(), 
     legend.box = 'vertical', 
     legend.position=c(0.85,0.85), 
     legend.text.align=0 
     ) 

Hier ist der Ausgang:

enter image description here

Von dem, was ich sammeln von R Graphics Cookbook von Chang, sollte ich in der Lage sein, etwas wie

normal_shade <- function(mu, sigma, x){ 
y <- normal(mu=mu, sigma=sigma, x) 
y[x < 0 | x > 2] <- NA 
return(y) 
} 

+ stat_function(fun=normal_shade, geom = 'area', fill = 'red', alpha = 0.2, args = 
list(mu = 1, sigma = 2)) 
hinzuzufügen

auf den Code oben Schraffur unter der roten Linie von x = 0 oben zu bekommen, um x = 2.

Hier ist, was passiert:

library(ggplot2) 

normal <- function(mu, sigma, x){ 
1/(sigma*sqrt(2*pi))*exp(-((x-mu)/sigma)^2) 
} 

normal_expr <- function(){ 
    expression(N~bgroup('(',paste(x, '; ',mu, ',', sigma),')') == frac(1, sigma~sqrt(2*pi)) 
~ exp~bgroup('[',-~bgroup('(',frac(x-mu,sigma),')')^2,']')) 

} 

normal_shade <- function(mu, sigma, x){ 
y <- normal(mu=mu, sigma=sigma, x) 
y[x < 0 | x > 2] <- NA 
return(y) 
} 


ggplot(data.frame(x=c(-3,3)), aes(x=x, color=g)) + 
    stat_function(data=data.frame(x=c(-2, 3.5), g=factor(1)), fun=normal, geom='line', 
       args=list(mu=0.5, sigma=2)) + 
    stat_function(data=data.frame(x=c(-2, 3.5), g=factor(2)), fun=normal, geom='line', 
       args=list(mu=1, sigma=2)) + 
    stat_function(fun=normal_shade, geom = 'area', fill = 'red', alpha = 0.2, 
args=list(mu=1, sigma=2)) + 
    scale_x_continuous(breaks=seq(from=-2, to = 3, by=1)) + 
    ylab(normal_expr()) + 
    coord_cartesian(ylim=c(0, 0.2)) + 
    scale_color_manual('',values=c('blue','red', 'red'), 
    labels=c(expression(N(mu == 0.5, sigma==2)),expression(N(mu == 1, sigma==2)))) + 
    theme(panel.background = element_rect(fill='white'), 
     #panel.background has a gray-like color by default 
     panel.border=element_rect(fill=NA), 
     #panel.border puts in fill by default 
     legend.background = element_blank(), 
     legend.box = 'vertical', 
     legend.position=c(0.85,0.85), 
     legend.text.align=0 
     ) 

Error in eval(expr, envir, enclos) : object 'g' not found 

ich viele Such getan haben, aber noch nicht gewesen um dieses Problem zu umgehen.

+0

entfernen Sie einfach die 'color = g', da Sie nicht von einer Gruppe gefärbt werden. ggplot sucht in Ihrem Datenrahmen nach einer Spalte namens "g" – rawr

+0

@rawr Das einzige Problem, das ich damit habe, ist, dass es die Legende entfernt. Kann ich es irgendwie behalten? – Clarinetist

+0

Sie können 'g = factor (1)' zu Ihrem Datenrahmen hinzufügen – rawr

Antwort

5

Sie haben die Daten auf der dritten stat_function() Anruf verlassen. Wenn Sie, dass wieder in setzen, sieht es wie folgt aus:

ggplot(data.frame(x=c(-3,3)), aes(x=x, color=g)) + 
    stat_function(data=data.frame(x=c(-2, 3.5), g=factor(1)), fun=normal, geom='line', 
       args=list(mu=0.5, sigma=2)) + 
    stat_function(data=data.frame(x=c(-2, 3.5), g=factor(2)), fun=normal, geom='line', 
       args=list(mu=1, sigma=2)) + 
    stat_function(data=data.frame(x=c(-2, 3.5), g=factor(2)), fun=normal_shade, geom = 'area', fill = 'red', alpha = 0.2, 
       args=list(mu=1, sigma=2)) + 
    scale_x_continuous(breaks=seq(from=-2, to = 3, by=1)) + 
    ylab(normal_expr()) + 
    coord_cartesian(ylim=c(0, 0.2)) + 
    scale_color_manual('',values=c('blue','red', 'red'), 
        labels=c(expression(N(mu == 0.5, sigma==2)),expression(N(mu == 1, sigma==2)))) + 
    theme(panel.background = element_rect(fill='white'), 
     #panel.background has a gray-like color by default 
     panel.border=element_rect(fill=NA), 
     #panel.border puts in fill by default 
     legend.background = element_blank(), 
     legend.box = 'vertical', 
     legend.position=c(0.85,0.85), 
     legend.text.align=0 
) 

enter image description here

Und wenn Sie color=NA im dritten stat_function() rufen Sie setzen, erhalten Sie diese (was etwas mehr wünschenswert sein kann):

enter image description here

+0

Vielen Dank, besonders für den 'color' Tipp! – Clarinetist

Verwandte Themen