1

我有一个基于我的数据的图nd,其中三个分别geom_line()显示了 1 年:nd$y_et、3 年:nd$y_tre和 5 年:后的死亡概率nd$y_fem,作为切除淋巴结数量的函数nd$n_fjernet

问题:如何填充三个个体下方的每个区域geom_line()nd$y_et, y_tre, y_fem而不会使填充与后续geom_line+重叠fill

我尝试过geom_areageom_polygon但甚至没有接近正确的解决方案。

当前地块

在此处输入图像描述

ggplot(nd, aes(x=n_fjernet))  +
         geom_line(aes(y=y_et)) + 
         geom_line(aes(y=y_tre)) + 
         geom_line(aes(y=y_fem)) +    scale_x_continuous(breaks = seq(0,25,5), limits=c(0,25))

应该给出预期的输出:

在此处输入图像描述

更新

我应用了下面提供的解决方案,产生

ndd %>% 
  rename(X3=y_et, X2=y_tre, X1=y_fem) %>% 
  pivot_longer(values_to="N", names_to="Variable", cols=c(X1:X3)) %>%
  ggplot(aes(x=n_fjernet, y=N, fill=Variable, colour=Variable)) +
  geom_area(position=position_identity(), alpha=.15) +
  geom_line(size=3, color="white") +
  geom_line(size=.75) +
  scale_fill_manual(values=c("#2C77BF", "#E38072", "#6DBCC3")) +
  scale_colour_manual(values=c("#2C77BF", "#E38072", "#6DBCC3")) +
  scale_x_continuous(breaks = seq(0,10,5), limits=c(0,10))

在此处输入图像描述

当我们接近预期的情节时,不幸的是仍然重叠fills。后面blue-fill可以看到;red-fill并且,blue-fillred-fill都在 后面green-fill

问题:如何包含fills不重叠的?

我的数据nd

    nd <- structure(list(y_et = c(0.473, 0.473, 0.472, 0.471, 0.471, 0.47, 
0.47, 0.469, 0.468, 0.468, 0.467, 0.467, 0.466, 0.465, 0.465, 
0.464, 0.464, 0.463, 0.462, 0.462, 0.461, 0.461, 0.46, 0.459, 
0.459, 0.458, 0.458, 0.457, 0.456, 0.456, 0.455, 0.455, 0.454, 
0.453, 0.453, 0.452, 0.452, 0.451, 0.45, 0.45, 0.449, 0.449, 
0.448, 0.447, 0.447, 0.446, 0.446, 0.445, 0.445, 0.444, 0.443, 
0.443, 0.442, 0.442, 0.441, 0.44, 0.44, 0.439, 0.439, 0.438, 
0.438, 0.437, 0.436, 0.436, 0.435, 0.435, 0.434, 0.433, 0.433, 
0.432, 0.432, 0.431, 0.431, 0.43, 0.429, 0.429, 0.428, 0.428, 
0.427, 0.427, 0.426, 0.425, 0.425, 0.424, 0.424, 0.423, 0.423, 
0.422, 0.421, 0.421, 0.42, 0.42, 0.419, 0.419, 0.418, 0.417, 
0.417, 0.416, 0.416, 0.415), y_tre = c(0.895, 0.894, 0.894, 0.893, 
0.893, 0.893, 0.892, 0.892, 0.891, 0.891, 0.89, 0.89, 0.889, 
0.889, 0.889, 0.888, 0.888, 0.887, 0.887, 0.886, 0.886, 0.886, 
0.885, 0.885, 0.884, 0.884, 0.883, 0.883, 0.882, 0.882, 0.881, 
0.881, 0.881, 0.88, 0.88, 0.879, 0.879, 0.878, 0.878, 0.877, 
0.877, 0.876, 0.876, 0.875, 0.875, 0.875, 0.874, 0.874, 0.873, 
0.873, 0.872, 0.872, 0.871, 0.871, 0.87, 0.87, 0.869, 0.869, 
0.868, 0.868, 0.867, 0.867, 0.866, 0.866, 0.865, 0.865, 0.865, 
0.864, 0.864, 0.863, 0.863, 0.862, 0.862, 0.861, 0.861, 0.86, 
0.86, 0.859, 0.859, 0.858, 0.858, 0.857, 0.857, 0.856, 0.856, 
0.855, 0.855, 0.854, 0.854, 0.853, 0.853, 0.852, 0.852, 0.851, 
0.851, 0.85, 0.85, 0.849, 0.848, 0.848), y_fem = c(0.974, 0.974, 
0.973, 0.973, 0.973, 0.973, 0.973, 0.973, 0.972, 0.972, 0.972, 
0.972, 0.972, 0.971, 0.971, 0.971, 0.971, 0.971, 0.971, 0.97, 
0.97, 0.97, 0.97, 0.97, 0.969, 0.969, 0.969, 0.969, 0.969, 0.968, 
0.968, 0.968, 0.968, 0.968, 0.967, 0.967, 0.967, 0.967, 0.967, 
0.966, 0.966, 0.966, 0.966, 0.966, 0.965, 0.965, 0.965, 0.965, 
0.965, 0.964, 0.964, 0.964, 0.964, 0.963, 0.963, 0.963, 0.963, 
0.963, 0.962, 0.962, 0.962, 0.962, 0.961, 0.961, 0.961, 0.961, 
0.961, 0.96, 0.96, 0.96, 0.96, 0.959, 0.959, 0.959, 0.959, 0.958, 
0.958, 0.958, 0.958, 0.957, 0.957, 0.957, 0.957, 0.957, 0.956, 
0.956, 0.956, 0.956, 0.955, 0.955, 0.955, 0.955, 0.954, 0.954, 
0.954, 0.954, 0.953, 0.953, 0.953, 0.952), n_fjernet = c(0, 0.1, 
0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 
1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 
2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 
4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5, 5.1, 5.2, 5.3, 
5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 
6.7, 6.8, 6.9, 7, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 
8, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9, 9.1, 9.2, 
9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9)), row.names = c(NA, -100L), class = c("data.table", 
"data.frame"))
4

