R ggplot2条形图内的分组

R ggplot2条形图内的分组,r,plot,ggplot2,R,Plot,Ggplot2,我希望以一个数据集为例,公司1拥有“联想”产品和“戴尔”产品。我想对数据集的每个部分进行细分,以显示“这些是联想的客户(如果联想==1),其中哪些产品也有戴尔产品,或者也有三星产品,或者可能只有联想产品。如果可能的话,我希望以堆叠条形图或刻面网格的形式显示。理想的图表将每个产品显示为单条,其中条形图由这些客户包含的其他产品的计数着色。 例如,如果有100个联想客户,其中20个客户也有戴尔,25个客户也有苹果,10个客户有三星(注意其中一些客户可能重叠,可能有一个客户有三星和戴尔,这将计入戴尔的2

我希望以一个数据集为例,公司1拥有“联想”产品和“戴尔”产品。我想对数据集的每个部分进行细分,以显示“这些是联想的客户(如果联想==1),其中哪些产品也有戴尔产品,或者也有三星产品,或者可能只有联想产品。如果可能的话,我希望以堆叠条形图或刻面网格的形式显示。理想的图表将每个产品显示为单条,其中条形图由这些客户包含的其他产品的计数着色。

例如,如果有100个联想客户,其中20个客户也有戴尔,25个客户也有苹果,10个客户有三星(注意其中一些客户可能重叠,可能有一个客户有三星和戴尔,这将计入戴尔的20个客户和三星的10个客户),该栏将显示戴尔20色,苹果25色,三星10色,其余颜色仅为联想,无其他产品。--然后,这将复制到戴尔,以及哪些戴尔客户的产品与其他组…等等

可复制数据:

a <- paste0("abcd", c(1:185))
dell <- sample(c(1, 0, 0), size = 185, replace = TRUE)
apple <- sample(c(1, 0, 0, 0, 0), size =185, replace = TRUE)
lenovo <- sample(c(1, 0), size = 185, replace = TRUE)
samsung <- sample(c(1, 0), size = 185, replace = TRUE)
df <- data.frame(a, dell, apple, lenovo, samsung)
我尝试的另一种方法是,数据是逐行显示的,如果有戴尔、苹果和三星的客户,它们将由3行表示。这样我就可以根据产品来划分网格。问题是,我很难显示这一行客户abcd1有苹果,也有三星和戴尔,一个我想象一下


非常感谢您的帮助!

这是您首先提到的吗?如果是,请告诉我,我会编辑并解释

library(tidyverse)
library(rlang)

computers <- c("dell", "apple", "lenovo", "samsung")


all_dfs <-
  map(computers, ~ {
    df %>%
      gather(computer, count, !!.x) %>%
      gather(cat, value, setdiff(computers, !!.x)) %>%
      mutate(cat = ifelse(count == 0, "they use same company", cat))
  }) %>%
  reduce(bind_rows)

all_dfs %>%
  ggplot(aes(computer, fill = cat)) +
  geom_bar()
库(tidyverse)
图书馆(rlang)
计算机%
聚集(cat、value、setdiff(计算机、!!.x))%>%
变异(cat=ifelse(count=0,“他们使用同一个公司”,cat))
}) %>%
减少(绑定行)
所有dfs%>%
ggplot(aes(计算机,填充=cat))+
geom_bar()
旨在获取一个整洁的数据框,执行广泛的矩阵操作,并重新整理它。在这里,我首先整理您的数据,创建一个列,将每个产品作为行,并为每个客户创建一个具有二进制所有权状态的列。然后删除“没有”行(
hasproduct!=0
),并对所有产品进行成对计数

library(tidyr)
library(widyr)
library(ggplot2)
library(dplyr)

data_frame(a = paste0("abcd", c(1:185)),
           dell = sample(c(1, 0, 0), size = 185, replace = TRUE),
           apple = sample(c(1, 0, 0, 0, 0), size = 185, replace = TRUE),
           lenovo = sample(c(1, 0), size = 185, replace = TRUE),
           samsung = sample(c(1, 0), size = 185, replace = TRUE)) %>% 
  gather(key = product, value = hasproduct, -a) %>% 
  filter(hasproduct != 0) %>% 
  widyr::pairwise_count(product, a, diag = T) %>% 
  ggplot(aes(item1, n, fill = item2)) + 
  geom_col(position = "stack")


如果您不想计算每个组的大小(拥有苹果产品的苹果所有者)然后将
diag=T
更改为
diag=F

这太棒了,布莱恩,谢谢!我遇到的唯一问题是如何表示数据,而不是可视化的问题是,如果有人拥有3个产品,它会复制6次,因为会有6个独特的成对版本。这意味着,如果同一个帐户与戴尔和联想共享,苹果将有两个相同的帐户上市。对此有什么想法吗?这就是你进行比较的全部想法,不是吗?你不想显示这6对中的哪一对?唯一仍能捕获所有信息的方法是计算概率之类的事情一个苹果所有者同时也是其他类别的所有者,这可能是一个热图。然后你忽略了整体群体规模,如图所示。这是一种比较的想法,有点…,它夸大了实际存在的账户。我意识到的问题是,你需要将每种组合排列成一种颜色,这将如果有8000个帐户,7000个有1个其他产品,1000个有2个其他产品,结果将显示9000个帐户,7000个颜色为一个东西,1000个复制显示其他两个产品。这种复制(我现在意识到)这是一个问题,因为它看起来有9000个帐户,而不是8000个。你的答案是完美的顺便说一句,这是我使用它的困难。
library(tidyr)
library(widyr)
library(ggplot2)
library(dplyr)

data_frame(a = paste0("abcd", c(1:185)),
           dell = sample(c(1, 0, 0), size = 185, replace = TRUE),
           apple = sample(c(1, 0, 0, 0, 0), size = 185, replace = TRUE),
           lenovo = sample(c(1, 0), size = 185, replace = TRUE),
           samsung = sample(c(1, 0), size = 185, replace = TRUE)) %>% 
  gather(key = product, value = hasproduct, -a) %>% 
  filter(hasproduct != 0) %>% 
  widyr::pairwise_count(product, a, diag = T) %>% 
  ggplot(aes(item1, n, fill = item2)) + 
  geom_col(position = "stack")