2015-02-18 21 views
6

Produkuję następujące dwie linie z ggplot i chciałbym zacienienie określonego regionu między dwoma liniami, tj. Gdzie y = x2 jest większa niż y = 2x, gdzie 2 < = x < = 3 .Cień region między dwiema liniami z ggplot

# create data # 

x<-as.data.frame(c(1,2,3,4)) 
colnames(x)<-"x" 
x$twox<-2*x$x 
x$x2<-x$x^2 

# Set colours # 

blue<-rgb(0.8, 0.8, 1, alpha=0.25) 
clear<-rgb(1, 0, 0, alpha=0.0001) 

# Define region to fill # 

x$fill <- "no fill" 
x$fill[(x$x2 > x$twox) & (x$x <= 3 & x$x >= 2)] <- "fill" 

# Plot # 

ggplot(x, aes(x=x, y=twox)) + 
    geom_line(aes(y = twox)) + 
    geom_line(aes(y = x2)) + 
    geom_area(aes(fill=fill)) + 
    scale_y_continuous(expand = c(0, 0), limits=c(0,20)) + 
    scale_x_continuous(expand = c(0, 0), limits=c(0,5)) + 
    scale_fill_manual(values=c(clear,blue)) 

wynik jest następujący który właśnie odcienie obszar pod linią y = 2x, i to bez względu na x-value - dlaczego?

enter image description here

+1

http://www.r-bloggers.com/shading-between-two-lines-ggplot/ – CMichael

+0

Możliwa dupe: http://stackoverflow.com/q/20260749/903061 – Gregor

Odpowiedz

10

Jak na temat korzystania geom_ribbon zamiast

ggplot(x, aes(x=x, y=twox)) + 
    geom_line(aes(y = twox)) + 
    geom_line(aes(y = x2)) + 
    geom_ribbon(data=subset(x, 2 <= x & x <= 3), 
      aes(ymin=twox,ymax=x2), fill="blue", alpha="0.5") + 
    scale_y_continuous(expand = c(0, 0), limits=c(0,20)) + 
    scale_x_continuous(expand = c(0, 0), limits=c(0,5)) + 
    scale_fill_manual(values=c(clear,blue)) 

plot

+0

Czy geom_ribbon zawsze działa dla tego rodzaju zadań? http://www.r-bloggers.com/shading-between-two-lines-ggplot/ stwierdza, że ​​tak nie jest. – CMichael

+1

Występuje problem, jeśli nie masz punktu przecięcia w swoim pliku data.frame. Przykład: x <- seq (0,5, przez = 0,2); df <- data.frame (x = x, l1 = 5-x, l2 = x); biblioteka (ggplot2); ggplot (df, aes (x = x)) + geom_line (aes (y = l1)) + geom_line (aes (y = l2)) + geom_ribbon (aes (ymin = pmin (l1, l2), ymax = pmax (l1 , l2)), wypełnienie = "niebieski", alfa = 0,5); –

+0

Dzięki za tę ilustrację! – CMichael

2

myślę że geom_ribbon jest droga. Istnieją 2 kroki, aby Go:

  1. Data Manipulation: Należy manipulowanie danymi w celu określenia YMIN & Ymax argumentów w geom_ribbon
  2. Rysuj wykres z geom_ribbon.

Zobaczmy mój przykład:

#Data 
library(gcookbook) 
# Data Manipulation 
cb <-subset(climate,Source=="Berkeley") 
cb$valence[cb$Anomaly10y >= 0.3] <- "pos" 
cb$valence[cb$Anomaly10y < 0.3] <- "neg" 
cb$min <- ifelse(cb$Anomaly10y >= 0.3, 0.3, cb$Anomaly10y) 
cb$max <- ifelse(cb$Anomaly10y >= 0.3, cb$Anomaly10y, 0.3) 

#Drawing plot 
ggplot(cb,aes(x=Year,y=Anomaly10y)) + 
geom_ribbon(aes(ymin = min, ymax = max, fill = valence), alpha = 0.75) + 
scale_fill_manual(values = c("blue", "orange")) + 
geom_line(aes(col = valence), size = 1) + 
scale_color_manual(values = c("blue", "orange")) + 
geom_hline(yintercept=0.3, col = "blue") + 
theme_bw() 
Powiązane problemy