Большие и маленькие промежутки с использованием кружка в R - PullRequest
0 голосов
/ 30 мая 2020

Как сгруппировать категории так, чтобы они появлялись с большими пробелами на диаграмме аккордов, созданной с помощью пакета circlize в R?

Например, учитывая следующую матрицу смежности:

  A B    C   D  E F    G   H
A 0 0    0   0  0 0 1168   0
B 0 0 2545 278  0 0    0 337
C 0 0    0 817  0 0    0   0
D 0 0    0   0 10 0    0   0
E 0 0    0   0  0 0    0   0
F 0 0    0   0  0 0    0   0
G 0 0  561 326  0 0    0 281
H 0 0   46   8  0 0    0   0

Я хотел бы создать три группы {A}, {B, C} и {D, E, F, G, H}, так что при использовании chordDiagram() его параметр small.gap используется между сегментами внутри группы, а big.gap - между группами.

Обратите внимание, что это код, который будет запускаться ежедневно в производства, и я не могу гарантировать, что движения всегда будут происходить между всеми категориями. В приведенном выше примере никаких перемещений из категории F или в категорию F не происходит, в результате чего она не отображается в выходных данных. Используя gap.after, я жестко запрограммировал желаемый результат (см. Изображение), но это неосуществимое решение, так как я не знаю, какие категории будут отображаться или нет. Я также предпочел бы, чтобы решение не зависело от порядка столбцов и строк в матрице. enter image description here

1 Ответ

0 голосов
/ 01 июня 2020

В следующей версии 0.4.10 circlize будет поддерживать именованный вектор в качестве входных данных для gap.after. Он уже находится в главной ветке, поэтому после его извлечения в R можно программно создать правильные пробелы.

library(devtools)
install_github("jokergoo/circlize")
library(circlize) # chord diagrams

mat = read.table(textConnection("
  A B    C   D  E F    G   H
A 0 0    0   0  0 0 1168   0
B 0 0 2545 278  0 0    0 337
C 0 0    0 817  0 0    0   0
D 0 0    0   0 10 0    0   0
E 0 0    0   0  0 0    0   0
F 0 0    0   0  0 0    0   0
G 0 0  561 326  0 0    0 281
H 0 0   46   8  0 0    0   0"))
mat = as.matrix(mat)

big_gap = 10
small_gap = 2

# For example three groups x,y,z
sector_grouping = cbind.data.frame(
  "Sec" = c("A","B","C","D","E","F","G","H"), 
  "Grp" = c("x","y","y","z","z","z","z","z")
)
# Check which, if any, groups lack both outgoing and incoming
empty_row = rowSums(mat)[sector_grouping$Sec] == 0
empty_column = colSums(mat)[sector_grouping$Sec] == 0
# Remove empty sectors
sector_grouping = sector_grouping[!(empty_row & empty_column),]
# Iterate and set a big gap (last sector in group) or small gap.
for(i in 1:nrow(sector_grouping)) {
  sector_grouping[i,"Gap"] = ifelse(
    sector_grouping[i,2]==sector_grouping[i+1,2],
    small_gap,
    big_gap
  )
}
# The last sector needs fixing (always assumed big)
sector_grouping$Gap[is.na(sector_grouping$Gap)] = big_gap
# Build named vector
gap.after = sector_grouping$Gap
names(gap.after) = sector_grouping$Sec

circos.par(gap.after = gap.after)
chordDiagram(mat, order = LETTERS[1:8])
circos.clear()

Я хотел бы поблагодарить автора @Zuguang Gu из circlize за быструю помощь после того, как я обратился к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...