geom_nodelabel_repel () позиция для кругового графика ggraph - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть схема сети, которая выглядит следующим образом: enter image description here

Я сделал это с помощью ggraph и добавил метки с помощью geom_nodelabel_repel () из ggnetwork:

( 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, но они применяются ко всем меткам, и не похоже, что есть способ подмножества или положения, определяющих c точек.

Извиняюсь за то, что не привел воспроизводимый пример, но я не был уверен, как это сделать, не ставя под угрозу личность респондентов из моего опроса.

1 Ответ

0 голосов
/ 08 апреля 2020

Ну, всегда есть интенсивный вручную, но эффективный метод для отдельного добавления функции geom_node_label_repel для узлов слева и справа от графика. Это не совсем элегантно и, вероятно, плохая практика кодирования, но я сам делал подобные вещи, когда не могу найти элегантное решение. Это работает очень хорошо, когда у вас нет большого набора данных для начала, и если вы не планируете создавать один и тот же график снова и снова. По сути, это повлечет за собой:

  1. Определение наличия в вашем наборе данных свойства, которое помещает точки слева и справа. В этом случае это не выглядит так, поэтому вам просто нужно будет вручную создать список этих записей в «левом» и «правом» графике.

  2. Использование отдельных вызовов geom_node_label_repel с различными значениями nudge_x. Используйте любой разумный метод для подстановки «левого» и «правого точек данных. Вы можете создать новый столбец в наборе данных или использовать форматирование в строке, например data = subset(your.data.frame, property %in% left.list)

Например, если вы создали в вашем data.frame столбец с именем subset.side, который является «левым» или «правым» (здесь: 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.left и names.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, ...
)

Если честно, я раньше не работал с узлом geom s, поэтому я предполагаю, что расположение меток не повлияет на отображение (как это было бы с другими геомами).

...