2012-02-27 13 views
7

devo seguente tipo di dati (anche se il numero di punti dati è molto grande)Plot interazione R grafici di

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

voglio creare un grafico simile alla seguente, tale che ha le seguenti proprietà.

(

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

E 'possibile rendere tale grafico con base di R esistente o qualsiasi software di grafica popolare o hanno bisogno di un software più specializzato

Modifiche:.

Questo è per quanto riguarda la trama della bolla:

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 risposta è sì. Che cosa hai provato? – Andrie

+0

Ho provato ggplot2 non singolarmente ..utilizzato geom_point() solo per incorniciare la dimensione del buble, non so come connettere ... – jon

+0

@Andrie guarda le mie modifiche, cioè fino a dove vado, ho provato ... grazie . – jon

risposta

5

Ecco cosa ho cucinato in fretta 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

Grazie mille per la risposta .... è abbastanza bello !! Ho guardato la pagina web di qgraph https://sites.google.com/site/qgraphproject/examples ... che è abbastanza bello ... – jon

+0

+1 Molto bello.La mia lista di cose da imparare sta crescendo di giorno in giorno. – Andrie

+0

Grazie! Se la posizione dei nodi non è importante, utilizzerei invece un algoritmo incorporato. Anche i colori predefiniti per i bordi funzionano meglio, ma sono verdi :) –

3

Quindi, il problema è la creazione di una trama linea che rappresenta l'interazione.

Per fare ciò, è necessario formattare i dati nel modulo appropriato. Si desidera tracciare segmenti, e per questo è necessario le coordinate di ogni segmento in una singola riga nella cornice di dati:

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 

Ora ci imbattiamo in un altro problema. In ggplot2, è possibile avere una scala di dimensioni singole. Dato che hai un argomento di dimensione sia per il punto che per la linea, questo rappresenta davvero due cose, questo non può essere fatto senza una soluzione alternativa.

Quindi la soluzione è disegnare manualmente i cerchi utilizzando geom_polygon.

costruiscono la struttura di dati con i cerchi:

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

Infine, creare 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 il credito a @BrianDiggs che ha aiutato. – Andrie

+0

piuttosto bello ... l'unica cosa che vorrei mettere etichetta un po 'lontano dal centro del cerchio ... grazie per la risposta ... – jon

+0

.anche possiamo controllare le dimensioni della linea come a volte diventa così audace che è informativo ma non piuttosto ..grazie per la risposta ... – jon