【问题标题】:Plotting a network using ggplot using data from one file and color coding using another使用来自一个文件的数据和使用另一个文件的颜色编码使用 ggplot 绘制网络
【发布时间】:2017-10-19 04:44:39
【问题描述】:

我很可能遇到了一个简单解决方案的问题。我有两个数据框。第一个是一个简单的边列表,其权重如下所示:

head(merge_allwinsloss_df)

winner loser weight
1    CAL   HAW     20
2   TENN   APP      7
3    LOU  CHAR     56
4    CMU   PRE     46
5   WAKE  TULN      4
6    CIN   UTM     21

第二个是提供分组(以大学橄榄球会议的形式)的文件,如下所示:

 short conference
1   TEM        AAC
2   USF        AAC
3   UCF        AAC
4   CIN        AAC
5   ECU        AAC
6  CONN        AAC

我想做的是创建一个图(最好使用 ggplot),该图使用有向图(从赢家到输家),对边进行加权(通过权重)并按同一会议中的团队对边进行着色,以及会议的颜色代码节点。下面的代码是一个“开始”,但我并没有真正到达任何地方。

ggplot(data = merge_allwinsloss_df, aes(from_id = winner, to_id = loser)) +
  geom_net(aes(color = all_teams_by_conference_df), layout.alg = "fruchtermanreingold", 
           size = 2, labelon = TRUE, vjust = -0.6, ecolour = "grey80",
           directed = TRUE, fontsize = 3, ealpha = 0.5) +
  scale_color_brewer("Conference",
                     palette = "Paired") +
  xlim(c(-0.05, 1.05)) +
  theme_net() +
  theme(legend.position = "bottom")

我融化了数据,但这也导致了许多其他问题,这些问题主要与丢失映射或我无法弄清楚如何通过会议正确标记merge_allwinsloss_df 中的团队有关。如果这不是很清楚,我很抱歉。几天来,我一直在寻求帮助并绞尽脑汁,所以任何帮助都会得到极大的赞赏。提前致谢。

更新:这是一个最小的例子。

#Create a list of CFB winners and losers with weight given by point differential
merge_allwinsloss_ALT_df <- data.frame(matrix(c("CAL","HAW", 12, "TENN", "APP", 7, "LOU", "CHAR", 56, 
                                  "CMU", "HAW", 0, "WVU", "APP", 20 , "ARK", "TENN", 6, "CMU", "WVU", 7,
                                  "WVU", "JMU", 15, "IND", "MIN", 3, "IND", "HAW", 14, "FSU", "TCU", 2, 
                                  "TCU", "ARK", 14),
            nrow=12,ncol=3,byrow=TRUE))
colnames(merge_allwinsloss_ALT_df) <- c("winner", "loser", "weight")
merge_allwinsloss_ALT_df

#Create a list of CFB teams with conference associations
all_teams_by_conference_ALT_df<- data.frame(matrix(c("CAL","PAC", "HAW", "MAC", "TENN", "SEC", 
                                                     "APP", "SUN BELT", "LOU", "ACC", "CHAR", "FCS", 
                                                "CMU", "MAC", "WVU", "BIG 12", "ARK", "SEC", "JMU", "FCS",
                                                "IND", "BIG 10", "MIN", "BIG 10", "FSU", "ACC", "TCU",
                                                "BIG 12"),
                                              nrow=14,ncol=2,byrow=TRUE))
colnames(all_teams_by_conference_ALT_df) <- c("team", "conference")
all_teams_by_conference_ALT_df

# (attempt to) Plot the two data files using the first as the nodes and the # second as a reference file for coloring by conference. 

ggplot(data = merge_allwinsloss_ALT_df, aes(from_id = winner, to_id = loser)) +
  geom_net(aes(color = all_teams_by_conference_ALT_df), layout.alg = "fruchtermanreingold", 
           size = 2, labelon = TRUE, vjust = -0.6, ecolour = "grey80",
           directed = TRUE, fontsize = 3, ealpha = 0.5) +
  scale_color_brewer("Conference",
                     palette = "Paired") +
  xlim(c(-0.05, 1.05)) +
  theme_net() +
  theme(legend.position = "bottom")

我意识到这里出了点问题,但我就是想不通。此外,我想设置它,以便 (a) 同一会议中所有相互交手的球队共享其边缘的共同颜色,并且 (b) 使用 @987654328 中的权重列对边缘进行加权@。

感谢您的帮助!

【问题讨论】:

  • TEM 和 AAC 是一个会议的一部分?数据框缺少标题
  • 如果您提供complete minimal reproducible example 来回答您的问题,我们更有可能为您提供帮助。我们可以从中工作并用来向您展示如何回答您的问题。
  • 对不起@HardikGupta。我已经解决了桌子问题。它现在有标题。 @EricFail,当我尝试运行绘图时收到此输出:Error: Aesthetics must be either length 1 or the same as the data (832): colour, from_id, to_id. 感谢您的帮助。
  • @EricFail 我很抱歉。这是我第一次在这里发帖,我不明白什么是完整的最小可重现示例,您清楚地将其链接起来。上面的代码已经更新。我非常感谢您的帮助和耐心。
  • 一切都好。我很感激你投入其中的工作!但是,minimal 示例确实很有帮助。您的完整的可重现示例有 600 行代码。您是否有机会在 the `geomnet' package examples page 找到您正在寻找的示例并将其重新加工成一个完整的最小可重复示例?

标签: r ggplot2


【解决方案1】:

您需要将两个表连接在一起,以便它们都在一个数据框中。

要添加获胜者的会议,您需要执行以下操作:

df1 <- merge(merge_allwinsloss_ALT_df,all_teams_by_conference_ALT_df, 
  by.x="winner",by.y="team",all.x=T)

要同时记录获胜和失败球队的会议,我会将df1$conference 重命名为“conference_winner”,然后这次使用df1by.x="loser" 再次执行相同的合并

另外,我建议尝试为您的数据框使用较短的名称。一遍又一遍地输入merge_allwinsloss_ALT_df 是没有意义的。 merge 也是一个函数,因此当您在名称中使用它时会造成混淆,从而使问题更加复杂(请参阅上文,由于您的命名约定,我的代码是 merge(merge...))。

之后,您可以将color 和/或fill 映射到conference_winnerconference_loser

【讨论】:

  • 我想我可能一直没有很好地沟通。我实际上想绘制带有定向边的顶点(teams)(使用从winnerloser)并通过会议对它们进行颜色编码。此外,在同一个会议中相互比赛的团队共享具有相同颜色的边。
  • 我在发布原始问题之前做了类似于您所说的事情,但无法达到预期的结果。在保持winnerloser(和weight)静态的同时熔化数据使我的行数翻了一番,原因很明显。所以我不知道该怎么做。再次感谢!
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
相关资源
最近更新 更多