首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的3层甜甜圈图

R中的3层甜甜圈图
EN

Stack Overflow用户
提问于 2022-08-12 12:08:18
回答 2查看 166关注 0票数 5

我试图在R中重新创建这个图像,但是我无法想出如何将3层图层放到一个甜甜圈图中--我找到的所有东西(例如,webr::PieDonut)都只允许2层。使用ggplot,我也无法重新创建它。

A MRE是:

代码语言:javascript
复制
library(ggplot2)
library(webr)
library(dplyr)

lexicon <- data.frame("Level1" = c(rep("Flavour", 11), rep("Appearance", 4)),
                  "Level2" = c(rep("Misc", 6), rep("Pungent", 5), rep("Colour", 4)),
                  "Level3" = c("Fresh", "Refreshing", "Soapy", "Minty", "Nutty", "Milky", "Peppery", "Sharp", "Horseradish", "Mustard hot", "Spicy", "Colourful"," Fresh Green", "Dark Green", "Bright Green")
)

PieDonut(lexicon, aes(Level1, Level2), title = "Salad Lexicon", showRatioDonut =FALSE, showRatioPie = FALSE)

ggplot(lexicon, aes(Level2, Level3, fill = Level1)) +
  geom_col() +
  scale_fill_viridis_d() +
  coord_polar("y")

虽然PieDonut适用于2个级别(未显示),但它不允许包含最终级别。如下图所示,ggplot方法也不起作用。

我怎样才能在R中得到这种风格的图表呢?无论是用ggplot还是基本绘图。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-12 13:30:07

我认为一个很好的选择是在进行一些数据操作之后在这里使用geom_rect。使用填充、颜色和alpha标度可以帮助改善类别的差异。我也会在这里使用geom_textpath,不过,如果有这样做的余地,我可能会选择圆周标签:

代码语言:javascript
复制
lexicon %>%
  mutate(top_level = Level1) %>%
  pivot_longer(1:3) %>%
  group_by(name, value) %>%
  mutate(width = n()) %>%
  unique() %>%
  arrange(name) %>%
  group_by(name) %>%
  mutate(ymid = as.numeric(sub("\\D+", "", name)),
         ymax = ymid + 0.5, ymin = ymid - 0.5,
         xmin = c(0, head(cumsum(width), -1)),
         xmax = cumsum(width),
         xmid = (xmax + xmin) / 2) %>%
  ggplot(aes(xmid, ymid, fill = top_level)) +
  geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax,
                alpha = name, color = top_level)) +
  geomtextpath::geom_textpath(aes(y = ymid + 0.25, label = value, 
                                  group = value)) +
  scale_alpha_manual(values = c(1, 0.3, 0.1)) +
  scale_fill_manual(values = c("#cd9900", "#00817e")) +
  scale_colour_manual(values = c("#cd9900", "#00817e")) +
  scale_y_continuous(limits = c(-0.5, 3.6)) +
  coord_polar() +
  theme_void() +
  theme(legend.position = "none")

票数 7
EN

Stack Overflow用户

发布于 2022-08-12 12:43:32

一种选择是将您的数据重组为long,并在传递到ggplot之前进行一些手动聚合。此外,我还使用geomtextpath::geom_textpath添加标签:

代码语言:javascript
复制
library(ggplot2)
library(dplyr)
library(geomtextpath)

lexicon <- data.frame("Level1" = c(rep("Flavour", 11), rep("Appearance", 4)),
                      "Level2" = c(rep("Misc", 6), rep("Pungent", 5), rep("Colour", 4)),
                      "Level3" = c("Fresh", "Refreshing", "Soapy", "Minty", "Nutty", "Milky", "Peppery", "Sharp", "Horseradish", "Mustard hot", "Spicy", "Colourful"," Fresh Green", "Dark Green", "Bright Green")
)

lexicon_long <- lexicon |>
  mutate(fill = Level1) |>
  tidyr::pivot_longer(-fill, names_to = "level", values_to = "label") |>
  mutate(label = forcats::fct_inorder(label)) |> 
  count(fill, level, label) |>
  group_by(level) |>
  mutate(pct = n / sum(n))

ggplot(lexicon_long, aes(level, pct, fill = fill)) +
  geom_col(color = "white") +
  geom_textpath(aes(label = label, group = label),
                position = position_stack(vjust = .5),
                upright = TRUE, hjust = .5, size = 3
  ) +
  scale_fill_viridis_d() +
  coord_polar("y") +
  theme_void() +
  guides(fill = "none")

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73333971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档