Как использовать динамический geom_segment с подсчетом переменных - PullRequest
2 голосов
/ 26 июля 2011

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

У меня есть 2 матрицы: "clVrd" с

            [,1]        [,2]
 [1,]  0.6618725 -0.04065907
 [2,]  0.4646620  0.09859806
 [3,]  0.9388307  0.05681554
 [4,]  1.1809942  0.12906415
 [5,]  1.5476428  0.49644973
 [6,] -0.1855485  0.30445869
 [7,]  0.4525888  0.49559198
 [8,] -0.4004534 -0.06419374
 [9,] -1.0669191  0.17292748
[10,] -0.9372038  0.02601539
[11,]  0.5617849 -5.21857716
[12,] -0.9370099 -0.05539107
[13,]  0.6803453  0.21223368
[14,]  1.3040601  0.47598799

и "середина" с

            [,1]       [,2]
 [1,] -0.1958772  0.3012428
 [2,]  0.5115807  0.4142237
 [3,] -0.6585965  0.2623573
 [4,]  0.4680863 -1.4964873
 [5,] -1.2431780  0.2383014
 [6,] -2.3507773  0.0954886
 [7,] -0.5547284 -2.1393520
 [8,]  0.1314092  0.3408999
 [9,]  0.7592055 -0.8161825
[10,]  0.8247861  0.5152814
[11,] -1.8667328  0.1344475
[12,] -0.4825223 -4.0975561

и матрица "active", которая сообщает циклу, следует ли рисовать линию (1) или нет (0)

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
 [1,]    1    1    1    1    1    1    1    1    1     1     0     1     1
 [2,]    1    1    1    1    1    1    1    1    1     1     0     1     1
 [3,]    1    1    1    1    1    1    1    1    1     1     0     1     1
 [4,]    1    1    1    1    1    1    1    1    1     1     1     1     1
 [5,]    1    1    1    1    0    1    1    1    1     1     0     1     1
 [6,]    0    0    0    0    0    0    0    0    1     1     0     1     0
 [7,]    1    1    1    1    1    1    1    1    1     1     1     1     1
 [8,]    1    1    1    1    1    1    1    1    1     1     0     1     1
 [9,]    1    1    1    1    1    1    1    1    1     1     1     1     1
[10,]    1    1    1    1    1    1    1    1    1     1     0     1     1
[11,]    0    0    0    0    0    1    0    1    1     1     0     1     0
[12,]    1    1    1    1    1    1    1    1    1     1     1     1     1

Этот вызов производит основной сюжет

g <- ggplot() + layer(data=data.frame(clUrd), mapping=aes(x=clUrd[,1], y=clUrd[,2]), geom = "point", stat="identity", size = I(1), alpha = I(0.2))

, который работает хорошо. Теперь я хочу нарисовать линию от каждой записи y (строки) до каждого x (столбца столбца) в соответствующих матрицах clVrd и mid, если в активном состоянии - 1.

Я пробовал следующий цикл:

for (i in 1:13){ # Draw the lines between middlepoints and infrastructures
    for (j in 1:maxcl){
        if (active[j,i]==1){
          g <- g + geom_segment(aes(x=clVrd[i,1], y=clVrd[i,2], xend=mid[j,1], yend=mid[j,2]), color='grey')
        }
    }
}

, который не работает. Он просто рисует линии для i = 13 и j = 12. Если я смотрю в g с головой (g), я вижу, что он добавляет этикетки с

$layers[[132]]
mapping: x = clVrd[i, 1], y = clVrd[i, 2], xend = mid[j, 1], yend = mid[j, 2] 
geom_segment: colour = grey 
stat_identity:  
position_identity: (width = NULL, height = NULL)

, что объясняет, почему он просто рисует линии для i = 13 и j = 12. Но как я могу это исправить? И не должно быть 157 слоев? Здесь всего 132 или я что-то не так понимаю?

Спасибо за вашу помощь.

Dominik

1 Ответ

1 голос
/ 27 июля 2011

После того, как я поужинал и немного отдохнул, я нашел ответ.Я не знаю, является ли это лучшим решением, но оно работает для меня.

Мы генерируем матрицу "линий"

lines <- numeric()

и помещаем координаты для линий из разныхматрицы в нашей новой, если active [x, y] равен 1 (см. выше).

for (i in 1:13){
    for (j in 1:maxcl){
        if (active[j,i]==1){
          lines <- rbind(lines, c(clVrd[i,1], clVrd[i,2], mid[j,1], mid[j,2]))
        }
    }
}

Теперь мы можем построить график с линиями с

g <- ggplot() + layer(data=data.frame(clUrd), mapping=aes(x=clUrd[,1], y=clUrd[,2], col=factor(clUrd[,3])), geom = "point", stat="identity", size = I(1), alpha = I(0.2))

Но у меня все еще естьчтобы проверить, все ли правильно, потому что кажется, что это немного, но это должно

Теперь вся картинка генерируется следующим вызовом:

g <- ggplot() + layer(data=data.frame(clUrd), mapping=aes(x=clUrd[,1], y=clUrd[,2], col=factor(clUrd[,3])), geom = "point", stat="identity", size = I(1.5), alpha = I(0.2)) +
  scale_colour_brewer(palette="Paired") +
  geom_segment(data=data.frame(test), aes(x=lines[,1], y=lines[,2], xend=lines[,3], yend=lines[,4]), color='grey', alpha = I(0.2)) +
  layer(data=data.frame(clVrd), mapping=aes(x=clVrd[,1], y=clVrd[,2]), geom = "point", stat="identity", size = I(4), color='black', shape=2) +
  layer(data=data.frame(mid), mapping=aes(x=mid[,1], y=mid[,2]), geom = "point", stat="identity", size = I(4), color='black', shape=22) +
  opts(legend.position = "none") +
  scale_x_continuous('Dimension 1') +
  scale_y_continuous('Dimension 2') +
  opts(axis.title.y = theme_text(vjust=0.2, angle=90)) +
  opts(axis.title.x = theme_text(vjust=0.2, angle=0))

с clUrd - 3x5982Матрица типа

[1,] -0.1454078  0.26175441    1
[2,]  0.4567384  0.46036161    2
[3,] -0.9269251  0.39196787    3
[4,] -0.8959093  0.06884224    3
[5,]  0.1618442 -1.12006536    4
[6,] -1.4021955  0.34594349    5

Результат выглядит следующим образом!Там, где точки являются респондентами, треугольник обозначает инфраструктуру, возводит в квадрат средние точки кластеров и окрашивает различные кластеры.

  • Извините, я не могу опубликовать фотографию, мне не разрешено, потому что у меня недостаточно очков ... Это глупо.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...