настройка позиций меток в диаграмме ap ie с помощью `ggplot2` - PullRequest
0 голосов
/ 13 июля 2020

проблема

Я пытаюсь создать общую функцию для рисования помеченных p ie диаграмм с использованием ggplot2. То, что я написал, работает при большинстве обстоятельств . Контекст, в котором он работает неоптимально, - это небольшие пропорции (см. График ниже). Поэтому я хочу настроить положение метки вдоль радиальной оси таким образом, чтобы минимизировать перекрытие. Обратите внимание, что я могу просто жестко закодировать значения положения для меток таким образом, чтобы он работал для этого графика, но я хотел бы выбрать более универсальную стратегию.

data

# setup
set.seed(123)
library(ggplot2)

# for reproducibility
df <-
  structure(list(
    epoch = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L),
      .Label = c("Before", "After"),
      class = "factor"
    ),
    mode = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L),
      .Label = c("A", "P", "C", "T"), class = "factor"
    ),
    counts = c(30916L, 21117L, 7676L, 1962L, 1663L, 462L, 7221L,
               197L),
    perc = c(
      65.1192181312663,
      88.9586317297161,
      16.1681691802174,
      8.26522874715646,
      3.50282247872609,
      1.94624652455978,
      15.2097902097902,
      0.829892998567697
    ),
    label = c("65%", "89%", "16%", "8%",
              "4%", "2%", "15%", "1%")
  ),
  row.names = c(NA, -8L),
  class = c("tbl_df",
            "tbl", "data.frame")
  )

plot

Обратите внимание, что для фасета After метки перекрываются, и я хотел бы найти общее решение о том, как изменить радиальное положение меток, чтобы они перекрывались минимально.

Как это сделать?

ggplot2::ggplot(data = df, mapping = ggplot2::aes(x = "", y = perc)) +
  ggplot2::geom_col(
    mapping = ggplot2::aes(fill = mode),
    position = "fill",
    color = "black",
    width = 1,
    na.rm = TRUE
  ) + # adding label with percentages and/or counts
  rlang::exec(
    .fn = ggplot2::geom_label,
    mapping = ggplot2::aes(label = label, group = mode),
    position = ggplot2::position_fill(vjust = 0.5),
    show.legend = FALSE,
    na.rm = TRUE
  ) +
  ggplot2::facet_wrap(facets = ~epoch) +
  ggplot2::coord_polar(theta = "y")

1 Ответ

2 голосов
/ 13 июля 2020

Вы можете попробовать geom_label_repel из пакета ggrepel. Просто убедитесь, что вы установили параметр направления на «y»:

ggplot2::ggplot(data = df, mapping = ggplot2::aes(x = "", y = perc)) +
  ggplot2::geom_col(
    mapping = ggplot2::aes(fill = mode),
    position = "fill",
    color = "black",
    width = 1,
    na.rm = TRUE
  ) + # adding label with percentages and/or counts
  rlang::exec(
    .fn = ggrepel::geom_label_repel,
    mapping = ggplot2::aes(label = label, group = mode),
    position = ggplot2::position_fill(vjust = 0.5), direction = "y",
    show.legend = FALSE,
    na.rm = TRUE
  ) +
  ggplot2::facet_wrap(facets = ~epoch) +
  ggplot2::coord_polar(theta = "y")

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

...