【问题标题】:Fill area under the curve - R plot曲线下的填充区域 - R 图
【发布时间】:2018-11-01 20:47:02
【问题描述】:

我正在尝试用颜色填充绘图曲线下的区域。这是我的数据:

WOL EB1 EB2 EB3
-4  -9.61818    5.38182 15.38182
-3  -11.75152   3.24848 13.24848
-2  -13.01212   1.98788 11.98788
-1  -16.16364   -1.16364    8.83636
1   -33.8606    -18.8606    -8.8606
2   -27.897 -12.897 -2.897
3   -25.4242    -10.4242    -0.4242
4   -23.09697   -8.09697    1.90303
5   -21.01212   -6.01212    3.98788
6   -18.73333   -3.73333    6.26667
7   -16.45455   -1.45455    8.54545
8   -16.06667   -1.06667    8.93333
9   -15.193939  -0.193939   9.806061
10  -14.175758  0.824242    10.824242
11  -12.13939   2.86061 12.86061
12  -11.84848   3.15152 13.15152

我的代码是:

cord.x <- c(eb$WOL)
cord.y <- c(eb$EB1)
polygon(cord.x,cord.y,col='red',border = NA)

但这填满了上面的区域,我找不到下面的区域。 我也尝试了 plotly 包,但没有成功。 我的愿望是拥有三个曲线(WOL~EB1;WOL~EB2;和 WOL~EB3)和三个对应的不同颜色的区域。

你能帮忙吗? 非常感谢, 芳

【问题讨论】:

  • 提示,您可以使用dput(eb) 打印一个易于共享的数据版本。

标签: r ggplot2 polygon


【解决方案1】:

您可以将gatherdplyr 一起使用,然后使用ggplot

require(tidyverse)

df %>%
  gather(iv, value, -WOL) %>%
  ggplot(aes(x=WOL, y=value)) +
  geom_area(aes(fill=iv))

更新(每 cmets)

默认情况下,geom_area() 具有position="stacked",这可能会使值在 y 轴上看起来失真。您可以改用position="dodge",甚至geom_polygon(),以获得不同的效果:

geom_area(position="dodge")

df %>%
  gather(iv, value, -WOL) %>%
  ggplot(aes(x=WOL, y=value, fill=iv)) +
  geom_area(position=position_dodge(0), alpha=.7)

geom_polygon()

df %>%
  gather(iv, value, -WOL) %>%
  ggplot(aes(x=WOL, y=value, fill=iv)) +
  geom_polygon()

【讨论】:

  • 哇,这正是我想要的。谢谢安德鲁
  • 不客气!如果此答案解决了您的问题,请单击答案左侧的复选标记将其标记为已接受。 (如果你觉得合适,你也可以投票。)
  • 嗨 Andrew:EB3 怎么会有比 EB2 小的值?数据显示不是!它应该远高于EB2的面积?
  • 不是数值高了,只是层次叠加了。就像在堆积条形图中一样。您可以更改position 参数来调整它。您也可以改用geom_polygon。我会用例子更新我的答案。
【解决方案2】:

我认为您可以在 R 中使用 ggplot2 包来实现您的要求。这是将生成下面的图的代码(我相信这就是您正在寻找的:一条带有阴影区域的曲线):

data<-data.frame(cbind(WOL,EB1,EB2,EB3))
library(ggplot2)
g<-ggplot(data=data,aes(x=WOL,y=EB1))+
  geom_line() + 
  geom_ribbon(data = data[data$WOL<max(data$WOL),],aes(x=WOL,ymax=EB1),ymin=0,fill="red", alpha=0.5)+
  ggtitle("WOL vs EB1")+
  theme(plot.title = element_text(hjust=0.5))
g

对 EB2 和 EB3 做同样的事情。

【讨论】:

  • 这是我在使用多边形时得到的,但我想要的是在您创建的图中填充当前“灰色”的区域。对不起,我没有在问题中说清楚
  • 您不认为该区域延伸到-ve y 方向并且您想遮蔽它吗?我认为这不会是一个可以遮荫的封闭区域。它必须是一个有界区域。
  • 我刚刚又看了安德鲁上面的答案,是的,你是对的。我犯了一个错误。它应该是有界区域。谢谢
【解决方案3】:

如果您想要交互式绘图(您提到了plotly),这是使用highcharter 包的解决方案

library(tidyverse)
library(highcharter)

eb <- read.table(text = "WOL EB1 EB2 EB3
                  -4  -9.61818    5.38182 15.38182
                 -3  -11.75152   3.24848 13.24848
                 -2  -13.01212   1.98788 11.98788
                 -1  -16.16364   -1.16364    8.83636
                 1   -33.8606    -18.8606    -8.8606
                 2   -27.897 -12.897 -2.897
                 3   -25.4242    -10.4242    -0.4242
                 4   -23.09697   -8.09697    1.90303
                 5   -21.01212   -6.01212    3.98788
                 6   -18.73333   -3.73333    6.26667
                 7   -16.45455   -1.45455    8.54545
                 8   -16.06667   -1.06667    8.93333
                 9   -15.193939  -0.193939   9.806061
                 10  -14.175758  0.824242    10.824242
                 11  -12.13939   2.86061 12.86061
                 12  -11.84848   3.15152 13.15152",
                 header = TRUE)

eb %>% 
  gather(iv, value, -WOL) -> eb_long
str(eb_long)
#> 'data.frame':    48 obs. of  3 variables:
#>  $ WOL  : int  -4 -3 -2 -1 1 2 3 4 5 6 ...
#>  $ iv   : chr  "EB1" "EB1" "EB1" "EB1" ...
#>  $ value: num  -9.62 -11.75 -13.01 -16.16 -33.86 ...

hchart(eb_long, "polygon", hcaes(x = WOL, y = value, 
                                 group = iv,
                                 color = iv, 
                                 fill  = iv))

reprex package (v0.2.0) 于 2018 年 5 月 22 日创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2020-07-02
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多