Fill area between multiple lines in plot

做~自己de王妃 提交于 2020-01-30 10:56:16

问题


I have got a plot with 3 lines as follows:

a = data.frame(time = c(1:100), x = rnorm(100))
b = data.frame(time = c(1:100), y = rnorm(100))
c = data.frame(time = c(1:100), z = rnorm(100))

plot(a$time, a$x, type = 'l')
lines(b$time, b$y, type = 'l')
lines(c$time, c$z, type = 'l')

I need to fill the area between the lowest and maximum value of the lines so that I get a unique polygon of a given colour.

I know about the polygon function but I do not know how to use it in this case.

Any suggestion? thanks


回答1:


Here is an approach:

a = data.frame(time = c(1:100), x = rnorm(100))
b = data.frame(time = c(1:100), y = rnorm(100))
c = data.frame(time = c(1:100), z = rnorm(100))

calculate the pmin and pmax:

min_a <- pmin(a, b, c)
max_a <- pmax(a, b, c)

construct the polygon as usual:

polygon(c(c$time, rev(c$time)), c(max_a$x ,rev(min_a$x)), col = rgb(1, 0, 0,0.5) )

or using ggplot:

library(tidyverse)
data.frame(a, b, c) %>% #combine the three data frames
  group_by(time) %>% # group by time for next step
  mutate(max = max(x, y, z), # calculate max of x, y, z in each time
         min = min(x, y, z)) %>% #same as above
  select(-time.1, - time.2) %>% #discard redundant columns
  gather(key, value, 2:4) %>% #convert to long format so you can color by key in the geom line call
  ggplot()+
  geom_ribbon(aes(x = time, ymin= min, ymax = max), fill= "red", alpha = 0.3)+
  geom_line(aes(x = time, y = value, color = key))



来源:https://stackoverflow.com/questions/48204985/fill-area-between-multiple-lines-in-plot

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!