Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

GGplot coord_pilot: moving labels only for the outer ring to the outside

I can only find a solution for this in relation to single-level pie charts. I have the chart below and some of the labels on the outer ring don’t fit well. enter image description here

I’d like to keep the labels for the inner ring where they are but move the labels for the second ring to the outside (or at least the ones that don’t fit).

Here is my code

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

ggplot(usage.may, aes(x = Level, y = Percent, fill = Subcategory, label = Label)) +
  geom_bar(stat = "identity", color='white', show.legend = FALSE) +
  geom_text(aes(label = paste0(Label, "\n", Value, " (", Per_label, ")")),
            size = 2.5, 
            colour = "white", 
            check_overlap = TRUE, 
            position = position_stack(vjust = 0.5)) +
    coord_polar('y')  +
    scale_fill_manual(values = c("C01" = "#404688FF", 
                                 "C011" = "#3B528BFF","C012" = "#3B528BFF","C013" = "#3B528BFF","C014" = "#3B528BFF",
                                 "C02" = "#287C8EFF",
                                 "C021" = "#287C8EFF",
                                 "C03" = "#27AD81FF",
                                 "C031" = "#35B779FF","C032" = "#35B779FF","C033" = "#35B779FF",
                                 "C04" = "#8FD744FF",
                                 "C041" = "#8FD744FF","C042" = "#8FD744FF")) +
  labs(title = "Electricity Usage May 2022") + ylab("") + xlab("") +
    theme(panel.grid.major = element_blank(),
          panel.grid.minor = element_blank(),
          plot.title = element_text(hjust = 0.5),
          panel.border = element_blank(),
          panel.background = element_blank(),
          strip.background = element_blank(),
          axis.text= element_blank(),
          axis.ticks= element_blank())

And sample data

structure(list(Level = structure(c(2L, 3L, 3L, 3L, 3L, 2L, 3L, 
2L, 3L, 3L, 3L, 2L, 3L, 3L, 1L), levels = c("0", "1", "2"), class = "factor"), 
    Category = structure(c(2L, 2L, 2L, 2L, 2L, 3L, 3L, 4L, 4L, 
    4L, 4L, 5L, 5L, 5L, 1L), levels = c("C00", "C01", "C02", 
    "C03", "C04"), class = "factor"), Subcategory = structure(c(2L, 
    3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 
    1L), levels = c("C00", "C01", "C011", "C012", "C013", "C014", 
    "C02", "C021", "C03", "C031", "C032", "C033", "C04", "C041", 
    "C042"), class = "factor"), Colour = structure(c(2L, 3L, 
    3L, 3L, 3L, 4L, 5L, 6L, 7L, 7L, 7L, 8L, 9L, 9L, 1L), levels = c("0", 
    "1", "2", "3", "4", "5", "6", "7", "8"), class = "factor"), 
    Label = c("Cafe (R1 & R2)  ", "Non-checked ", "Spider Monkey  ", 
    "Signing-in Cabin", "Solar (cafe)", "Vet Room", "Non-checked", 
    "Butchery", "Non-checked", "Solar (lynx)", "Solar (butchery)", 
    "Tiger Block", "Farm", "Non-checked", ""), Value = c(5323L, 
    921L, 2611L, 34L, 1791L, 534L, 534L, 8479L, 6689L, 1371L, 
    419L, 3596L, 87L, 3247L, 0L), Percent = c(30L, 5L, 15L, 0L, 
    10L, 3L, 3L, 47L, 37L, 8L, 2L, 20L, 2L, 18L, 0L), Per_label = c("30%", 
    "5%", "15%", "0%", "10%", "3%", "3%", "47%", "37%", "8%", 
    "2%", "20%", "2%", "18%", "0%")), row.names = c(NA, -15L), class = "data.frame")

Thanks in advance

>Solution :

One option would be to use an ifelse to shift the x position of the labels for the outer ring. Additionally I use an ifelse + scale_color_identity to conditionally set the font color of the labels:

library(ggplot2)

ggplot(usage.may, aes(x = Level, y = Percent, fill = Subcategory, label = Label)) +
  geom_bar(stat = "identity", color='white', show.legend = FALSE) +
  geom_text(aes(label = paste0(Label, "\n", Value, " (", Per_label, ")"),
                x = as.numeric(Level) + ifelse(Level == 2, 1, 0),
                color = ifelse(Level == 2, "black", "white")),
            size = 2.5, 
            check_overlap = TRUE, 
            position = position_stack(vjust = 0.5)) +
  coord_polar('y')  +
  scale_fill_manual(values = c("C01" = "#404688FF", 
                               "C011" = "#3B528BFF","C012" = "#3B528BFF","C013" = "#3B528BFF","C014" = "#3B528BFF",
                               "C02" = "#287C8EFF",
                               "C021" = "#287C8EFF",
                               "C03" = "#27AD81FF",
                               "C031" = "#35B779FF","C032" = "#35B779FF","C033" = "#35B779FF",
                               "C04" = "#8FD744FF",
                               "C041" = "#8FD744FF","C042" = "#8FD744FF")) +
  scale_color_identity() +
  labs(title = "Electricity Usage May 2022") + ylab("") + xlab("") +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        plot.title = element_text(hjust = 0.5),
        panel.border = element_blank(),
        panel.background = element_blank(),
        strip.background = element_blank(),
        axis.text= element_blank(),
        axis.ticks= element_blank())

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading