【问题标题】:geom_waffle not showing one cellgeom_waffle 没有显示一个单元格
【发布时间】:2021-12-29 14:35:48
【问题描述】:

我一直在使用 waffle 包,但我无法解决如何修复这个华夫饼图,使其显示 100 个正方形/单元格

这是数据和我的代码:

# devtools::install_github("hrbrmstr/waffle")
library(ggplot) 
library(waffle)

data <- structure(list(greenfield = c(0, 1), n = c(162L, 399L), total_investments = c(561, 
561), percentage = c(28.8770053475936, 71.1229946524064), name_greenfield = c("M&A", 
"Greenfield")), row.names = c(NA, -2L), groups = structure(list(
    greenfield = c(0, 1), .rows = structure(list(1L, 2L), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

# Waffle plot

ggplot(data,
       aes(fill = name_greenfield,
           values = percentage))  +
  coord_equal() +
  geom_waffle(size = 0.31,  
              flip = T, 
              make_proportional = T, 
              height = 0.9, width = 0.9,
              color = "white") +
  coord_equal() + 
  theme_ipsum_rc(grid="",
                 plot_title_face = "plain",
                 plot_title_size = 14,
                 plot_title_margin = 0) +
  theme_enhance_waffle()  +
  labs(title = "Types of investments",
       fill = "",
       caption = "Source: Author's own elaboration") + 
  scale_fill_grey(start = 0.4, end = 0.7)

我还没有发现问题,如果有人可以帮助我,我将不胜感激!

【问题讨论】:

    标签: r ggplot2 waffle-chart


    【解决方案1】:

    代码中有一个非常非常奇怪的错误。这是我怀疑正在发生的事情。在 GitHub 上的源代码中,有一个文件stat-waffle.R。在第 93 行,您会发现:

    if (params[["make_proportional"]]) {
      .x[["values"]] <- .x[["values"]] / sum(.x[["values"]])
      .x[["values"]] <- round_preserve_sum(.x[["values"]], digits = 2)
      .x[["values"]] <- as.integer(.x[["values"]] * 100)
    }
    

    你的价值观发生了一些非常奇怪的事情。

    .x <- list(values = c(29, 71))
    
    .x[["values"]] <- .x[["values"]] / sum(.x[["values"]])
    # [1] 0.29 0.71
    .x[["values"]] <- waffle:::round_preserve_sum(.x[["values"]], digits = 2)
    # [1] 0.29 0.71
    .x[["values"]] <- as.integer(.x[["values"]] * 100)
    # [1] 28 71
    

    这就是为什么您会看到一个缺失的正方形。它与浮点数学有关。

    format(round(.x$values / sum(.x$values), 2) * 100, digits = 22)
    # [1] "28.999999999999996" "71.000000000000000"
    

    如果您进行此修改,结果将如预期的那样。

    .x[["values"]] <- as.integer(round(.x[["values"]] * 100))
    # [1] 29 71
    

    这对您意味着什么?将您的数字四舍五入为提前总和为 100 的整数并使用make_proportional = FALSE。这样代码块就不会运行。

    data$percentage <- as.integer(round(round(data$percentage / sum(data$percentage), 2) * 100))
    data$percentage
    # [1] 29 71
    
    ggplot(data,
           aes(fill = name_greenfield,
               values = percentage))  +
      coord_equal() +
      geom_waffle(size = 0.31,  
                  flip = T, 
                  make_proportional = FALSE, 
                  height = 0.9, width = 0.9,
                  color = "white") +
      coord_equal() + 
      theme_enhance_waffle()  +
      labs(title = "Types of investments",
           fill = "",
           caption = "Source: Author's own elaboration") + 
      scale_fill_grey(start = 0.4, end = 0.7)
    

    这应该会满足您的期望。

    【讨论】:

    • 哇哇非常感谢!!!我尝试了一切并开始放弃......非常感谢,我不会猜到是错误!
    • 没问题!让我非常沮丧的是,像 R 这样的语言有这样的问题。 as.integer(29 / 100 * 100) 不应等于 28
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多