визуализировать ассоциации между двумя группами данных - PullRequest
3 голосов
/ 22 сентября 2009

В тех случаях, когда у каждого элемента данных есть пара A и B, а также несколько записей в A и несколько точек в B. В IE несколько синдромов и несколько диагнозов, хотя для каждого элемента данных существует одна пара синдромов-диагнозов.

Примеры, предложения или идеи высоко ценится

вот на что похожи данные. И я хочу видеть связи между значениями A и B (сколько GG связано с TT и т.д.). Оба являются номинальными типами данных.

ID,A ,B 
1,GG,TT
2,AA,SS
3,BB,XX
4,DD,SS
5,DD,TT
6,CC,XX
7,HH,ZZ
8,AA,TT
9,CC,RR
10,DD,ZZ
11,AA,XX
12,AA,TT
13,DD,SS
14,DD,XX
15,AA,YY
16,CC,ZZ
17,FF,SS
18,FF,XX
19,BB,VV
20,GG,VV
21,GG,SS
22,AA,RR
23,AA,TT
24,AA,SS
25,CC,VV
26,CC,TT
27,FF,RR
28,GG,UU
29,CC,TT
30,BB,ZZ
31,II,TT
32,FF,RR
33,BB,SS
34,GG,YY
35,FF,RR
36,BB,VV
37,II,RR
38,CC,YY
39,FF,VV
40,AA,XX
41,AA,ZZ
42,GG,VV
43,BB,UU
44,II,UU
45,II,SS
46,DD,SS
47,AA,UU
48,BB,VV
49,GG,TT
50,BB,TT

Ответы [ 4 ]

7 голосов
/ 22 сентября 2009

Поскольку ваши данные являются двудольными, я бы предложил построить точки в первом множителе с одной стороны, точки в другом множителе с другой, с линиями между ними, например:

enter image description here

Код, который я использовал для генерации, был:

## Make up data.
data <- data.frame(X1=sample(state.region, 10),
                   X2=sample(state.region, 10))

## Set up plot window.
plot(0, xlim=c(0,1), ylim=c(0,1),
     type="n", axes=FALSE, xlab="", ylab="")

factor.to.int <- function(f) {
  (as.integer(f) - 1) / (length(levels(f)) - 1)
}

segments(factor.to.int(data$X1), 0, factor.to.int(data$X2), 1,
         col=data$X1)
axis(1, at = seq(0, 1, by = 1 / (length(levels(data$X1)) - 1)),
     labels = levels(data$X1))
axis(3, at = seq(0, 1, by = 1 / (length(levels(data$X2)) - 1)),
     labels = levels(data$X2))
5 голосов
/ 22 сентября 2009

Это то, что я делаю. Более темный цвет указывает на более важную комбинацию А и В.

dataset <- data.frame(A = sample(LETTERS[1:5], 200, prob = runif(5), replace = TRUE), B = sample(LETTERS[1:5], 200, prob = runif(5), replace = TRUE))
Counts <- as.data.frame(with(dataset, table(A, B)))
library(ggplot2)
ggplot(Counts, aes(x = A, y = B, fill = Freq)) + geom_tile() + scale_fill_gradient(low = "white", high = "black")

Или, если вы предпочитаете линии

library(ggplot2)
dataset <- data.frame(A = sample(letters[1:5], 200, prob = runif(5), replace = TRUE), B = sample(letters[1:5], 200, prob = runif(5), replace = TRUE))
Counts <- as.data.frame(with(dataset, table(A, B)))
Counts$X <- 0
Counts$Xend <- 1
Counts$Y <- as.numeric(Counts$A)
Counts$Yend <- as.numeric(Counts$B)
ggplot(Counts, aes(x = X, xend = Xend, y = Y, yend = Yend, size = Freq)) +
geom_segment() + scale_x_continuous(breaks = 0:1, labels = c("A", "B")) + 
scale_y_continuous(breaks = 1:5, labels = letters[1:5])

Эта третья опция добавляет метки к точкам данных, используя geom_text ().

library(ggplot2)
dataset <- data.frame(
    A = sample(letters[1:5], 200, prob = runif(5), replace = TRUE), 
    B = sample(LETTERS[20:26], 200, prob = runif(7), replace = TRUE)
)
Counts <- as.data.frame(with(dataset, table(A, B)))
Counts$X <- 0
Counts$Xend <- 1
Counts$Y <- as.numeric(Counts$A)
Counts$Yend <- as.numeric(Counts$B)
ggplot(Counts, aes(x = X, xend = Xend, y = Y, yend = Yend)) + 
geom_segment(aes(size = Freq)) + 
scale_x_continuous(breaks = 0:1, labels = c("A", "B")) + 
scale_y_continuous(breaks = -1) + 
geom_text(aes(x = X, y = Y, label = A), colour = "red", size = 7, hjust = 1, vjust = 1) + 
geom_text(aes(x = Xend, y = Yend, label = B), colour = "red", size = 7, hjust = 0, vjust = 0)
3 голосов
/ 22 сентября 2009

Может быть, мозаика:

X <- structure(list(
  ID = 1:50,
  A = structure(c(6L, 1L, 2L, 4L, 4L, 3L, 7L, 1L, 3L, 4L, 1L, 1L, 4L, 4L, 1L, 3L, 5L, 5L, 2L, 6L, 6L, 1L, 1L, 1L, 3L, 3L, 5L, 6L, 3L, 2L, 8L, 5L, 2L, 6L, 5L, 2L, 8L, 3L, 5L, 1L, 1L, 6L, 2L, 8L, 8L, 4L, 1L, 2L, 6L, 2L), .Label = c("AA","BB", "CC", "DD", "FF", "GG", "HH", "II"), class = "factor"),
  B = structure(c(3L, 2L, 6L, 2L, 3L, 6L, 8L, 3L, 1L, 8L, 6L, 3L, 2L, 6L, 7L, 8L, 2L, 6L, 5L, 5L, 2L, 1L, 3L, 2L, 5L, 3L, 1L, 4L, 3L, 8L, 3L, 1L, 2L, 7L, 1L, 5L, 1L, 7L, 5L, 6L, 8L, 5L, 4L, 4L, 2L, 2L, 4L, 5L, 3L, 3L), .Label = c("RR", "SS", "TT", "UU", "VV", "XX", "YY", "ZZ"), class = "factor")
  ), .Names = c("ID", "A", "B"), class = "data.frame", row.names = c(NA, -50L)
)

mosaicplot(with(X,table(A,B)))

Для вашего примера набор данных:

mosaicplot

2 голосов
/ 22 сентября 2009

Спасибо! Я думаю, что связь между элементами в каждом классе лучше всего визуализируется с помощью примеров графов ссылок, приведенных Джонатоном и Тьерри. 2-й Тьерри, который показывает величину, определенно, где я начну.

обновление спасибо всем за идеи и советы!

Я пришел через двухсторонний пакет, в котором есть функции для визуализации данных такого типа. Я думаю, что это чистая визуализация отношений, которые я пытаюсь показать.

сделал:

    library(bipartite)
    dataset <- data.frame(
         A = sample(letters[1:5], 200, prob = runif(5), replace = TRUE), 
         B = sample(LETTERS[20:26], 200, prob = runif(7), replace = TRUE)
     )
    datamat <- as.matrix(table(dataset$A, dataset$B))
    visweb(datamat, text = "interaction", textsize = .8)

даяние: Результат visweb

не удалось добавить изображение в качестве нового пользователя: (

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