Измените ‘aaa’ из легенды geom_text на соответствующий текст метки

Подобно этому вопросу, а также this, я предпочитаю иметь легенду чтобы geom_text был текстовой меткой, а не aaa. (т.е. «ааа» внутри круга в легенде ребенка должно быть 0,1,2,3,4. См. прилагаемое изображение)

Вот мои данные:

 data.frame(
            ID = c(1L, 3L, 5L, 11L, 13L, 18L, 20L, 24L, 33L, 34L, 36L),
       sum_hrs = c(12, 8, 68, 44, 16, 12, 36, 16, 4, 20, 4),
  avg_workload = c(263.1615,275.312,269.462444444444,
                   268.867666666667,276.686,257.3605,267.8695,268.3355,
                   239.409,260.230333333333,330.061),
      avg_achv = c(92.5,98,94.2222222222222,
                   94.8333333333333,92,98,94.25,93.5,98,95.3333333333333,100),
        mchild = c(1L, 0L, 1L, 2L, 3L, 0L, 4L, 0L, 2L, 0L, 1L),
       drinker = as.factor(c("No","Yes","Yes",
                             "Yes","Yes","No","Yes","Yes","No","No",
                             "Yes"))
)

Я пробовал предложения ответов в связанных вопросах SO, но не смог заставить его работать. Скорее всего, у меня некорректная индексация гробов. Итак, я прочитал документацию, но до сих пор не могу ее понять. Вот что я сделал до сих пор:

p2 <- ggplot(data=sum_ua, aes(x=avg_achv, y=sum_hrs, size=mchild, color=drinker, alpha=sum_hrs)) +
    geom_point() +
    geom_text(data=sum_ua, aes(x=avg_achv, y=sum_hrs, label=mchild), color='#A9A9A9') +
    scale_size(range=c(4,20)) +
    scale_alpha_binned(range = c(0.01, 1), guide = 'none') +    
    new_scale_color()

g <- ggplotGrob(p2)
lbls <- unique(sort(sum_ua$mchild))
g$grobs[[15]][[1]][[1]]$grobs[[1]]$label <- lbls[1]
g$grobs[[15]][[1]][[1]]$grobs[[6]]$label <- lbls[2]
g$grobs[[15]][[1]][[1]]$grobs[[8]]$label <- lbls[3]

g$grobs[[grep("guide", g$layout$name)]]

grid.draw(g)

Вот мой результат:  p2 вывод графика

Извините за основной вопрос и спасибо за вашу помощь! :)

См. также:  Небольшие значения на аллювиальном графике, когда уменьшение размера шрифта не является решением
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. sarah am

    Вместо того, чтобы возиться с таблицей графика графика, вы можете создать собственный scale_discrete_identity() для эстетики метки. Вам просто нужно убедиться, что на нем есть легенда и что вся информация аналогична легенде размера (заголовок, разрывы, метки и т. Д.).

    library(ggplot2)
    library(ggnewscale)
    
    sum_ua <- data.frame(
      ID = c(1L, 3L, 5L, 11L, 13L, 18L, 20L, 24L, 33L, 34L, 36L),
      sum_hrs = c(12, 8, 68, 44, 16, 12, 36, 16, 4, 20, 4),
      avg_workload = c(263.1615,275.312,269.462444444444,
                       268.867666666667,276.686,257.3605,267.8695,268.3355,
                       239.409,260.230333333333,330.061),
      avg_achv = c(92.5,98,94.2222222222222,
                   94.8333333333333,92,98,94.25,93.5,98,95.3333333333333,100),
      mchild = c(1L, 0L, 1L, 2L, 3L, 0L, 4L, 0L, 2L, 0L, 1L),
      drinker = as.factor(c("No","Yes","Yes",
                            "Yes","Yes","No","Yes","Yes","No","No",
                            "Yes"))
    )
    
    ggplot(data=sum_ua, aes(x=avg_achv, y=sum_hrs, size=mchild, color=drinker, alpha=sum_hrs)) +
      geom_point() +
      geom_text(data=sum_ua, aes(x=avg_achv, y=sum_hrs, label=as.character(mchild)), color='#A9A9A9') +
      scale_size(range=c(4,20)) +
      scale_alpha_binned(range = c(0.01, 1), guide = 'none') +   
      scale_discrete_identity(guide = "legend", aesthetics = "label",
                              name = "mchild") +
      new_scale_color()
    

    Создано 2021-02-01 пакетом REPEX (v0.3.0)

    Большое вам спасибо, teunbrand. Это работает! :) Что делать, если я хотел убрать / скрыть текст рядом с кружками, что мне делать? Я пытался использовать scale_fill_identity, но не смог заставить его работать .. person sarah am; 01.02.2021

    Я думаю, вы можете сделать это, установив labels = NULL как для размера, так и для дискретной шкалы идентичности, или установив guide = guide_legend(label = FALSE) в обеих этих шкалах. person sarah am; 01.02.2021

  2. sarah am

    В вашем случае это работает

    g <- ggplotGrob(p2)
    g$grobs[[15]][[1]][[1]]$grobs[[5]]$label <- 0
    g$grobs[[15]][[1]][[1]]$grobs[[8]]$label <- 1
    g$grobs[[15]][[1]][[1]]$grobs[[11]]$label <- 2
    g$grobs[[15]][[1]][[1]]$grobs[[14]]$label <- 3
    g$grobs[[15]][[1]][[1]]$grobs[[17]]$label <- 4
    grid::grid.draw(g)
    

    Или, чтобы избежать жесткого кодирования и повторения того же кода снова, мы можем использовать:

    labels <- 0:4
    inds <- which(colSums(sapply(g$grobs[[15]][[1]][[1]]$grobs,class) == 'text') > 0)
    g$grobs[[15]][[1]][[1]]$grobs[inds] <- Map(function(x, y) {x$label <- y;x}, 
                            g$grobs[[15]][[1]][[1]]$grobs[inds], labels)
    grid::grid.draw(g)
    

    введите описание изображения здесь

    Спасибо, Ронак, ваш результат — это то, чего я пытаюсь достичь :) Но когда я попытался использовать ваше решение, у меня возникла эта ошибка .. Ошибка в _1 _ [[11]]: индекс вне пределов … Не могли бы вы мне помочь из? person sarah am; 01.02.2021

    Странно, что у меня отлично работает с данными, которыми вы поделились. Вы применяете это к тому же набору данных? В какой строке выдается ошибка? Вы запускали g <- ggplotGrob(p2)? Я не добавил new_scale_color() в p2, так как не знаю, из какого он пакета, не уверен, имеет ли это какое-то значение. person sarah am; 01.02.2021

    Ага, используя тот же набор данных. И да, я запустил g ‹- ggplotGrob (p2). Получил ошибку, начиная с этой строки: g $ grobs [[15]] [[1]] [[1]] $ grobs [[11]] $ label ‹- 2. Тогда я попытался изменить индекс grobs, и он похоже, что index больше 8 дает ошибку .. Я также удалил new_scale_color (), чтобы отразить ваш ответ .. Я думаю, что индексирование неправильное для моего графика .. Вы можете показать мне, как вы получаете индекс для каждой метки? (ваш индекс гроба 5, 8, 11, 14, 17) person sarah am; 01.02.2021

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: