Круговая диаграмма с меткой, показанной внутри, и процентное содержание, показанное вне - PullRequest
1 голос
/ 07 ноября 2019

У меня есть такие данные, и мне нужно нарисовать круговую диаграмму:

# Creat bar chart for jam language
library("ggplot2")  # Data visualization
library("dplyr")    # Data manipulation
library("RColorBrewer")
myPalette <- brewer.pal(5, "Set2") 


all_languages <- data.frame(
  Languages = c("English", "French", "Spanish", "Portuguese", "Others"),
  n = c(81, 4, 3, 2, 3),
  prop = c(87.1, 4.3, 3.2, 2.2, 3.2)
)

# Add label position
all_languages  <-all_languages %>%
  arrange(desc(Languages)) %>%
  mutate(lab.ypos = cumsum(n) - 0.5*n)


ggplot(all_languages , aes(x = "", y = n, fill = Languages)) +
  geom_bar(width = 1, stat = "identity", color = "white") +
  coord_polar("y", start = 0)+
  geom_text(aes(y = lab.ypos, label = n), color = "white")+
  scale_fill_manual(values = myPalette) +
  theme_void()

Вот мой график: enter image description here

Теперь я хочутакже добавьте процент вне графика в соответствующем срезе. Так что мой английский слайд будет иметь 87.1% вне его окружности. Мой процент хранится в all_languages$prop. Как мне это сделать?

Во-вторых, как мне переместить метку чуть дальше от центра? Это связано с тем, что в небольших срезах метки чисел слишком перегружены.

ПОПЫТКА : я пытался следовать этому ответу Как разместить метки за пределами круговой диаграммы?

Но выдает ошибку, которая говорит, что 2 строки отсутствуют ... В частности, мои испанские и португальские ломтики не имеют метки. Кроме того, мой случай отличается, потому что я хочу ОБА метку внутри и процент снаружи.

Я пытался следовать этому ответу с помощью следующих кодов:

all_languages <-all_languages %>%
  arrange(desc(Languages)) %>%
  mutate(end = 2 * pi * cumsum(prop)/sum(prop),
       start = lag(end, default = 0),
       middle = 0.5 * (start + end),
       hjust = ifelse(middle > pi, 1, 0),
       vjust = ifelse(middle < pi/2 | middle > 3 * pi/2, 0, 1))

ggplot(all_languages) + 
  geom_arc_bar(aes(x0 = 0, y0 = 0, r0 = 0, r = 1,
                   start = start, end = end, fill = Languages)) +
  geom_text(aes(x = 1.05 * sin(middle), y = 1.05 * cos(middle), label = prop,
                hjust = hjust, vjust = vjust)) +
  coord_fixed() +
  scale_x_continuous(limits = c(-1.5, 1.4),  # Adjust so labels are not cut off
                     name = "", breaks = NULL, labels = NULL) +
  scale_y_continuous(limits = c(-1, 1),      # Adjust so labels are not cut off
                     name = "", breaks = NULL, labels = NULL)

Я получил ниже предупреждение

Предупреждающее сообщение: удалены 2 строки, содержащие пропущенные значения (geom_text)

и в моем круге отсутствует метка для 2 срезов: enter image description here

Окончательное решение : Я буду следовать ответу Баппа Даса ниже и немного отредактирую этикетки. Я положу и счет и процент вне пирога.

1 Ответ

1 голос
/ 07 ноября 2019

Вы можете использовать следующий код с базой R

library(RColorBrewer)
Languages = c("English", "French", "Spanish", "Portuguese", "Others")
n = c(81, 4, 3, 2, 3)
prop = c("87.1", "4.3", "3.2", "2.2", "3.2")

lbls <- paste(prop,"%",sep=" ")
lgd <- c("English", "French", "Spanish", "Portuguese", "Others")
cols = brewer.pal(n = length(prop), name = 'Set3')
pie(n, labels = lbls, col=cols)
legend("topright", legend=lgd, cex=0.9, bty = "n", fill = cols)

enter image description here

Это то, что вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...