4

Assuming I have a data frame as such:

Date <- seq(as.Date("1990-03-01"), by = 'quarters', length.out=100)
Date<- as.yearqtr(Date, format="%Y-%m-%d")
A <- runif(100, 500, 2000)
B <- runif(100, 200, 1000)
C <- runif(100, 1000, 5000)
df <- data.frame(Date, A, B, C)

I would like to create a heatmap using ggplot2 but apply a different conditional discrete colour scale to each variable A and B based on the percentile of each of its value. i.e. For values below the 25th percentile > red, for values between 25th to 50th percentile > orange, for values between 50th to 75th percentile > yellow, for values between 75th to 100th percentile > green.

I could create a heatmap on ggplot geom_tiles by using the melt function and making x=Date and y=variable, with fill=value. However, they will take the value of all the variables as one vector and give the 25th percentile based on all the combined values. Is there a way to separately condition the scale_fill_manual based on the percentiles of individual variables A, B, C. In that case I would probably need to apply multiple scale_fill_manual functions.

Alternatively is there any way which I can stack the ggplot on top of each other since I have been able to create individual heatmaps for each variable. I have been struggling with this for a while and any help is appreciated, thank you very much.

1 Answer 1

1

This should help with the color coding:

Date <- seq(as.Date("1990-03-01"), by = 'quarters', length.out=100)
Date<- as.yearqtr(Date, format="%Y-%m-%d")
A <- runif(100, 500, 2000)
B <- runif(100, 200, 1000)
C <- runif(100, 1000, 5000)
df <- data.frame(Date, A, B, C)

df

quantA <- quantile(df$A, c(0.25, 0.75))
quantB <- quantile(df$B, c(0.25, 0.75))
quantC <- quantile(df$C, c(0.25, 0.75))

df$quantA  <- with(df, factor(ifelse(A < quantA[1], 0, 
                                      ifelse(A < quantA[2], 1, 2))))
df$quantB  <- with(df, factor(ifelse(B < quantB[1], 0, 
                                     ifelse(B < quantB[2], 1, 2))))
df$quantC  <- with(df, factor(ifelse(C < quantC[1], 0, 
                                     ifelse(C < quantC[2], 1, 2))))

Please see this post for more details on color coding based on percentiles:

Color code points based on percentile in ggplot

and this one for color coding based on multiple variables:

R ggplot barplot; Fill based on two separate variables

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you so much! It was really useful, I forgot I could actually group them and work with the groups. Thanks!
@Binggg Awesome, glad to hear it!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.