Search code examples
rggplot2geom-bar

How to make different patterns and colors in different category of data using ggplot in R?


I would like to make my data have different colors for species and different patterns for sex. However, I can only set to make it different colors according to the sex. Here is my data, data

This is how I run my script,

#making bar plot
library(readr)
library(ggplot2)


# loading and checking the data
data_summary <- read_csv("trial.csv")
print(data_summary)


# coloured barplot
ggplot(data_summary, aes(x = factor(species), y = mean, fill = sex)) + 
  geom_bar(stat = "identity", position = "dodge", show.legend = FALSE)  +
  geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), position = position_dodge(0.9), width = 0.2, show.legend = FALSE) +
  labs(x="", y="") + theme_bw() + 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
  theme(legend.position = c(0.1, 0.75)) + ylim(0, 80) +
  scale_fill_manual(values=c("#870A30","#D3D3D3"))

Solution

  • This can be done using fill = interaction(..,..):

    library(ggplot2)
    
    ggplot(data_summary, aes(x = factor(species), y = mean, fill = interaction(species,sex))) +
      geom_bar(stat = "identity", position = "dodge", show.legend = FALSE) +
      geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), position = position_dodge(0.9), width = 0.2, show.legend = FALSE) +
      labs(x="", y="") + 
      theme_bw() + 
      theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
      theme(legend.position = c(0.1, 0.75)) + ylim(0, 80) +
      scale_fill_manual(values= c("#870A30", '#009E73', '#CC79A7', "#D3D3D3"))
    

    enter image description here