【问题标题】:ggplot sankey diagram of income to expenses (ggsankey)ggplot 收入支出桑基图(ggsankey)
【发布时间】:2021-10-30 17:43:52
【问题描述】:

我正在尝试制作收入支出桑基图,最好使用ggsankey 或其他 ggplot 扩展,因为我需要将最终图作为图像 (png)。这是我的数据:

data <- tibble::tribble(
                 ~Name, ~Annual.Amount,  ~Category,
    "Moira's Earnings",         50000L,   "Income",
   "Johnny's Earnings",        300000L,   "Income",
     "Living Expenses",        140000L, "Expenses",
       "Spent Savings",         25238L, "Expenses",
         "Liabilities",         44280L, "Expenses",
     "Planned Savings",         23000L, "Expenses",
               "Taxes",         98482L, "Expenses",
           "Insurance",         13000L, "Expenses"
  )

我正在尝试创建类似于此图的内容,但只有前 2 个流量,所有收入都从费用流向的一列中流出:

【问题讨论】:

    标签: r ggplot2 sankey-diagram


    【解决方案1】:
    library(tidyverse)
    library(networkD3)
    
    data <- tibble::tribble(
      ~Name, ~Annual.Amount,  ~Category,
      "Moira's Earnings",         50000L,   "Income",
      "Johnny's Earnings",        300000L,   "Income",
      "Living Expenses",        140000L, "Expenses",
      "Spent Savings",         25238L, "Expenses",
      "Liabilities",         44280L, "Expenses",
      "Planned Savings",         23000L, "Expenses",
      "Taxes",         98482L, "Expenses",
      "Insurance",         13000L, "Expenses"
    )
    
    Nodes = tibble(
      Name = c(data$Name, "Budget") %>% unique()
    ) %>% as.data.frame()
    
    
    df = data %>% filter(Category=="Income") %>%
      select(-Category) %>%
      rename(Source = Name) %>%
      mutate(Target = "Budget") %>%
      bind_rows(
        data %>%
          filter(Category=="Expenses") %>%
          select(-Category) %>%
          rename(Target = Name) %>%
          mutate(Source = "Budget")
      ) %>% mutate(
      IDSource = match(Source, Nodes$Name)-1,
      IDTarget = match(Target, Nodes$Name)-1
    ) %>% as.data.frame()
    
    sankeyNetwork(Links = df, Nodes = Nodes,
                  Source = "IDSource", Target = "IDTarget",
                  Value = "Annual.Amount", NodeID = "Name",
                  sinksRight=FALSE, fontSize = 16)
    

    小更新

    library(webshot)
    webshot::install_phantomjs()
    sankeyNetwork(Links = df, Nodes = Nodes,
                  Source = "IDSource", Target = "IDTarget",
                  Value = "Annual.Amount", NodeID = "Name",
                  sinksRight=FALSE, fontSize = 16) %>%
      saveNetwork("sn.html")
    
    webshot("sn.html", "sankeyNetwork.png")
    

    【讨论】:

    • 谢谢马雷克。我从 network3d 开始,并将其用于 ggplot 替代方案,因为我读到生成 png 很困难。我需要最终的图表作为图像。我现在正在尝试使用 webshot 库将 html 转换为 png。
    • 不幸的是,我在加载 ggsankey 包时遇到了问题。这就是我使用networkD3 包的原因。
    • 是的,它还没有在 CRAN 上。 devtools::install_github("davidsjoberg/ggsankey")
    • 恐怕现在很难用ggsankey 库准确地创建您想要的图形。到目前为止,我不明白如何在ggsankey 中设置knot 高度。 networkD3 很简单。有一个 Value 参数需要一个适当的变量,其值与链接(节点)的高度成正比。
    • 您好,感谢您的努力。是的,该库未针对用户定义的流进行优化。其他人也遇到了同样的问题 - 收入和支出:github.com/davidsjoberg/ggsankey/issues/14
    猜你喜欢
    • 2015-09-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2018-02-13
    相关资源
    最近更新 更多