1 回答 1

2
nd %>% 
  pivot_longer(values_to="N", names_to="Variable", cols=c(y_fem:y_et)) %>% 
  ggplot(aes(x=n_fjernet, y=N, fill=Variable)) + geom_area()

在此处输入图像描述

这只是在您的目标上下文中整理您的数据的问题。在这里,您的数据并不整洁,因为您的列名包含信息。

回应以下OP的评论......

啊! 这让事情变得有点棘手。positiona中的默认值geom_areastack,这意味着每个彩色区域的高度是对应变量的高度(堆栈的总高度是各个值的总和 - 例如 at n_fjernet= 0 , you havey_fem = 0.981 ,y_tre = 0.9199 andy_et = 0.514 , giving a total stack height of about2.5`. 查看原始图表,您希望以原始值绘制每条线,并填补该线与其下一个 lowext 同伴之间的空白,对吗?

原则上,这很容易。你可以position=position_identity()在你的geom_area(). 但是,如果这将按您希望的方式工作,您需要手动跟踪变量值的顺序。例如,使用您的数据,我们得到:

nd %>% 
  pivot_longer(values_to="N", names_to="Variable", cols=c(y_fem:y_et)) %>% 
  ggplot(aes(x=n_fjernet, y=N, fill=Variable)) + 
  geom_area(position=position_identity())

在此处输入图像描述

根本不是你想要的。

在此特定情况下获得正确结果的一种非常老套的方法是

nd %>% 
  rename(X3=y_et, X2=y_tre, X1=y_fem) %>% 
  pivot_longer(values_to="N", names_to="Variable", cols=c(X1:X3)) %>% 
  ggplot(aes(x=n_fjernet, y=N, fill=Variable)) +   
  geom_area(position=position_identity())

在此处输入图像描述

您还可以通过自定义用于创建填充的比例来控制绘制区域的顺序,如此处所述

另一种选择是使用geom_ribbon而不是geom_area. 但无论您使用哪种方法,如果不手动控制创建填充的顺序,我不知道如何做到这一点。这似乎是想要将值绘制在其绝对位置并填充下方区域的必然结果。我能想到的唯一可能性是为每个填充设置一个小于 1 的 alpha 值。但是,就个人而言,我认为这看起来很丑:

nd %>% 
  pivot_longer(values_to="N", names_to="Variable", cols=c(y_fem:y_et)) %>% 
  ggplot(aes(x=n_fjernet, y=N, fill=Variable)) + 
  geom_area(position=position_identity(), alpha=0.4)

在此处输入图像描述

如果沿 x 轴移动时变量的顺序发生变化,您会怎么做?就个人而言,我会放弃填充,只使用不同颜色的线条。但这是你的电话。

如果有人有更好的选择,我很想看看。

* 编辑 2 * 回答 OP 关于手动控制颜色的问题:

nd %>% 
  rename(X3=y_et, X2=y_tre, X1=y_fem) %>% 
  pivot_longer(values_to="N", names_to="Variable", cols=c(X1:X3)) %>% 
  ggplot(aes(x=n_fjernet, y=N, fill=Variable, colour=Variable)) + 
  geom_area(position=position_identity()) +
  geom_line() +
  scale_fill_manual(values=c("pink", "darkseagreen2", "steelblue2")) +
  scale_colour_manual(values=c("red", "green4", "blue"))

给我

在此处输入图像描述

据我所知,我的代码与您的代码非常相似,所以我不确定为什么它对我有用,而不对你有用。【你记得放colour=Variable 里面 aes()吗?】

我从这里得到我的颜色。

你在评论中提到geom_point。那是错字吗?

顺便说一句,我们不需要全部 200 个数据点来解决这个问题。半打就够了。最多十几个。下次吧... ;)

于 2020-06-06T09:58:01.823 回答