gpt4 book ai didi

r - 在 R 中使用 geom_line 时显示不正确

转载 作者:行者123 更新时间:2023-12-04 09:28:46 25 4
gpt4 key购买 nike

给定一个数据框如下:

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 绘制一个社交网络, 如果两个名称在同一行,则用行链接到两个名称,例如, TomJim .并且边缘的大小应该与它们在 V3 中出现的次数成正比,即 Jack 的边缘应该是 Jim 的两倍大和 Shirly .

我试过
ggplot(df, aes(from_id = V1,to_id = V3)) +geom_net()

但是给出了一个非常糟糕的结果:
enter image description here

并生成警告:
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 列来描述边缘(绘制的线)。可选地,可以在单独的列中提供其他信息,例如 linewidth

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 个节点没有节点信息”就会消失。

希望有帮助
enter image description here
编辑:根据要求,我添加了结果输出。由于 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)

enter image description here

关于r - 在 R 中使用 geom_line 时显示不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34976716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com