#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). Но это, вероятно, нереально, поэтому сейчас я просто добавил жестко заданный размер строки. Смотрите обновление в вопросе, которое дает идеальный график именно так, как мне было нужно. Не могли бы вы добавить это к своему ответу?