我有以下类型的数据(尽管数据点的数量非常大)
# 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)
我想创建一个类似于以下的图表,以便它具有以下属性。
(
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.
是否可以使用现有的R base或任何流行的图形软件制作这样的图形,或者需要更专业的软件。
编辑:
这就是我使用气泡图:
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
答案 0 :(得分:5)
这是我用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))
答案 1 :(得分:3)
所以,问题在于创建一个代表交互的线图。
为此,您需要以适当的格式格式化数据。您想绘制段,为此您需要数据框中单行中每个段的坐标:
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()