2012-02-27 30 views
7

I tienen siguiente tipo de datos (aunque el número de puntos de datos es muy grande)Trazado de interacción en R gráficos de

# property data 
name <- c("A", "B", "C", "D") 
diameter <- c(4.3, 8.3,1.2, 3.3) 
X <- c(1, 2, 3, 4) 
Y <- c(1, 3, 3, 4) 
colr <- c(10, 20, 34, 12) 
propdata <- data.frame (name, diameter, X, Y, colr) 


# interaction data 
name1 <- c("A", "A", "A", "B", "B") 
name2 <- c("B", "C", "D", "C", "D") 
score <- c(1.1, 2.2, 5.4, 3.1, 2.0) 
relation <- data.frame (name1, name2, score) 

Quiero crear un gráfico similar al siguiente, de manera que se ha siguiente propiedad.

(

1) diameter of circles is governed by propdata$diameter 
(2) Position in xy field is governed by cordinates of propdata$X and propdata$y 
(3) Fill color of the circle is controlled by propdata$colr 
(4) Interaction is governed by relation data.frame, name1 
    and name2 elements will be connected and weight of the line is govenmened 
    by relation$score. 

enter image description here

¿Es posible realizar dicha gráfica con la base R existente o cualquier software de gráficos populares o necesita un software más especializado

EDITS:.

Hasta aquí voy con el diagrama de burbujas:

p <- ggplot(propdata, aes(X,Y,size = diameter, label=name)) 
p <- p + geom_point(colour= "red")+geom_text(size=3) # colour = colr does not work 
p 

enter image description here

+0

La respuesta es sí. ¿Qué has intentado? – Andrie

+0

Probé ggplot2 no solo ... usé geom_point() solo para enmarcar el tamaño de buble, no sé cómo conectar ... – jon

+0

@Andrie ver mis ediciones, eso es todo lo que voy, lo intenté ... gracias . – jon

Respuesta

5

Aquí es algo que cociné rápidamente con qgraph:

library("qgraph") 

plot(1,type='n',xlim=c(min(propdata$X)-0.5, 
    max(propdata$Y)+0.5),ylim=c(min(propdata$Y)-0.5,max(propdata$Y)+0.5), 
    xlab="",ylab="") 

col <- rgb(0,1-propdata$colr/max(propdata$colr),0) 

qgraph(relation,plot=FALSE,rescale=FALSE,layout=as.matrix(propdata[c("X","Y")]), 
     edge.color="darkred",color=col,propdata$colr,directed=FALSE,esize=10, 
     vsize=propdata$diameter+2,lcolor="white",curve=c(0,0,-0.2,0,0)) 

enter image description here

+0

Muchas gracias por la respuesta ... ¡es bastante agradable! Miré la página web de qgraph https://sites.google.com/site/qgraphproject/examples ... que es bastante agradable ... – jon

+0

+1 Muy bonito.Mi lista de tareas pendientes de aprender está creciendo día a día. – Andrie

+0

¡Gracias! Si la posición de los nodos no es importante, simplemente usaría un algoritmo de fuerza incorporada. También los colores predeterminados para los bordes funcionan mejor, pero son verdes :) –

3

Por lo tanto, el problema es la creación de un gráfico de líneas que representa la interacción.

Para hacer esto, debe formatear sus datos en la forma adecuada. Que desea trazar segmentos, y para ello es necesario que las coordenadas de cada segmento en una sola fila de la trama de datos:

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 

Ahora nos encontramos con otro problema. En ggplot2, solo puede tener una escala de un solo tamaño. Como tiene un argumento de tamaño para el punto y la línea, eso realmente representa dos cosas, esto no se puede hacer sin una solución alternativa.

Por lo tanto, la solución consiste en dibujar manualmente los círculos con geom_polygon.

construir la trama de datos con círculos:

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))) 

Por último, crear la trama:

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() 

enter image description here

+0

Con crédito a @BrianDiggs que ayudó. – Andrie

+0

bastante bonito ... lo único que me gustaría es poner la etiqueta un poco lejos del centro del círculo ... gracias por la respuesta ... – jon

+0

.también podemos controlar el tamaño de la línea como en algún momento se vuelve tan audaz que es informativo pero no bonita ... gracias por la respuesta ... – jon

Cuestiones relacionadas