Ggraph: настройка положения текстовой метки на круговой дендрограмме

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

Вот как сейчас выглядит моя круговая дендрограмма: Но я надеюсь, что текстовые метки будут выглядеть так:

Как это исправить? Я точно следовал коду.

library(tidyverse)
library(ggraph)
library(igraph)
library(RColorBrewer)
# PLOT 
ggraph(mygraph, layout = 'dendrogram', circular = TRUE) +
  geom_edge_diagonal(colour = "grey") +
  scale_edge_colour_distiller(palette = "RdPu") +
  geom_node_text(aes(x = x*1.15,
                       y=y*1.15,
                       filter = leaf,
                       label = name,
                       angle = angle,
                       hjust = hjust,
                       colour = group), size=2.7, alpha=1) +
  geom_node_point(aes(filter = leaf,
                      x = x*1.07,
                      y=y*1.07,
                      colour=group,
                      size=value,
                      alpha=0.5)) +
  scale_colour_manual(values= rep( brewer.pal(9,"Paired") , 30)) +
  scale_size_continuous( range = c(0.1,10) ) +
  theme_void() +
  theme(
    legend.position = "none",
    plot.margin=unit(c(0,0,0,0),"cm"),
  ) +
  expand_limits(x = c(-1.3, 1.3), y = c(-1.3, 1.3))

Ниже приведены данные графа.

> dput(mygraph) structure(list(75, TRUE, c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 2, 1, 3, 1, 5, 6, 7, 2, 8, 9, 3, 10, 10, 11, 11, 5, 4, 3, 10, 2, 1, 7, 9, 4, 11, 1, 3, 3, 2, 5, 3, 7, 3, 3, 2, 10, 5, 2, 7, 7, 3, 4, 9, 3, 2, 9, 5, 7, 4, 3,
10, 5, 5, 3, 3, 9, 9, 2, 4, 9, 9, 9, 9, 1, 9, 2, 2, 12, 3, 10, 5, 9, 3, 5, 3, 4, 2, 5), c(4, 3, 11, 2, 9, 6, 5, 12, 7, 1, 10, 8, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 16, 34, 35, 36, 37, 38, 39, 40, 41, 42,
15, 43, 28, 44, 15, 45, 46, 47, 48, 49, 50, 51, 52, 53, 15, 54, 55, 28, 48, 56, 57, 58, 16, 59, 60, 61, 62, 28, 59, 63, 64, 48, 16, 39, 65, 66, 67, 68, 69, 48, 18, 70, 46, 71, 72, 39, 59, 72, 73, 16, 48, 74 ), NULL, NULL, NULL, NULL, list(c(1, 0, 1),
structure(list(), names = character(0)), list(name = c("origin", "Outdoor activities", "Domestic activities", "Arts and craft activities", "Agricultural activities", "Learning activities", "Health and wellbeing activities", "Musical activities", "Workshop
activities", "Entertainment activities", "Physical and fitness activities", "Community activities", "Mechanical activities", "Bush walking", "Baking", "Manual arts and crafts", "Community gardening", "Historical sharing Q&A", "Clothing maintenance (sewing)",
"Wild life tours", "Carpentry", "Assisted guides (student companionship)", "Knowledge passing", "Palative awareness", "Community musical bands", "Parenting skills", "General workshops", "Community theatre", "Crochet and knitting", "Water aerobics", "Gentle
physical exercise", "Community diners (meals on wheels)", "Inala homework club", "Language club", "Photography", "Physical exercises (dance, gym, colour run)", "Pet daycare", "Trivia camp", "Music lessons", "Board games", "Growing vegetables", "Cooking
cafe", "Schools camps and day visits", "Painting and sipping", "Book club", "Composing music", "Woodworking", "Cake decorating", "Cooking", "Fitness training", "Students teaching IT", "Sharing traditional recipes", "Playing music", "Traditional dancing",
"Dragon's den (chicken eggs)", "Chess", "Card games", "Tutoring", "Playing musical instruments", "Painting", "Rehabilitation and physio", "Using technology (incl. social media)", "Reading together", "Video games", "Karaoke", "Putt putt", "Table tennies",
"Playing puzzles", "Walking together", "Watching sports on the television", "Learning mechanical work", "Water sports", "Story telling", "Interpretative painting", "Life skills"), value = c(0.585580174112692, 0.893185549415648, 0.26200358569622, 0.203951701987535,
0.488889964995906, 0.58272284292616, 0.512202943209559, 0.486715000122786, 0.0233161903452128, 0.725962040247396, 0.230725078377873, 0.0891078060958534, 0.601971111027524, 0.770974726416171, 0.112899012630805, 0.702898587333038, 0.716850318480283, 0.131957670208067,
0.65517760720104, 0.910050076199695, 0.095754484878853, 0.610197829082608, 0.0592852185945958, 0.822226302931085, 0.479145678458735, 0.460636418079957, 0.704600618453696, 0.521227885968983, 0.175805907929316, 0.640184475807473, 0.45457612676546, 0.507625086698681,
0.460464909672737, 0.791949789505452, 0.679316321620718, 0.956594054820016, 0.107164902845398, 0.13667330192402, 0.956593341659755, 0.416489312890917, 0.994603507919237, 0.465922170784324, 0.166321847587824, 0.625731714069843, 0.0725796180777252, 0.963703070301563,
0.42543631256558, 0.521754823392257, 0.574694129405543, 0.888251390540972, 0.956966195488349, 0.631142220227048, 0.81483043031767, 0.999659575987607, 0.817718225996941, 0.994496389990672, 0.354073196649551, 0.502177250571549, 0.377560483757406, 0.315485945204273,
0.7389785728883, 0.218990557361394, 0.346426092088223, 0.229574259370565, 0.538299076724797, 0.135757425567135, 0.236583026824519, 0.159444775199518, 0.915375969838351, 0.191791382618248, 0.747529144166037, 0.157402683980763, 0.537972879828885, 0.872691323980689,
0.482101482339203), group = c(NA, "origin", "origin", "origin", "origin", "origin", "origin", "origin", "origin", "origin", "origin", "origin", "origin", "Outdoor activities", "Domestic activities", "Arts and craft activities", "Agricultural activities",
"Learning activities", "Domestic activities", "Outdoor activities", "Arts and craft activities", "Outdoor activities", "Learning activities", "Health and wellbeing activities", "Musical activities", "Domestic activities", "Workshop activities", "Entertainment
activities", "Arts and craft activities", "Physical and fitness activities", "Physical and fitness activities", "Community activities", "Community activities", "Learning activities", "Arts and craft activities", "Physical and fitness activities", "Domestic
activities", "Outdoor activities", "Musical activities", "Entertainment activities", "Agricultural activities", "Community activities", "Outdoor activities", "Arts and craft activities", "Learning activities", "Musical activities", "Arts and craft activities",
"Arts and craft activities", "Domestic activities", "Physical and fitness activities", "Learning activities", "Domestic activities", "Musical activities", "Musical activities", "Agricultural activities", "Entertainment activities", "Entertainment activities",
"Learning activities", "Musical activities", "Arts and craft activities", "Physical and fitness activities", "Learning activities", "Learning activities", "Entertainment activities", "Entertainment activities", "Entertainment activities", "Entertainment
activities", "Entertainment activities", "Outdoor activities", "Entertainment activities", "Mechanical activities", "Physical and fitness activities", "Learning activities", "Arts and craft activities", "Learning activities"), id = c(NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L,
47L, 48L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L), angle = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 84.1935483870968, 78.3870967741936, 72.5806451612903, 66.7741935483871, 60.9677419354839, 55.1612903225806,
49.3548387096774, 43.5483870967742, 37.741935483871, 31.9354838709677, 26.1290322580645, 20.3225806451613, 14.5161290322581, 8.70967741935483, 2.90322580645162, -2.90322580645162, -8.70967741935483, -14.5161290322581, -20.3225806451613, -26.1290322580645,
-31.9354838709677, -37.741935483871, -43.5483870967742, -49.3548387096774, -55.1612903225806, -60.9677419354839, -66.7741935483871, -72.5806451612903, -78.3870967741935, -84.1935483870968, -90, 84.1935483870968, 78.3870967741935, 72.5806451612903, 66.7741935483871,
60.9677419354839, 55.1612903225806, 49.3548387096774, 43.5483870967742, 37.741935483871, 31.9354838709677, 26.1290322580645, 20.3225806451613, 14.5161290322581, 8.70967741935482, 2.90322580645159, -2.90322580645159, -8.70967741935482, -14.516129032258,
-20.3225806451613, -26.1290322580645, -31.9354838709677, -37.741935483871, -43.5483870967742, -49.3548387096774, -55.1612903225807, -60.9677419354838, -66.7741935483871, -72.5806451612903, -78.3870967741935, -84.1935483870968, -90), hjust = c(NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)), structure(list(), names
= character(0))),
<environment>), class = "igraph")
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы напутали с расчетом угла надписей. Чтобы это исправить, я использую тригонометрию для вычисления углов на лету на основе положений узлов x и y:

