【问题标题】:Nodes Size Relative to Associated Value相对于相关值的节点大小
【发布时间】:2016-04-18 23:09:35
【问题描述】:

我对 R 还很陌生,无法找到答案。有人问a similar question,但没有报告任何解决方案。如果我应该将此 Q 发布到不同的 stackexchange 上,我很抱歉,如果无法迁移,我将删除它。

使用我从 FDIC 提取的有关美国金融机构及其总资产持有量的数据,我想创建一个基本网络图,其中每个节点的大小与图中的其他节点成比例。每个节点也将标有金融机构的名称。

图的边现在实际上并不重要,但我希望每个节点至少通过一条边连接到网络。

到目前为止,我已经成功创建了一个非常基本的网络,其中包含 8 个银行,由我随机分配的边连接,as shown here(我显然还不能嵌入图片,对此感到抱歉):

我的 .csv 文件将被格式化为:

id, bank, assets
1, JP Morgan Chase, 16928000
2, Bank of America, 19075000
... ... ...

对于我已经创建的图表,除了没有资产列之外,它与上面相同。也只有8个bank,我希望使用的文件有25个。

就像我已经说过的,至于边缘,我只是随机分配了一些。如果有人知道创建连接我创建的节点的随机边的更简单方法,请告诉我。否则,这就是我的文件现在的格式:

to, from
1, 2
1, 3
...

我创建了使用以下命令链接的图表:

> nodes <- read.csv("~/foo/foo/foo.csv")
> links <- read.csv("~/blah/taco/burrito/blah.csv")
> net <- graph_from_data_frame(d=links, vertices = nodes, directed = F)
> class(net)
> net
IGRAPH UN-- 8 10 -- 
+ attr: name (v/c), bank (v/c)
+ edges (vertex names):
 [1] 1--2 1--3 1--4 1--5 2--3 2--4 2--7 4--5 5--8 7--8
> plot(net, main = "Financial Intermediaries", edge.arrow.size=.4, vertex.size=25, vertex.label.cex=1.5, vertex.label.color="black", vertex.label=V(net)$bank)

我希望我清楚我的问题并提供了必要的详细信息/代码。如果没有,请告诉我,我会在这里发布。就像我说的,我对 R 真的很陌生(我今天真的把它捡起来了,哈哈),到目前为止我使用的大部分代码都或多或少地取自 Katya Ognyanova 在她博客上的示例/演示文稿。

为了清楚起见,我目前使用的是 RStudio(最新稳定版)和 R v3.2.5。

我一直只使用igraph 包,但如果我想要的不能用它来完成,我非常愿意切换到不同的包。也就是说,我想继续使用 R(除非真的有更简单的东西,它不能被忽视。我想坚持并学习 R)。

感谢您的任何帮助,我真的很感激。

【问题讨论】:

  • 欢迎来到 SO!,+1 以简洁地描述您的问题。您需要将资产向量传递给“vertex.size=as.matrix(assets)”,之前在这里回答过问题Adjusting node size of a graph
  • 好的,问答似乎是我的方向。 igraph 会根据命名矩阵自动按比例缩放节点吗?即,我使用的所有值都在 10^5 - 10^7 之间,因此需要对输出大小进行某种调整。
  • 好的,所以我一直遇到问题。为什么我只想在另一个向量上创建一个矩阵?我的资产值只是 csv 中的另一列,所以我不想像使用 vertex.label=V(net)$bank 的名称那样迭代它吗?但是,当我尝试使用尺寸时,它不起作用并引发错误。
  • 对不起,不工作,我的意思是它根本不会改变节点的大小。事实上,它们的大小都是一样的。当我尝试制作矩阵时,我开始出错。我不确定如何将我的资产列与我的节点结合起来。

标签: r nodes data-visualization graph-theory igraph


【解决方案1】:

正如@Osssan 在 cmets 中链接的那样,有一个部分解决方案漂浮在周围。

也就是说,我认为我创建的解决方案更多的是“黑客”解决方案,而不是我从上一个问题中收集到的正确解决方案。这就是我所做的。

在我的 csv 文件中,我有四列。在第三列中,我有给定银行的资产。 注意 因为我不知道如何在 R 内部进行数据操作,所以我不得不做一些工作来调整资产值的大小,这样它就不会导致节点覆盖整个图表。使用我的解决方案,您将自动获得相对大小的节点。你必须先这样做。

由于我想创建一个节点(银行)的网络,这些节点(银行)的大小根据其各自的资产持有量而变化,所以我所做的就是创建一个像这样的单独向量

> df <- read.csv("~/blah/blah/blah.csv", colClasses = c("NULL","NULL", NA, "NULL"))

此命令的作用是读取 csv 文件,查看带有 colClasses 的标题并告诉解释器清空所有指定的列(非 NULL)。使用这个向量,然后我将它插入到我的绘图函数中:

> plot(net, main = "Financial Intermediaries", edge.arrow.size=.4, vertex.size=as.matrix(df), vertex.label.color="black")

我使用as.matrix(df) 制作矩阵并将其设置为vertex.size=。给定一个只有一维的向量,R 能够快速生成适当的矩阵(我猜)。

我仍然需要做一些重新标记和连接边缘,但它在图形中起作用。我绘制了按总资产持有量最大的 26 家商业银行(并将它们调整为占美国商业银行总资产的百分比),因此您会看到节点的大小从 26-1 增加。这是输出。

就像我说的,这个解决方案有效,但我不确定它是否被认为是适当的或洁净的。我欢迎任何人编辑此解决方案,以便澄清我的代码实际发生的情况,或者发布适当/优化的解决方案(如果存在)。在将其标记为已解决之前,我将在这篇文章中给出可靠的几天,因为我仍然希望在这个令人困惑的问题上得到可靠的答案。

P.S. 如果有人知道强制节点不重叠的方法,我将不胜感激评论解释如何做到这一点。如果您查看我的图片,您会发现当最大节点被其大小接近的对等节点覆盖时,使其他节点相形见绌的效果会减弱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多