У меня есть такие данные, и мне нужно нарисовать круговую диаграмму:
# 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()
Вот мой график:
Теперь я хочутакже добавьте процент вне графика в соответствующем срезе. Так что мой английский слайд будет иметь 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 срезов:
Окончательное решение : Я буду следовать ответу Баппа Даса ниже и немного отредактирую этикетки. Я положу и счет и процент вне пирога.