library(tidyverse)
library(ggraph)
library(igraph)
library(RColorBrewer)

mygraph <- upgrade_graph(mygraph)

ggraph(mygraph, layout = "dendrogram", circular = TRUE) +
  geom_edge_diagonal(colour = "grey") +
  scale_edge_colour_distiller(palette = "RdPu") +
  geom_node_text(aes(
    x = x * 1.15,
    y = y * 1.15,
    filter = leaf,
    label = name,
    angle = ifelse(
      x >= 0,
      asin(y) * 360 / 2 / pi,
      360 - asin(y) * 360 / 2 / pi
    ),
    hjust = ifelse(
      x >= 0, 0, 1
    ),
    colour = group
  ), size = 1.3, alpha = 1, vjust = .5, color = "black") +
  geom_node_point(aes(
    filter = leaf,
    x = x * 1.07,
    y = y * 1.07,
    colour = group,
    size = value,
    alpha = 0.5
  )) +
  scale_colour_manual(values = rep(brewer.pal(9, "Paired"), 30)) +
  scale_size_continuous(range = c(0.1, 10)) +
  theme_void() +
  theme(
    legend.position = "none",
    plot.margin = unit(c(0, 0, 0, 0), "cm"),
  ) +
  expand_limits(x = c(-1.3, 1.3), y = c(-1.3, 1.3)) +
  coord_equal()

Другие вопросы по теме