1

我有一个看起来像这样的网络图:在此处输入图像描述

我使用 ggraph 制作并使用 ggnetwork 中的 geom_nodelabel_repel() 添加了标签:

( ggraph_plot <- ggraph(layout) +
  geom_edge_fan(aes(color = as.factor(responses), edge_width = as.factor(responses))) +
  geom_node_point(aes(color = as.factor(group)), size = 10) +
  geom_nodelabel_repel(aes(label = name, x=x, y=y),  segment.size = 1, segment.color = "black", size = 5) +
  scale_color_manual("Group", values = c("#2b83ba", "#d7191c", "#fdae61")) +
  scale_edge_color_manual("Frequency of Communication", values = c("Once a week or more" = "#444444","Monthly" = "#777777", 
                                   "Once every 3 months" = "#888888", "Once a year" = "#999999"),
                          limits = c("Once a week or more", "Monthly", "Once every 3 months", "Once a year")) +
  scale_edge_width_manual("Frequency of Communication", values = c("Once a week or more" = 3,"Monthly" = 2, 
                                   "Once every 3 months" = 1, "Once a year" = 0.25),
                          limits = c("Once a week or more", "Monthly", "Once every 3 months", "Once a year")) +

  theme_void() +
  theme(legend.text = element_text(size=16, face="bold"),
        legend.title = element_text(size=16, face="bold")) )

我想让情节左侧的标签偏向左侧,而情节右侧的标签偏向右侧。我想这样做是因为实际标签很长(组织名称),并且它们妨碍了实际情节中的线条。

如何使用 geom_nodelabel_repel() 做到这一点?我尝试了 box_padding 和 point_padding 以及 h_just 和 v_just 的不同组合,但这些组合适用于所有标签,而且似乎没有办法对特定点进行子集化或定位。

很抱歉没有提供可重复的示例,但我不确定如何在不影响调查中受访者身份的情况下做到这一点。

4

1 回答 1

1

好吧,总是有手动密集但有效的方法geom_node_label_repel,分别为绘图的“左侧”与“右侧”的节点添加函数。这一点也不优雅,而且可能是不好的编码实践,但是当我想不出一个优雅的解决方案时,我自己也做过类似的事情。当您一开始没有非常大的数据集并且不打算一遍又一遍地制作相同的情节时,它的效果非常好。基本上,它将需要:

  1. 确定数据集中是否存在将点放置在“左侧”与“右侧”的属性。在这种情况下,它看起来不像,因此您只需手动创建一个列表,其中包含绘图“左侧”与“右侧”的条目。

  2. 使用geom_node_label_repel具有不同nudge_x值的单独调用。使用任何合理的方法对“左”和“右”数据点进行子集化。您可以在数据集中创建一个新列,或使用内联格式,如data = subset(your.data.frame, property %in% left.list)

例如,如果您subset.side在 data.frame (此处:)中创建了一个名为“左”或“右”的列your.data.frame,则您的调用geom_node_label_repel可能类似于:

geom_node_label_repel(
    data=subset(your.data.frame, subset.side=='left'),
    aes(label=name, x=x, y=y), segment.size=1, segment.color='black', size=5,
    nudge_x=-10
) +
geom_node_label_repel(
    data=subset(your.data.frame, subset.side=='right'),
    aes(label=name, x=x, y=y), segment.size=1, segment.color='black', size=5,
    nudge_x=10
) +

或者,您可以根据标签名称本身创建一个列表 - 假设您调用了这些列表names.leftnames.right,您可以在其中通过交换相应的子集,如下面的伪代码所示:

geom_node_label_repel(
   data=subset(your.data.frame, name %in% names.left),...
    nudge_x = -10, ...
) +
geom_node_label_repel(
   data=subset(your.data.frame, name %in% names.right),...
    nudge_x = 10, ...
)

公平地说,我之前没有使用过 node geoms,所以我在这里假设标签的位置不会影响映射(因为它不会影响其他几何图形)。

于 2020-04-08T20:27:01.570 回答