Barplot - 两个彼此相邻的酒吧和独立窗户的酒吧

时间:2017-03-13 14:54:30

标签: r bar-chart

我想使用以下数据来创建可视化:

> dput(data)
structure(c(1264L, 2190L, 2601L, 1441L, 1129L, 2552L, 1820L, 306L, 
            1124L, 298L, 233L, 493L, 2316L, 461L, 294L, 238L, 15L, 89L, 152L, 
            163L, 116L, 60L, 80L, 31L, 27L, 41L, 33L, 58L, 55L, 89L, 7L, 
            7L, 13L, 23L, 54L), .Dim = c(7L, 5L), .Dimnames = list(c("Mark1", 
                                                                     "Mark2", "Greg1", "Greg2", "Tom1", "Tom2", "Martin"), c("1", "2", "3", "4", 
                                                                                                                  "5")))

我希望以类似于下图所示的条形图的方式对其进行可视化:

Example

然而,我不想将条形图堆叠在一起,而是将条形图放在一起。总共应该有4个窗口。这里的窗口是指两个条形图的集合(例如,对于Mark1和Mark2)或者对于Martin来说是单个条形图。

更清楚:

Mark1和Mark2 - 应位于同一窗口中/上

Greg1和Greg2 - 如上所述

Tom1和Tom2 - 如上所述

马丁 - 由单一条形图组成的窗口

2 个答案:

答案 0 :(得分:5)

以下是使用tidyverse Universe中的包进行此操作的一种方法:

library(ggplot2)
library(dplyr)
library(tibble)
library(stringr)
library(reshape2)

# d <- your dput data

melt(d) %>% 
  as_tibble() %>% 
  select(name_input=Var1,
         x=Var2,
         value) %>% 
  mutate(name=as.factor(str_extract(string = name_input,
                          pattern = '\\D*')),
         id=str_extract(string = name_input,
                        pattern = '\\d'),
         id=as.factor(ifelse(is.na(id),1,as.numeric(id)))) %>% 
  ggplot(aes(x=x,y=value))+
  geom_bar(stat = 'identity',aes(fill=id),position='dodge')+
  facet_grid(facets = .~name)

ggplot result

答案 1 :(得分:2)

tidyverse extract / gather包含数据框data(请注意Martin是唯一且没有id,其中第3 fill使用颜色):

library(tidyverse)
library(ggplot2)
as.data.frame(data) %>% 
  mutate(name=rownames(data)) %>% 
  extract(name, c('name','id'),'([[:alpha:]]+)(\\d?)') %>%
  gather(variable, value, -name, -id) %>%
  ggplot(aes(variable, value, fill=id)) +
  geom_bar(stat='identity', position='dodge') +
  facet_wrap(~name)

enter image description here

<强> [编辑]

as.data.frame(data) %>% 
  mutate(name=rownames(data)) %>% 
  extract(name, c('name','id'),'([[:alpha:]]+)(\\d?)', convert=TRUE) %>%
  replace_na(list(id=1)) %>%
  gather(variable, value, -name, -id) %>%
  ggplot(aes(variable, value, fill=as.factor(id))) +
  geom_bar(stat='identity', position='dodge') +
  facet_wrap(~name)

enter image description here