Mus
Mus

Reputation: 7530

Gradient fill columns using ggplot2 doesn't seem to work

I would like to create a gradient within each bar of this graph going from red (low) to green (high).

At present I am using specific colours within geom_col but want to have each individual bar scale from red to green depending on the value it depicts.

Here is a simplified version of my graph (there is also a geom_line on the graph (among several other things such as titles, axis adjustments, etc.), but it isn't relevant to this question so I have excluded it from the example):

enter image description here

I have removed the hard-coded colours from the columns and tried using things such as scale_fill_gradient (and numerous other similar functions) to apply a gradient to said columns, but nothing seems to work.

Here is what the output is when I use scale_fill_gradient(low = "red", high = "green"):

enter image description here

What I want is for each bar to have its own gradient and not for each bar to represent a step in said gradient.

How can I achieve this using ggplot2?

My code for the above (green) example:

ggplot(data = all_chats_hn,
       aes(x = as.Date(date))) +
geom_col(aes(y = total_chats),
         colour = "black",
         fill = "forestgreen")

Upvotes: 0

Views: 1401

Answers (1)

bouncyball
bouncyball

Reputation: 10761

I'm not sure if that is possible with geom_col. It is possible by using geom_line and a little data augmentation. We have to use the y value to create a sequence of y values (y_seq), so that the gradient coloring works. We also create y_seq_scaled in case you want each line to have an "independent" gradient.

library(tidyverse)
set.seed(123) # reproducibility

dat <- data_frame(x = 1:10, y = abs(rnorm(10))) %>%
  group_by(x) %>%
  mutate(y_seq = list(seq(0, y, length.out = 100))) %>% # create sequence
  unnest(y_seq) %>%
  mutate(y_seq_scaled = (y_seq - mean(y_seq)) / sd(y_seq)) # scale sequence

# gradient for all together
ggplot(dat, aes(x = factor(x), y = y_seq, colour = y_seq))+
  geom_line(size = 2)+
  scale_colour_gradient(low = 'red', high = 'green')

enter image description here

# independent gradients per x
ggplot(dat, aes(x = factor(x), y = y_seq, colour = y_seq_scaled))+
  geom_line(size = 2)+
  scale_colour_gradient(low = 'red', high = 'green')

enter image description here

Upvotes: 3

Related Questions