macs2021
macs2021

Reputation: 85

Gradient with specific color on ggplot2

I am trying to make a barplot where the bars would have the color "dodgerblue4" as a gradient. I tried to use scale_color_gradient but it didn't work. I would like the highest value to have "dodgerblue4" and have that color fading, is it possible? Thank you! My code for now is:

Fields<-c("Oceanography","Meteorology \n atmospheric \n Science",
          "Physical sciences \n other topics","Environmental \n sciences \n ecology",
          "Geography","Marine \n freshwater \n biology","Mathematics","Geology",
          "Zoology", "Geochemestry \n and Geophysics")
n_art<-c(3178,3166,2919,1975,1963,1900,1027,1015,892,840)
n_field<-c(1,2,3,4,5,6,7,8,9,10)
df_wos<- data.frame(n_art,Fields,n_field)
df_wos$Fields<-factor(df_wos$Fields,
                      levels = df_wos$Fields[order(df_wos$n_art,decreasing = TRUE)])

ggplot(df_wos) +
   aes(x = Fields, weight = n_art) +
   geom_bar(fill = "dodgerblue4")+
   scale_fill_hue() +
   labs(x=NULL, y = "Number of papers") +
   theme_bw()+
   theme(panel.border = element_blank(), panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"))

Upvotes: 0

Views: 637

Answers (1)

teunbrand
teunbrand

Reputation: 37933

There are multiple ways that you could interpret 'gradient' in this case.

Since you're talking about a 'fade', you could map the y-value of a bar to the alpha aesthetic.

library(ggplot2)

Fields<-c("Oceanography","Meteorology \n atmospheric \n Science",
          "Physical sciences \n other topics","Environmental \n sciences \n ecology",
          "Geography","Marine \n freshwater \n biology","Mathematics","Geology",
          "Zoology", "Geochemestry \n and Geophysics")
n_art<-c(3178,3166,2919,1975,1963,1900,1027,1015,892,840)
n_field<-c(1,2,3,4,5,6,7,8,9,10)
df_wos<- data.frame(n_art,Fields,n_field)
df_wos$Fields<-factor(df_wos$Fields,
                      levels = df_wos$Fields[order(df_wos$n_art,decreasing = TRUE)])

ggplot(df_wos) +
  aes(x = Fields, y = n_art, alpha = n_art) +
  geom_col(fill = "dodgerblue4")+
  scale_fill_hue() +
  labs(x=NULL, y = "Number of papers") +
  theme_bw()+
  theme(panel.border = element_blank(), 
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black"))

If you want to map to a colour scale gradient, you just set the fill to the y-value and specify the correct colour scale.

ggplot(df_wos) +
  aes(x = Fields, y = n_art, fill = n_art) +
  geom_col()+
  scale_fill_gradient(low = "transparent", high = "dodgerblue4") +
  labs(x=NULL, y = "Number of papers") +
  theme_bw()+
  theme(panel.border = element_blank(), 
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black"))

Lastly, if you want a top-to-bottom gradient within the bars, you can use the ggpattern package.

library(ggpattern)
#> 
#> Attaching package: 'ggpattern'
#> The following objects are masked from 'package:ggplot2':
#> 
#>     flip_data, flipped_names, gg_dep, has_flipped_aes, remove_missing,
#>     should_stop, waiver

ggplot(df_wos) +
  aes(x = Fields, y = n_art) +
  geom_col_pattern(
    colour = NA,
    fill = "dodgerblue4",
    pattern = "gradient",
    pattern_fill = "transparent"
  )+
  scale_fill_hue() +
  labs(x=NULL, y = "Number of papers") +
  theme_bw()+
  theme(panel.border = element_blank(), 
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black"))

Created on 2021-03-01 by the reprex package (v1.0.0)

Upvotes: 1

Related Questions