Неожиданное поведение при маркировке круговой диаграммы ggplot2 - PullRequest
0 голосов
/ 10 сентября 2018

Я проверил другие вопросы здесь, но я не мог видеть эту проблему. У меня проблема с маркировкой. Странно то, что код работает вполне нормально для всех меток, кроме одной. Когда я проверил набор данных (что-то действительно простое), все оказалось довольно хорошо (один столбец с факторными переменными, другой с числовыми).

Это странно, потому что работает нормально для некоторых других данных с такой же структурой. Тем не менее, я попробовал / проверил все, но не смог решить эту проблему. Вот проблема:

library(ggplot2)
library(ggrepel)

df = data.frame(
  status = c("Oak", "maple", "walnut", "Pine"),
  value = c( 47.54, 37.70, 11.48, 3.28))

ggplot(df, aes(x = "" , y = value, fill = fct_inorder(status))) +
  geom_bar(width = 1, stat = "identity") +
  coord_polar(theta = "y", start = 0 ) +
  scale_fill_brewer(palette = "Set3", direction = -4) +
  geom_label_repel(aes(label = paste0(value, "%")), size=4, show.legend = F, nudge_x = 1) +
  guides(fill = guide_legend(title = "Status")) +
  theme_void()

One of the labels came up with an issue

Было бы замечательно, если бы у меня было хотя бы предложение попробовать или объяснить это странное поведение.

Очевидно, с новым обновлением ggplot2 они выяснили проблему положения, не предоставляя никаких дополнительных данных о положении, но каким-то образом, если вы не можете использовать их из-за технических ограничений, это может помочь решить проблемы такого рода.

1 Ответ

0 голосов
/ 10 сентября 2018

Я думаю, проблема в том, что geom_bar (или лучше geom_col) по умолчанию равен position = stack, тогда как geom_text_repel - нет. Установка geom_text_repel в position= "stack" ставит метки в конце каждой секции круговой диаграммы, а не в средней точке.

Возможно предварительно рассчитать позиции. Приведенный ниже код работает для показанных данных, но может не быть общим, поскольку зависит от порядка строк.

library(ggplot2)
library(ggrepel)

df = data.frame(
  status = c("Oak", "maple", "walnut", "Pine"),
  value = c( 47.54, 37.70, 11.48, 3.28))

df2 <- df %>% 
  mutate(
    cs = rev(cumsum(rev(value))), 
    pos = value/2 + lead(cs, 1),
    pos = if_else(is.na(pos), value/2, pos))

ggplot(df, aes(x = "" , y = value, fill = fct_inorder(status))) +
  geom_col(width = 1) +
  coord_polar(theta = "y", start = 0 ) +
  scale_fill_brewer(palette = "Set3", direction = -4) +
  geom_label_repel(aes(y = pos, label = paste0(value, "%")), data = df2, size=4, show.legend = F, nudge_x = 1) +
  guides(fill = guide_legend(title = "Status")) +
  theme_void()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...