Home > Back-end >  R: Coloring Individual Bars in Barplots
R: Coloring Individual Bars in Barplots

Time:08-24

I am working with the R programming language.

I simulated the following data:

set.seed(123)

myFun <- function(n = 5000) {
  a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
  paste0(a, sprintf("d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}

name = myFun(400)

variable = rnorm(400, 50,10)

part1 = data.frame(name,variable)

name = myFun(10)

variable = rnorm(10, 130,10)

part2 = data.frame(name,variable)

final = rbind(part1, part2)

Then, I made a barplot of this data:

library(ggplot2)

p<-ggplot(data=final, aes(x=name, y=variable))  
  geom_bar(stat="identity")   ggtitle(" Title of Barplot")

enter image description here

Is there a way I can take the "names" with the ten largest values of "variable" and place them as labels on top of the corresponding bars?

I saw this link over here that shows how to do this for all bars (https://www.geeksforgeeks.org/how-to-add-labels-over-each-bar-in-barplot-in-r/) - but is there a way to do this only for the 10 largest bars?

Thanks!

CodePudding user response:

Here you go, just create a new variable with the name for the top 10 and NA otherwise

# Setup
library(tidyverse)

# Create a label column 
final <-
  final %>% 
  arrange(desc(variable)) %>% 
  mutate(label = ifelse(row_number() <= 10, name, NA))

# Add geom_text() for label
p <- 
  ggplot(
    data = final, 
    aes(
      x = name, 
      y = variable,
      label = label))  
  geom_bar(stat="identity")   
  geom_text()  
  ggtitle(" Title of Barplot")

CodePudding user response:

Another option using geom_text_repel which has a lot of options for positioning your labels. Here is a reproducible example:

set.seed(123)

myFun <- function(n = 5000) {
  a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
  paste0(a, sprintf("d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}

name = myFun(400)
variable = rnorm(400, 50,10)
part1 = data.frame(name,variable)
name = myFun(10)
variable = rnorm(10, 130,10)
part2 = data.frame(name,variable)
final = rbind(part1, part2)

library(dplyr)
# Create subset dataframe
final_10 <- final %>%
  arrange(desc(variable)) %>%
  slice(1:10) 

library(ggplot2)
library(ggrepel)
ggplot(data=final, aes(x=name, y=variable))  
  geom_bar(stat="identity")   
  geom_text_repel(data = final_10, aes(x = name,  y = variable, label = variable), size = 2, segment.color = "grey50")  
  ggtitle(" Title of Barplot")

Created on 2022-08-24 with reprex v2.0.2

  • Related