doraemon
doraemon

Reputation: 835

How to plot a heatmap with 3 continuous variables in r ggplot2?

Sample dataset is as below: count is discrete variable, temperature and relative_humidity_percent are continuous variables.

The code to generate sample dataset:

templ = data.frame(count = c(200,225,610,233,250,210,290,255,279,250),
                  temperature = c(12.2,11.6,12,8.5,4,8.2,9.2,10.6,10.8,10.9),
                  relative_humidity_percent = c(74,78,72,65,77,84,83,74,73,75))
count temperature relative_humidity_percent
200 12.2 74
225 11.6 78
610 12 72
233 8.5 65
250 4 77
210 8.2 84
290 9.2 83
255 10.6 74
279 10.8 73
250 10.9 75

I tried to plot a heatmap with ggplot2::stat_contour,


plot2 <- ggplot(templ, aes(x = temperature, y = relative_humidity_percent, z = count)) +
  stat_contour(geom = 'contour') +
  geom_tile(aes(fill = n)) +
  stat_contour(bins = 15) +
  guides(fill = guide_colorbar(title = 'count'))

plot2

The result is: enter image description here

Also, I tried to use ggplot::stat_density_2d,

> ggplot(templ, aes(temperature, relative_humidity_percent, z = count)) +
+   stat_density_2d(aes(fill = count)) 
Warning messages:
1: In stat_density_2d(aes(fill = count)) :
  Ignoring unknown aesthetics: fill
2: The following aesthetics were dropped during statistical transformation: fill, z
ℹ This can happen when ggplot fails to infer the correct grouping structure in the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical variable into a factor? 
> geom_density_2d() + 
+   geom_contour() +
+   metR::geom_contour_fill(na.fill=TRUE) +
+   theme_classic()
Error in `+.gg`:
! Cannot add <ggproto> objects together
ℹ Did you forget to add this object to a <ggplot> object?
Run `rlang::last_error()` to see where the error occurred.

The result: which was not filled with colour. enter image description here

What I want is:

enter image description here

I want to replace level with count in the graph. However, since count variable is not factor. Therefore I cannot plot heatmap by using ggplot::geom_contour...

Upvotes: 1

Views: 887

Answers (2)

tjebo
tjebo

Reputation: 23767

I understand from your comment that you want to "fill the entire graph", thus having a less truthful representation of your three dimensional data, which would be more accurately represented as a scatter plot and local coding of your third variable. I understand that you intend to interpolate the observation density between the measured locations.

You can of course use geom_density_2d for this. Just do the same trick as in my other answer and uncount your data first.

NB this is of course creating bins of densities. Otherwise this type of visualisation with iso density lines is not working.

ggplot(tidyr::uncount(templ, count)) +
  geom_density_2d_filled(aes(temperature, relative_humidity_percent))

Upvotes: 1

tjebo
tjebo

Reputation: 23767

Just use geom_point and color according to your count. You can of course make your points square.

Or, if your count is not yet actually an aggregate measure and you want to show the density of neighbouring observations, you could use ggpointdensity::geom_pointdensity for this. (in your example, I have to uncount first).

library(ggplot2)
library(dplyr)
library(tidyr)

templ = data.frame(count = c(200,225,610,233,250,210,290,255,279,250),
                   temperature = c(12.2,11.6,12,8.5,4,8.2,9.2,10.6,10.8,10.9),
                   relative_humidity_percent = c(74,78,72,65,77,84,83,74,73,75))

ggplot(templ) +
  geom_point(aes(temperature, relative_humidity_percent, color = count), shape = 15, size = 5)


## first uncount 
templ %>%
  uncount(count) %>%
ggplot() +
  ggpointdensity::geom_pointdensity(aes(temperature, relative_humidity_percent))

Upvotes: 1

Related Questions