【问题标题】:Sort/group individual facets together in ggplot在ggplot中将各个方面排序/分组
【发布时间】:2020-11-03 15:41:59
【问题描述】:

我创建了一个分面图(在 ggplot 中)来说明个人的活动数据(因此他们按参与者 ID 分面)。创建此图的data 格式很长。

What I have now: Individuals' data shown in a faceted pie chart plot

我使用下面的代码来生成上面的图表。

ggplot(reshaped_my_data_NAs_selected, aes(x = "", y = value, fill = variable)) +
  geom_bar(width = 1, stat = "identity", color = "white") +
  coord_polar("y", start = 0)+
  scale_fill_manual(values=cbPalette, labels = c("Social Media", "Messaging", "Browsing", "Other Smartphone","Offline"))+
  theme_void()+
  facet_wrap(~PPNR, ncol = 18)+
  labs(title = "Individuals' Activities Division", fill="Activity") +
  theme(legend.position = "bottom",legend.box.spacing = unit(0.4, "cm"), plot.title = element_text(margin=margin(0,0,15,0),size=18))

现在,对于每个人,我都有一个变量,称为“最常用”,它表明该参与者完成的活动最多,我想根据此信息对参与者(即方面)进行分组。因此,使用社交媒体最多的参与者,使用消息应用程序最多的参与者也分组在一起,等等。理想情况下,图形的布局将保持不变(我非常喜欢它现在的样子),但如果布局会稍微改变一下,我可以忍受。

我也尝试过使用 facet_grid 的各种变体,但这些都没有给我想要的结果。我最接近我需要的是this,但我不希望单独的图表像那样展开,并且“最常用的活动”组在视觉上仍然不够分组。

目前我的替代策略是剪下单个图表并在 Photoshop 中重新排列它们,但我更愿意避免这种情况。呵呵

提前非常感谢!

【问题讨论】:

  • 请使用dput()或直接数据框,并发布一些示例数据。
  • 我建议计算个人的组内排名,然后根据 y 方向的排名和 x 方向的活动来计算 facet_grid。您可以使用 geom_text() 注释个人,而不是使用分面条来执行此操作。

标签: r sorting ggplot2


【解决方案1】:

这只是我在问题下的评论的代码示例。

一种选择是计算组内排名并使用排名和类别来facet_grid() 数据。下面是一些虚拟数据的示例:

library(tidyverse)

df <- data.frame(
  individual = rep(1:10, each = 3),
  var = rep(c("apple", "lemon", "banana"), 10),
  prop = c(0.8, 0.1, 0.1,
           0.2, 0.6, 0.2,
           0.2, 0.2, 0.6,
           0.6, 0.2, 0.2,
           0.1, 0.8, 0.1,
           0.1, 0.1, 0.8,
           0.5, 0.25, 0.25,
           0.25, 0.5, 0.25,
           0.25, 0.25, 0.5,
           0.05, 0.9, 0.05)
)


newdf <- df %>% group_by(individual) %>%
  # Find maximum category
  mutate(max = var[which.max(prop)]) %>%
  group_by(max) %>%
  # Rank within groups (is this the best way to rank them? idk)
  mutate(rank = rep.int(rank(prop[which(var == max)]),
                        rle(individual)$length))

ggplot(newdf, aes(1, prop, fill = var)) +
  geom_col(position = "stack") +
  geom_text(aes(1, 0.5, label = individual),
            data = newdf[!duplicated(newdf$individual),]) +
  facet_grid(rank ~ max) +
  scale_y_continuous(expand = c(0,0), breaks = NULL) +
  scale_x_continuous(expand = c(0,0), breaks = NULL) +
  coord_polar(theta = "y")

reprex package (v0.3.0) 于 2020 年 11 月 3 日创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2023-04-08
    • 2023-03-15
    • 1970-01-01
    • 2023-03-03
    • 2020-06-28
    相关资源
    最近更新 更多