Итак, проблема заключается в создании линейного графика, который представляет взаимодействие.
Для этого вам необходимо отформатировать данные в соответствующей форме. Вы хотите построить сегменты, и для этого вам нужны координаты каждого сегмента в одной строке во фрейме данных:
interaction <- merge(propdata, relation, by.x="name", by.y="name1")
interaction <- cbind(interaction,
merge(propdata, relation, by.x="name", by.y="name2")[, c("X", "Y")])
names(interaction)[8:9] <- c("Xend", "Yend")
interaction
name diameter X Y colr name2 score Xend Yend
1 A 4.3 1 1 10 B 1.1 2 3
2 A 4.3 1 1 10 C 2.2 3 3
3 A 4.3 1 1 10 D 5.4 3 3
4 B 8.3 2 3 20 C 3.1 4 4
5 B 8.3 2 3 20 D 2.0 4 4
Теперь мы столкнулись с другой проблемой. В ggplot2
вы можете использовать только одну шкалу размеров. Поскольку у вас есть аргумент размера и для точки, и для линии, который действительно представляет две вещи, это не может быть сделано без обходного пути.
Таким образом, обходной путь - рисовать круги вручную, используя geom_polygon
.
Построить фрейм данных с кружками:
circle <- function(x, y, d, color, scale=1){
d <- d * scale
angle <- seq(-pi, pi, length = 50)
data.frame(
x = x + d/2*sin(angle),
y = y + d/2*cos(angle),
color=color)
}
circles <- ddply(propdata, .(name),
function(x)with(x, circle(X, Y, diameter, colr, scale=0.2)))
Наконец, создайте сюжет:
ggplot() +
geom_polygon(data=circles, aes(group=name, x=x, y=y, fill=color)) +
geom_text(data=propdata, aes(x=X, y=Y, label=name), hjust=0, vjust=0) +
geom_segment(data=interaction, aes(x=X, y=Y, xend=Xend, yend=Yend, size=score)) +
scale_size("Inter", to=c(0, 5)) +
coord_equal()