Tenho alguns dados de pesquisa e criei círculos dentro de círculos para representar como uma pesquisa está indo. Estou usando o ggforce para criar os círculos, mas meu problema é que o último círculo que quero dividir em 3 partes e ajustar o texto dentro das fatias. Também quero colori-las (as fatias) com cores diferentes (grupo A: vermelho, grupo B: verde, grupo C: amarelo). Como posso fazer isso? Alguém ajuda?
total_participants = 7500
undelivered = 2500
total_invited = 5000
total_responses = 2000
total_unanswered = 1100
group_c = 900
group_a = 650
group_b = 450
partially_completed = 300
library(ggplot2)
library(ggforce)
# Define total responses in the pie chart
total_count = group_a + group_b + group_c
# Define proportional angles (in radians)
angle_a = 1.4 * pi * (group_a / total_count)
angle_b = 8 * pi * (group_b / total_count)
angle_c = 2 * pi - (angle_a + angle_b)
# Cumulative angles for the pie slices
angles = c(0, angle_a, angle_a + angle_b, 2 * pi)
# Midpoint angles for text placement
mid_angles = c((angles[1] + angles[2]) / 2,
(angles[2] + angles[3]) / 2,
(angles[3] + angles[4]) / 2)
# Pie chart position and radius
pie_center_x = 2.7
pie_center_y = -0.6
pie_radius = 3
# Data frame for the pie chart
pie_data = data.frame(
category = c(paste0("Group A:\n ", group_a),
paste0("Group B: \n", group_b + total_unanswered),
paste0("Group C: \n", group_c)),
x_start = pie_center_x,
y_start = pie_center_y,
x_end = pie_center_x - pie_radius * cos(angles[2:4]),
y_end = pie_center_y + pie_radius * sin(angles[2:4]),
text_x = pie_center_x - (pie_radius * 0.6) * cos(mid_angles),
text_y = pie_center_y + (pie_radius * 0.4) * sin(mid_angles)
)
# Bubble chart data
bubble_data = data.frame(
group = c(paste0("Total Participants: ", total_participants),
paste0("Invited: ", total_invited),
paste0("Responded: ", total_unanswered + group_a + group_b + group_c),
paste0("Not Delivered: ", undelivered),
paste0("Partial Responses: ", partially_completed)),
radius = c(7, 5, 3, 0.8, 0.8),
x0 = c(0, 1, 2.7, -5.4, -1),
y0 = c(0, 0, -0.6, 1, 1.4)
)
# Final plot
plot_bubble_pie = ggplot() +
# Bubble chart
ggforce::geom_circle(data = bubble_data, aes(x0 = x0, y0 = y0, r = radius,
fill = factor(group, group)),
alpha = 1) +
geom_text(data = bubble_data, aes(x = x0, y = y0 + radius + 0.2, label = group),
size = 3.2, fontface = "bold") +
# Pie chart slice lines
geom_segment(data = pie_data,
aes(x = x_start, y = y_start, xend = x_end, yend = y_end, color = category),
color = "black",
linewidth = 1) +
# Labels inside pie slices
geom_label(data = pie_data,
aes(x = text_x, y = text_y, label = category),
size = 3.2, fontface = "bold", label.size = 0, fill = NA) +
# Custom color mappings
scale_color_manual(values = c("Group A" = "black", "Group B" = "black", "Group C" = "black"), guide = "none") +
scale_fill_manual(values = c('#77bca2', '#e1926b', '#a09cc8', "grey", "orange", "indianred", "orange"),
guide = 'none') +
coord_equal() +
theme_void()
# Display the plot
plot_bubble_pie
Você não conseguirá forçar o ggforce a lhe dar segmentos de círculo. Para esse tipo de problema, eu geralmente escreveria apenas pequenas funções geométricas para me dar círculos e segmentos de círculo como data frames que eu posso desenhar como polígonos:
Agora podemos escrever o gráfico inteiro, incluindo dados, em um único pipe. Observe que, diferentemente do seu diagrama original, o tamanho de cada círculo e segmento é proporcional ao número real dentro de cada grupo. Também usei texto curvo, para melhor caber claramente dentro do diagrama. A seção "não entregue" é, na verdade, toda a parte fora do círculo "Convidado", então não está claro por que você tinha um pequeno círculo extra rotulado ali. Em vez disso, coloquei um rótulo aqui para indicar o que essa seção colorida representa.