如何清楚地可视化多个总和相同的值的计数

时间:2019-08-03 15:51:53

标签: r data-visualization

这是基于以下内容的数据可视化问题:

要求参与者考虑他们的5个最亲密的朋友。他们然后 根据朋友所在的足球队将这些朋友分类 支持的。具体来说,参与者被问到这5个中有多少个 朋友支持同一个团队,不同的团队或没有团队。总数 必须等于5。例如,参与者可能回答3 朋友支持同一个团队,1个朋友支持不同的团队,以及 1个朋友不支持任何团队。

一个选项是生成条形图(请参见下文)。这个问题 它没有显示类别之间的关联。参加者 有3个支持同一团队的朋友可以有2个朋友 支持另一个团队的人,不支持团队的2个朋友或1个 支持不同团队的朋友和1个不支持的朋友 团队。

以下是一些数据。我使用tidyverse / ggplot2在R中进行绘图-尽管 欢迎使用其他包/语言创建的可视化效果!

## load required packages
library(tidyverse) # tidyverse v 1.2.1 with ggplot2 v 3.2.0
## set seed
set.seed(500)

## create tibble with randomly generated data
data <-
    tibble(id = 1:20,
           ## column with friends who support same team
           same = round(runif(20, 0, 5), 0),
           ## column with friends who support different team
           diff = round(runif(20, 0, 5 - same), 0),
           ## column with friends who support no team
           none = 5 - (same + diff),
           ## column that checks total equals 5
           total = if_else(same + diff + none == 5, TRUE, FALSE))

## create plot
data %>%
    gather(friends, number, c("same", "diff", "none")) %>%
    ggplot() + 
    geom_bar(aes(x = number, fill = friends),
             stat = "count",
             ## preserve to not drop counts of 0 
             position = position_dodge(preserve = "single")) +
    ## set axes to make plot more legible
    scale_x_discrete(limits = c(0:5)) +
    scale_y_continuous(breaks = seq(0, 20, 1)) +
    theme_classic()

我不知道可视化此类数据的任何标准方法,因此任何 指针将不胜感激!

bar-plot-of-friends-by-which-team-they-support

2 个答案:

答案 0 :(得分:4)

您可以尝试镶嵌图。这不使用任何包。

tab <- as.matrix(data[2:4])
rownames(tab) <- data$id
mosaicplot(tab, col = rainbow(3), main = "My Plot")

screenshot

ggmosaic

如果需要ggplot2版本,ggmosaic软件包将提供geom_mosaic

library(ggmosaic)

data %>%
  gather(friends, number, c("same", "diff", "none")) %>%
  ggplot() + 
    geom_mosaic(aes(weight = number, x = product(friends), 
      conds = product(id), fill = friends))

答案 1 :(得分:2)

由于您有三种选择,因此另一个选择可能是ternary plot

library(vcd)
ternaryplot(data[,2:4])

ternary plot

当然,您的某些点重叠,因此应用抖动可能会有所帮助。

ternaryplot(abs(apply(data[,2:4], 2, jitter)), cex=0.8)

ternary plot with jitter