首页 > 解决方案 > 如何在 R 中绘制堆叠排序的带状图

问题描述

我想创建一个堆叠的排序功能区图,如下所示。

功能区图

data_orange <- data.frame("Y" = c(0.16,0.10,0.05,0,0.), 
                          "X" = c(2000,2001,2002,2003,2004,2005))

data_light_blue <- data.frame("Y" = c(0.17,0.16,0.14,0.13,0.12), 
                              "X" = c(2000,2001,2002,2003,2004,2005))

data_blue <- data.frame("Y" = c(0.00,0.01,0.04,0.08,0.12), 
                        "X" = c(2000,2001,2002,2003,2004,2005))

data_red <- data.frame("Y" = c(0.36,0.32,0.26,0.19,0.09), 
                       "X" = c(2000,2001,2002,2003,2004,2005))

我通过 excel 制作了这张图,但想在 r-studio 中做。

标签: rggplot2

解决方案


这是一种使用方法geom_ribbon,您可以操纵它来获得您正在寻找的结果。它需要对数据进行一些重新格式化:

df2 <- data.frame(x=c(2000,2001,2002,2003,2004,2000,2001,2002,2003,2004,2000,2001,2002,2003,2004,2000,2001,2002,2003,2004), y=c(0.16,0.10,0.05,0,0,0.17,0.16,0.14,0.13,0.12,0,0.01,0.04,0.08,0.12,0.36,0.32,0.26,0.19,0.09), group=c("orange","orange","orange","orange","orange","lightblue","lightblue","lightblue","lightblue","lightblue","blue","blue","blue","blue","blue","red","red","red","red","red"))

> df2
      x    y     group
1  2000 0.16    orange
2  2001 0.10    orange
3  2002 0.05    orange
4  2003 0.00    orange
5  2004 0.00    orange
6  2000 0.17 lightblue
7  2001 0.16 lightblue
8  2002 0.14 lightblue
9  2003 0.13 lightblue
10 2004 0.12 lightblue
11 2000 0.00      blue
12 2001 0.01      blue
13 2002 0.04      blue
14 2003 0.08      blue
15 2004 0.12      blue
16 2000 0.36       red
17 2001 0.32       red
18 2002 0.26       red
19 2003 0.19       red
20 2004 0.09       red

现在你可以像这样绘制。更改常数 (20) 以更改色带的宽度。

ggplot(df2, aes(x=x, y=y, group=group, colour=group)) + 
  geom_ribbon(aes(ymin=v-20*y, ymax=v+20*y, fill=group), alpha=0.2) +
  geom_line()

在此处输入图像描述

[在提问者添加数据后,很明显下面的解决方案不适合数据类型的图表,但将答案留在这里以防有人正在寻找 sankey 图。]

尽管有更漂亮的选项(例如networkD3),但制作带状图最直接的方法是使用sankey包。这是来自的示例https://cran.r-project.org/web/packages/sankey/sankey.pdf

edges <- read.table(stringsAsFactors = FALSE, textConnection(
" get_deps get_description
get_deps parse_deps
get_deps %||%
get_deps drop_internal
get_description pkg_from_filename
parse_deps str_trim
cran_file get_pkg_type
cran_file r_minor_version
download_urls split_pkg_names_versions
download_urls cran_file
pkg_download dir_exists
pkg_download download_urls
pkg_download filename_from_url
pkg_download try_download
restore pkg_download
restore drop_missing_deps
restore install_order
restore get_deps
split_pkg_names_versions data_frame
"))

数据结构如下所示:

> edges
                         V1                       V2
1                  get_deps          get_description
2                  get_deps               parse_deps
3                  get_deps                     %||%
4                  get_deps            drop_internal
5           get_description        pkg_from_filename
6                parse_deps                 str_trim
7                 cran_file             get_pkg_type
8                 cran_file          r_minor_version
9             download_urls split_pkg_names_versions
10            download_urls                cran_file
11             pkg_download               dir_exists
12             pkg_download            download_urls
13             pkg_download        filename_from_url
14             pkg_download             try_download
15                  restore             pkg_download
16                  restore        drop_missing_deps
17                  restore            install_order
18                  restore                 get_deps
19 split_pkg_names_versions               data_frame

此代码生成图:

pkgsnap_sankey <- make_sankey(edges = edges)
sankey(pkgsnap_sankey)

在此处输入图像描述


推荐阅读