在R中使用几何网格时正确显示
给出如下数据帧:在R中使用几何网格时正确显示,r,ggplot2,data-visualization,social-networking,R,Ggplot2,Data Visualization,Social Networking,给出如下数据帧: v1 v2 v3 v4 Tom A Jim B Gary A Shirly A Shirly B Jack B Tom A Jack B ... v2和v4表示v1和v3中的名称分别属于哪个组。汤姆属于A组,吉姆属于v4组。 我想用geom\u net绘制一个社交网络,如果两个名字在同一行中,则用线链接到两个名字,例如,Tom和Jim。而且边缘的大小应该与它们在V3中出现的时
v1 v2 v3 v4
Tom A Jim B
Gary A Shirly A
Shirly B Jack B
Tom A Jack B
...
v2和v4表示v1和v3中的名称分别属于哪个组。汤姆属于A组,吉姆属于v4组。
我想用geom\u net
绘制一个社交网络,如果两个名字在同一行中,则用线链接到两个名字,例如,Tom
和Jim
。而且边缘的大小应该与它们在V3中出现的时间成正比,即Jack
的边缘应该是Jim
和Shirly
的两倍大
我试过了
ggplot(df, aes(from_id = V1,to_id = V3)) +geom_net()
但给出了一个非常糟糕的结果:
并生成一个警告:
In f(..., self = self) :
There are 35 nodes without node information:
#And the below are all the values in V1 and V3
Tom, Shirly, ....
Did you use all=T in merge?
我想知道如何在没有x轴或y轴的情况下以适当和好看的方式显示结果,并且应该清楚地显示边之间的关系。边的颜色应该代表它们所属的组。这意味着同一组中的所有名称应具有相同的颜色
希望得到你的帮助!提前谢谢 我也一直在努力解决这个问题,直到我找到了geom_net包的正确data.frame结构。基本上,您需要的是一个data.frame,它有两个部分:在第1部分中,您通过提供FROM和TO列来描述边(绘制的线)。或者,可以在单独的列中提供附加信息,例如线宽
ans <- read.table(text ="
from to linewidth
Tom Jim 0.1
Gary Shirly 1
Shirly Jack 0.5
Tom Jack 2
", sep = " ", stringsAsFactors = FALSE, header=TRUE)
p <- ggplot(data = ans, aes(from_id = from, to_id = to))
p + geom_net(label = TRUE, vjust=-1)
ans这里是geomnet的维护者。如果可能,请将未来的问题发布到@hackR的想法是正确的,文档中有几个例子。其思想是:您有一个边数据框,它有一个from_id和一个to_id列(+附加列),还有一个顶点数据框,它有一个id列(+附加列)。然后合并它们:
network_data <- merge(edges, vertices, by.x = "from_id", by.y = "to_id", all = T)
network\u数据高。你解决过这个问题吗?如果是,怎么做?@hackR不,我最后使用了igraph。我还没有尝试过,但我认为你的解决方案正是我问题的正确答案,因为我在igraph中得到的结果形状与geom_net中的结果非常相似。但是没有出现在V1中的名字都丢失了。顺便说一句,你能上传你得到的图表吗?谢谢
lines <- read.table(text ="
from to linewidth
Tom Ivy 0.1
Gary Ivy 1
Shirly Ivy 0.5
Tom Helen 2
Helen Ivy 3
", sep = " ", stringsAsFactors = FALSE, header=TRUE, na.strings = "NA")
nodes <- read.table(text ="
name
Tom
Jim
Gary
Shirly
Jack
Helen
Susan
Joel
Ivy
", sep = " ", stringsAsFactors = FALSE, header=TRUE,na.strings = "NA")
df <- merge(lines, nodes, by.x = "from", by.y = "name", all = TRUE)
p <- ggplot(data = df, aes(from_id = from, to_id = to, linewidth = linewidth))
p + geom_net(label = TRUE, vjust=-1)
network_data <- merge(edges, vertices, by.x = "from_id", by.y = "to_id", all = T)