简体   繁体   中英

Changing colours of grouped bar chart in ggplot2

For a sample dataframe:

df <- structure(list(year = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 
3, 3, 4, 4, 4, 4, 4), imd.quintile = c(1, 2, 3, 4, 5, 1, 2, 3, 
4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5), average_antibiotic = c(1.17153515458827, 
1.11592565388857, 1.09288449967773, 1.07442652168281, 1.06102887394413, 
1.0560582933182, 1.00678980505929, 0.992997489072538, 0.978343676071694, 
0.967900478870214, 1.02854157116164, 0.98339099101476, 0.981198852494798, 
0.971392872980818, 0.962289579742817, 1.00601488964457, 0.951187417739673, 
0.950706064156994, 0.939174499710836, 0.934948233015044)), .Names = c("year", 
"imd.quintile", "average_antibiotic"), row.names = c(NA, -20L
), vars = "year", drop = TRUE, class = c("grouped_df", "tbl_df", 
"tbl", "data.frame"))

I am producing a graph detailing the differences in antibiotic prescribing BY imd.decile BY year:

ggplot(plot_data.quintiles) + 
  geom_col(aes(x = year, y = average_antibiotic, group=imd.quintile, fill=imd.quintile), position = "dodge") +
             ylab("Antibiotic STAR-PU") +
  xlab("Year") +
  theme_bw() +
  ylim(0, 1.5)+
  scale_colour_brewer("clarity")

The blue colour choice isn't to my taste, as the differences between the imd.quintiles isn't very distinctive. I have read various posts, here , here and here , but none of which seem to answer my question.

I attempted to use the 'clarity' colours to get a wider range of colour choices. How can I correctly change the fill colour in my ggplot2 graph? what options do I have?

Is this what you want? Use factor(imd.quintile) to create discrete (categorical) data otherwise ggplot will treat numeric/integer imd.quintile as continuous.

df <- data.frame(
                 year = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4,
                          4, 4),
         imd.quintile = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3,
                          4, 5),
   average_antibiotic = c(1.17153515458827, 1.11592565388857, 1.09288449967773,
                          1.07442652168281, 1.06102887394413, 1.0560582933182,
                          1.00678980505929, 0.992997489072538, 0.978343676071694,
                          0.967900478870214, 1.02854157116164, 0.98339099101476,
                          0.981198852494798, 0.971392872980818,
                          0.962289579742817, 1.00601488964457, 0.951187417739673,
                          0.950706064156994, 0.939174499710836, 0.934948233015044)
)

library(ggplot2)
p1 <- ggplot(df) +
  geom_col(aes(
    x = year, y = average_antibiotic,
    group = imd.quintile, fill = factor(imd.quintile)), position = "dodge") +
  ylab("Antibiotic STAR-PU") +
  xlab("Year") +
  theme_bw() +
  ylim(0, 1.5)

p1 +
  scale_fill_brewer(palette = "Set2") # use scale_fill_xxx to chose the desired color palette

If you prefer continuous (sequential) colormaps, viridis or scico are good options:

p1 +
  scale_fill_viridis_c(option = 'E', direction = -1)

# install.packages('scico')
library(scico)
p1 +
  scale_fill_scico()

Created on 2018-11-29 by the reprex package (v0.2.1.9000)

scale_####_brewer uses palettes from RColorBrewer , there's no palette called "Clarity".

Use RColorBrewer::display.brewer.all() to see what palette's are available, then call them by name with the palette arg. Also you need to change the imd.quintile variable to be either character or factor. You're mapping your aesthetics by fill also, not colour, so you need to use scale_fill_brewer .

ggplot(df) + 
  geom_col(aes(x = year, y = average_antibiotic, group=imd.quintile, fill=imd.quintile), position = "dodge") +
  ylab("Antibiotic STAR-PU") +
  xlab("Year") +
  theme_bw() +
  ylim(0, 1.5) + 
  scale_fill_brewer(palette = "Spectral")

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM