ggplot2 绘制 100% 堆积面积图

UDE*_*ent 1 r ggplot2

我想从数据框中绘制 100% 堆积面积图,其中 df 的每一行总和为 1。示例数据框在这里:https : //pastebin.com/ADMQP6Nx

我最终想要的是这样的: 在此处输入图片说明

到目前为止,我在 SO 上找到的大多数解决方案都有不同的 data.frame 结构,其中分组变量定义为行而不是列,例如:

+--------+-------+-------+
| Period | Group | Value |
+--------+-------+-------+
| 1      | t1    | 0.3   |
| 1      | t2    | 0.1   |
| 1      | t3    | 0.4   |
| 1      | t4    | 0.2   |
| 2      | t1    | 0.5   |
| 2      | t2    | 0.1   |
| 2      | t3    | 0.3   |
| 2      | t4    | 0.2   |
| ...    | ...   | ...   |
+--------+-------+-------+
Run Code Online (Sandbox Code Playgroud)

然后他们像这样使用ggplot:

ggplot(data, aes(x=Period, y=Value, fill=Group)) +  geom_area()
Run Code Online (Sandbox Code Playgroud)

有没有不转换数据框的解决方案?

Jac*_*kes 6

转换数据gather

library(tidyverse)

df <- structure(
  list(
    Period = 1:4,
    t1 = c(0.3, 0.5, 0.1, 0.4),
    t2 = c(0.1, 0.1, 0.3,
           0.2),
    t3 = c(0.4, 0.2, 0.4, 0.3),
    t4 = c(0.2, 0.2, 0.2, 0.1)
  ),
  .Names = c("Period", "t1",
             "t2", "t3", "t4"),
  row.names = c(NA, -4L),
  class = "data.frame"
)


df %>% 
  gather(Group, Value, t1:t4) %>% 
  ggplot(aes(x=Period, y=Value, fill=Group)) + 
  geom_area()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • `data.table::melt` 的工作方式与 `tidyr::gather` 类似。在这种情况下,`melt(df, id.vars = "Period")`。也可以随意查看相关的 R-FAQ:[Reshaping data.frame from wide to long format](/sf/ask/152967671/)。 (2认同)