Home > Enterprise >  How to correctly adjust geom_label() within each sector of a pie chart?
How to correctly adjust geom_label() within each sector of a pie chart?

Time:10-03

I'm trying to put labels for each value within each sector in a pie chart with ggplot2

My data:

simulpie1 <- data.frame(
  segtos = c("Perfil 1", "Perfil 2", "Perfil 3", "Perfil 4"),
  percents = c(26, 34, 30, 10)
)

The colors for each sector:

c("steelblue", "magenta", "orange", "lightgreen")

So...

26 - steelblue
34 - magenta
30 - orange
10 - lightgreen

I keep the order with this function:

simulpie1$segtos <- factor(simulpie1$segtos, levels = simulpie1$segtos)

And I used this argument (inside of geom_label()) to try to center the values ​​to the center of each sector:

position = ggplot2::position_stack(vjust = .5)

But, this result:

enter image description here

My plot code:

ggplot2::ggplot(data = simulpie1, ggplot2::aes(x = "", y = percents, fill = segtos))  
  
  ggplot2::geom_col(color = "black")  
  ggplot2::coord_polar(theta = "y")  
  ggplot2::scale_fill_manual(values = c("steelblue", "magenta", "orange", "lightgreen"))  
  
  ggplot2::geom_label(
    ggplot2::aes(label = scales::number(
      percents, suffix = "%", accuracy = .1
      )
    ),
    fill = "#f2f2f2",
    colour = "#020202",
    size = 6,
    fontface = "bold",
    position = ggplot2::position_stack(vjust = .5)
  )  
  
  ggplot2::theme(
    legend.title = ggplot2::element_text(face = "bold"), 
    legend.box.spacing = ggplot2::unit(-.7, "cm"), # distance between plot-legend
    legend.spacing.y = ggplot2::unit(.2, 'cm'), # distance between legend.title and all labels
    legend.key.size = ggplot2::unit(.5, "cm"), # size of labels
    legend.title.align = 0.5, # align legend.title
    axis.title = ggplot2::element_blank(),
    axis.text = ggplot2::element_blank(),
    axis.ticks = ggplot2::element_blank(),
    panel.grid = ggplot2::element_blank(),
    panel.background = ggplot2::element_rect(fill = "#f2f2f2", colour = "#f2f2f2"),
    plot.background = ggplot2::element_rect(fill = "#f2f2f2", colour = "#f2f2f2"),
    legend.background = ggplot2::element_rect(fill = "#f2f2f2", colour = "#008cba")
  )   
  
  # distance between legend.title and all labels
  ggplot2::guides(fill = ggplot2::guide_legend(byrow = TRUE))   
  
  ggplot2::labs(fill = "Segmentos")

I would like the values ​​to be centered in their respective sectors (colors).

CodePudding user response:

As quite often the issue is the grouping. For the geom_col the grouping and the order of "stack" aka the slices of your pie are defined by the fill aes. However, for the geom_label you are overriding the grouping by setting the fill as an argument. Hence, to achieve the same grouping and to align the labels with the "slices" you have to be more explicit by mapping segtos on the group aes in geom_label:

library(ggplot2)

ggplot(data = simulpie1, aes(x = "", y = percents, fill = segtos))  
  geom_col(color = "black")  
  coord_polar(theta = "y")  
  scale_fill_manual(values = c("steelblue", "magenta", "orange", "lightgreen"))  
  geom_label(
    aes(label = scales::number(
      percents,
      suffix = "%", accuracy = .1
    ), group = segtos),
    fill = "#f2f2f2",
    colour = "#020202",
    size = 6,
    fontface = "bold",
    position = position_stack(vjust = .5)
  )  
  theme(
    legend.title = element_text(face = "bold"),
    legend.box.spacing = unit(-.7, "cm"), # distance between plot-legend
    legend.spacing.y = unit(.2, "cm"), # distance between legend.title and all labels
    legend.key.size = unit(.5, "cm"), # size of labels
    legend.title.align = 0.5, # align legend.title
    axis.title = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    panel.grid = element_blank(),
    panel.background = element_rect(fill = "#f2f2f2", colour = "#f2f2f2"),
    plot.background = element_rect(fill = "#f2f2f2", colour = "#f2f2f2"),
    legend.background = element_rect(fill = "#f2f2f2", colour = "#008cba")
  )  
  # distance between legend.title and all labels
  guides(fill = guide_legend(byrow = TRUE))  
  labs(fill = "Segmentos")

  • Related