Визуализировать непрерывную последовательность «блоков» в виде прямоугольного макета

#r #ggplot2

#r #ggplot2

Вопрос:

У меня есть непрерывная последовательность «блоков» нескольких типов (здесь я буду называть их «блоками»), описанных в таблице, например:

 df1 <- read.table(header=T,text='
 Group  nA  nB  nC
 Group1  2   3   1
 Group2  1   4   2
 Group3  1   5   2
 Group4  4   2   2
 Group5  6   6   2
           ')
  

т. е. 2 блока типа A , затем 3 блока типа B , 1 блок типа C и т.д. Я хотел бы визуализировать это в виде своего рода прямоугольной карты (если вы когда-либо видели карту секторов жесткого диска, например).
В виде полуграфии это выглядело бы так:

 AABBBC ABBBBCC ABBB
BBCC AAAABBCC AAAAA
ABBBBBBCC 
  

Здесь я оставил пробелы между группами, но на самом деле это была бы непрерывная последовательность (отображать границу между группами было бы здорово, но не критично), которая идет в «строке» графика и просто переносится на следующую строку при заполнении.
И конечный результат, который я хочу получить, был бы примерно таким:
введите описание изображения здесь
(вероятно, существует какое-то название для этого типа визуализации — не стесняйтесь редактировать заголовок)
Я понимаю, что готового решения не будет, но если бы вы могли предложить хотя бы направление, в котором мне следует искать — это было бы уже здорово. Я описываю этот пример в R , но не возражаю против других инструментов ( d3.js например, на основе было бы круто)

tmp UPD. основываясь на ответе Погибаса, просто небольшое дополнение, чтобы сделать его «обернутым»:

 size1 <- 17L
df2$row <- ceiling(df2$X / size1)
df2$pos <- df2$X - df2$row*size1
ggplot(df2, aes(pos, row, fill = L))  
  geom_tile(color = NA)  
  scale_fill_manual(values = c("green", "yellow", "red"))  
  theme_void()  
  theme(legend.position = "none") 
  scale_y_reverse()
  

Комментарии:

1. Итак, первая строка должна быть «AABBBC»?

2. Первая группа — «AABBBC», затем она продолжается (в той же «строке» графика) второй группой и т.д. Это непрерывная последовательность (я добавил пробел между группами только для того, чтобы было легче понять), которая переходит к следующей «строке», когда она достигает края графика. Я добавлю это к тексту вопроса, чтобы сделать его более понятным.

Ответ №1:

Сначала вам нужно «развернуть» исходные данные ( df1 ). Для этого мы можем использовать rep — повторить ввод n раз.

 # Create matrix of entries
M <- t(matrix(LETTERS[1:3], 5, 3, byrow = TRUE))
# [,1] [,2] [,3] [,4] [,5]
# [1,] "A"  "A"  "A"  "A"  "A" 
# [2,] "B"  "B"  "B"  "B"  "B" 
# [3,] "C"  "C"  "C"  "C"  "C" 

# Repeat entry in matrix M by transposed original matrix
df2 <- data.frame(L = rep(M, t(df1[, 2:4])))
# Add position on x axis
df2$X <- 1:nrow(df2)
# head(df2)
#   L X
# 1 A 1
# 2 A 2
# 3 B 3
# 4 B 4
# 5 B 5
# 6 C 6

# Plot using geom_tile
library(ggplot2)
ggplot(df2, aes(X, 0, fill = L))  
    geom_tile(color = NA)  
    scale_fill_manual(values = c("green", "yellow", "red"))  
    theme_void()  
    theme(legend.position = "none")
  

введите описание изображения здесь

Комментарии:

1. Спасибо, Повилас! (Я пока оставлю вопрос открытым, может быть, кто-нибудь сможет подсказать, как заставить график «обернуться» в несколько строк. В моем случае общее количество групп слишком велико, поэтому трудно сделать его видимым в одной строке)

2. @VasilyA какой длины строка? Я не понял из вопроса.

3. в идеале я хотел, чтобы она была гибкой, т. е. зависела от размера графика (например, чтобы она адаптировалась к изменениям окна масштабирования графика в RStudio). Но это, вероятно, нереально, поэтому сейчас я просто добавил жестко заданный размер строки. Смотрите обновление в вопросе, которое дает идеальный график именно так, как мне было нужно. Не могли бы вы добавить это к своему ответу?