在 R 中使用 geom_line 时显示不正确
Posted
技术标签:
【中文标题】在 R 中使用 geom_line 时显示不正确【英文标题】:Inproper show when use geom_net in R 【发布时间】:2016-01-24 14:04:27 【问题描述】:给定一个数据框如下:
v1 v2 v3 v4
Tom A Jim B
Gary A Shirly A
Shirly B Jack B
Tom A Jack B
...
v2 和v4 表示v1 和v3 中的名称分别属于哪个组。 Tom 属于 A 组,Jim 属于 v4 组。
我想用geom_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轴,并且应该清楚地显示边缘之间的关系。边缘的颜色应该代表它们所属的组。这意味着同一组中的所有名称都应该具有相同的颜色。
希望能得到您的帮助!提前致谢!
【问题讨论】:
嗨。你有没有解决这个问题?如果有,怎么做? @hackR 不,我终于用了 igraph。 【参考方案1】:我也为此苦苦挣扎,直到我弄清楚 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)
但是你会注意到一些节点(顶点)没有被标记。所以这就是 data.frame 的第 2 部分很重要的地方。在第 2 部分中,您提供要标记的节点的名称。这是因为 geom_net 只标记 FROM 节点而不是 TO 节点,因此您至少需要提供不用作 FROM 点的节点的名称。
ans <- read.table(text ="
from to linewidth
Tom Jim 0.1
Gary Shirly 1
Shirly Jack 0.5
Tom Jack 2
Helen Jack 3
Jim NA NA
Jack NA NA
", sep = " ", stringsAsFactors = FALSE, header=TRUE, na.strings = "NA")
p <- ggplot(data = ans, aes(from_id = from, to_id = to, linewidth = linewidth))
p + geom_net(label = TRUE, vjust=-1)
上面发生了几件事:1)我添加了“Jim NA NA Jack NA NA”作为未标记节点的标签,2)还添加了 na.strings = “NA” 以确保 read.table() 正确解释NA 值,以及 3)我将 linewidth 参数添加到 aes,以便它从 data.frame 映射到绘图。
此外,一旦您为所有节点提供名称,“有 XX 个节点没有节点信息”的警告消息就会消失。
希望有所帮助 编辑:根据要求,我添加了结果输出。由于 geom_net() 每次运行时都会更改布局,因此我包含了两个示例图像
只是为了完成整个 data.frame 构建过程,我在下面包含了一个案例,您有两个单独的 data.frames,您需要将它们合并在一起:第一个 data.frame 用于线条(边缘),第二个是节点(顶点)。
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)
【讨论】:
我还没有尝试过,但我认为您的解决方案正是我的问题的正确解决方案,因为我在 igraph 中得到的结果形状与 geom_net 中的形状非常相似。但是V1中没有出现的名字都不见了。顺便说一句,你能上传你得到的图表吗?谢谢!【参考方案2】:geomnet 的维护者在这里。如果可能,请将未来的问题发布到github.com/sctyner/geomnet/issues。 @hackR 有正确的想法,文档中有几个示例。这个想法是:你有一个边数据框有一个 from_id 和一个 to_id 列(+附加列),你也有一个带有 id 列(+附加列)的顶点数据框。然后合并它们:
network_data <- merge(edges, vertices, by.x = "from_id", by.y = "to_id", all = T)
不要忘记包含 all = T 参数!
谢谢,山姆。
【讨论】:
以上是关于在 R 中使用 geom_line 时显示不正确的主要内容,如果未能解决你的问题,请参考以下文章
Android ListView 在向下滚动时显示不正确的内容,然后在向上滚动时显示正确的内容