Графики круговых хорд

Я изучаю, как создавать круговые графики в R, похожие на CIRCOS. Я использую пакет circlize для рисования связей между парами отправления и назначения на основе того, был ли рейс OB, Inbound и Return. Логика для данных на самом деле не имеет значения, это просто игрушечный пример

Я получил график для работы на основе приведенного ниже кода, который работает на основе следующей логики.

  1. Возьмите мои данные, объедините столбец назначения с типом рейса
  2. Преобразуйте в матрицу и подайте начало координат и новый столбец в circlize

Справочник

library(dplyr)
library(circlize)

# Create Fake Flight Information in a table
orig = c("IE","GB","US","ES","FI","US","IE","IE","GB")
dest = c("FI","FI","ES","ES","US","US","FI","US","IE")
direc = c("IB","OB","RETURN","DOM","OB","DOM","IB","RETURN","IB")
mydf = data.frame(orig, dest, direc)

# Add a column that combines the dest and direction together
mydf <- mydf %>%
  mutate(key = paste(dest,direc)) %>%
  select (orig, key)

# Create a Binary Matrix Based on mydf
mymat <- data.matrix(as.data.frame.matrix(table(mydf)))

# create the objects you want to link from to in your diagram
from <- rownames(mymat)
to <- colnames(mymat)

# Create Diagram by suppling the matrix 
par(mar = c(1, 1, 1, 1))
chordDiagram(mymat, order = sort(union(from, to)), directional = TRUE)
circos.clear()

Мне очень нравится сюжет, но хотелось бы его немного изменить. Например, FI (то есть Финляндия) имеет 3 измерения на диаграмме FI IB, FI OB и FI. Я хотел бы объединить их все в FI, если это возможно, и различать три типа рейсов, используя цветовую схему, стрелки или даже добавив дополнительный трек, который действует как зонтик для рейсов IB OB и RETURN.

Так, например,

  • FI OB будет помещен в FI, но будет иметь одностороннюю стрелку на GB, чтобы обозначить OB
  • FI IB будет помещен в FI, но будет иметь стрелку в одну сторону в FI
  • FI RETURN (если он существует) будет иметь двойную стрелку

Может ли кто-нибудь помочь, кто-нибудь видел что-нибудь подобное было сделано раньше? Конечный результат должен иметь страны на графике только один раз, чтобы кто-то мог очень быстро увидеть, в какие страны совершается наибольшее количество рейсов.

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

Большое спасибо за уделенное время


person John Smith    schedule 09.08.2015    source источник


Ответы (2)


Во-первых, я думаю, что в ваших данных есть повторяющаяся запись (IE-FI-IB).

Сначала я приложу код и рисунок, а затем немного объясню.

df = data.frame(orig, dest, direc, stringsAsFactors = FALSE)
df = unique(df)
col = c("IB" = "red",
        "OB" = "blue",
        "RETURN" = "orange",
        "DOM" = "green")
directional = c("IB" = -1,
                "OB" = 1,
                "RETURN" = 2,
                "DOM" = 0)
diffHeight = c("IB" = -0.04,
                "OB" = 0.04,
                "RETURN" = 0,
                "DOM" = 0)
chordDiagram(df[1:2], col = col[df[[3]]], directional = directional[df[[3]]], 
    direction.type = c("arrows+diffHeight"),
    diffHeight = diffHeight[df[[3]]])

legend("bottomleft", pch = 15, legend = names(col), col = col)

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

Сначала вам нужно использовать разрабатываемую версию circlize, для которой вы можете установить ее,

devtools::install_github("jokergoo/circlize")

В этой новой версии chordDiagram() поддерживает входную переменную в качестве фрейма данных и рисование двунаправленных стрелок для ссылок (сразу после прочтения вашего поста :)).

В приведенном выше коде col, directional, direction.type и diffHeight можно задать как вектор, соответствующий строкам в df.

Когда аргумент directional в chordDiagram() установлен на 2, соответствующая ссылка будет иметь два направления. Тогда, если direction.type содержит стрелки, будет стрелка с двумя концами.

Поскольку diffHeight — это вектор, который соответствует строкам в df, если вы хотите визуализировать направление для одной ссылки как по стрелке, так и по смещению корней, вам нужно объединить эти два параметра в одну строку, как показано в примере кода "arrows+diffHeight". .

По умолчанию ссылки идут от первого столбца ко второму столбцу. Но в вашем случае IB означает обратное направление, поэтому нам нужно установить diffHeight в отрицательное значение, чтобы изменить направление по умолчанию.

Наконец, я заметил, что у вас есть ссылки, которые начинаются и заканчиваются в одном и том же секторе (ES-ES-DOM и US-US-DOM), вы можете использовать аргумент self.link для управления тем, как представлять такую ​​самостоятельную ссылку. self.link установлено на 1 на следующем рисунке.

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

person Zuguang Gu    schedule 12.08.2015
comment
впечатляюще и очень полезно! Я надеюсь, что Джон примет этот ответ, нажав V ;^) - person irJvV; 13.08.2015

Нужны ли вам стрелки, потому что цветовое кодирование на графике уже рассказывает историю «От/К» (ОТ -> цветное ребро ИЗ СТРАНЫ, ДО — это цвет ИЗ СТРАНЫ, прибывающей в СТРАНУ В СТРАНУ, ЕСЛИ ОТ == ДО Его собственный цвет возвращается на свою базу (см., например, US или ES)).

library(dplyr)
library(circlize)

# Create Fake Flight Information in a table
orig = c("IE","GB","US","ES","FI","US","IE","IE","GB")
dest = c("FI","FI","ES","ES","US","US","FI","US","IE")
mydf = data.frame(orig, dest)

# Create a Binary Matrix Based on mydf
mymat <- data.matrix(as.data.frame.matrix(table(mydf)))

# create the objects you want to link from to in your diagram
from <- rownames(mymat)
to <- colnames(mymat)

# Create Diagram by suppling the matrix 
par(mar = c(1, 1, 1, 1))
chordDiagram(mymat, order = sort(union(from, to)), directional = TRUE)
circos.clear()

Кстати -> есть также разница OFFSET на краю, которая говорит, является ли он FROM (более широкий край) или TO (меньший край)

person irJvV    schedule 11.08.2015
comment
привет @irJvV, Большое спасибо за ваше предложение. Я думаю, что было бы лучше, возможно, сделать еще один трек вне трека для страны, который действует как зонтик, чтобы показать IB OB и DOM. Важно уметь различать тип полета для визуализации. - person John Smith; 11.08.2015
comment
Привет, Джон, как ты собираешься использовать график? Как изображение, веб-страница или что-то еще? - person irJvV; 11.08.2015
comment
Как образ. Идея состоит в том, чтобы показать пары пунктов отправления и назначения и тип рейса. Для этого примера их всего три, а на самом деле существует до 8 различных типов полета. Спасибо за OFFSET, я не знал, что он существует - person John Smith; 11.08.2015