2015-02-18 6 views
6

Я создаю следующие две линии с ggplot и хочу затенять определенную область между двумя линиями, т. Е. Где y = x² больше y = 2x, где 2 < = x < = 3 .Область теней между двумя линиями с 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)) 

результат не состоит в следующем, который только затеняет область под прямой у = 2х, и это независимо от того, что х-значение - почему?

enter image description here

+1

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

+0

Возможные боян: http://stackoverflow.com/q/20260749/903061 – Gregor

ответ

10

Как об использовании geom_ribbon вместо

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

Работает ли geom_ribbon для такого рода задач? http://www.r-bloggers.com/shading-between-two-lines-ggplot/ утверждает, что это не так. – CMichael

+1

Существует проблема, если у вас нет точки пересечения в вашем data.frame. Пример: x <- seq (0,5, by = 0,2); df <- data.frame (x = x, l1 = 5-x, l2 = x); библиотека (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)), fill = "blue", alpha = 0,5); –

+0

Спасибо за эту иллюстрацию! – CMichael

2

Я думаю, что geom_ribbon это путь. Есть 2 шага, чтобы пойти:

  1. Манипулирование данными: Вы должны манипулировать данными для определения Ymin & Ymax аргументы в geom_ribbon
  2. Рисовать участок с geom_ribbon.

Давайте посмотрим, мой пример:

#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()