英文:
How to plot a heatmap with 3 continuous variables in r ggplot2?
问题
样本数据如下:
count
是离散变量,temperature
和 relative_humidity_percent
是连续变量。
生成样本数据的代码如下:
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 |
我尝试使用 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
此外,我尝试使用 ggplot::stat_density_2d,
> ggplot(templ, aes(temperature, relative_humidity_percent, z = count)) +
+ stat_density_2d(aes(fill = count))
警告信息:
1: In stat_density_2d(aes(fill = count)) :
忽略未知的美观:fill
2: 经统计变换期间已丢弃以下美观:fill, z
ℹ 当 ggplot 无法推断数据中的正确分组结构时,就会发生这种情况。
ℹ 是否忘记指定 `group` 美观或将数值变量转换为因子?
> geom_density_2d() +
+ geom_contour() +
+ metR::geom_contour_fill(na.fill=TRUE) +
+ theme_classic()
错误:`+.gg`:无法将 <ggproto> 对象相加
ℹ 是否忘记将此对象添加到 <ggplot> 对象中?
运行 `rlang::last_error()` 以查看错误发生的位置。
我想要的是:
我希望在图中将 level
替换为 count
。然而,由于 count
变量不是因子,因此无法使用 ggplot::geom_contour 绘制热力图...
英文:
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
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.
What I want is:
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...
答案1
得分: 1
只使用geom_point并根据计数进行颜色设置。当然,您也可以将点形状设置为正方形。
或者,如果您的计数尚未实际上是一个聚合度量,而您想要显示相邻观测值的密度,您可以使用ggpointdensity::geom_pointdensity
来实现这一点(在您的示例中,我需要先取消计数)。
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)
## 首先取消计数
templ %>%
uncount(count) %>%
ggplot() +
ggpointdensity::geom_pointdensity(aes(temperature, relative_humidity_percent))
英文:
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))
<!-- -->
答案2
得分: 1
我了解您的评论,您希望“填充整个图形”,从而对三维数据的准确表示进行了一些牺牲,这可以更准确地表示为散点图,并本地编码您的第三个变量。我明白您的意图是在测量位置之间插值观察密度。
您当然可以使用geom_density_2d来实现这一点。只需像我其他回答中所示那样使用相同的技巧,首先取消计数数据。
注意:这当然是创建密度箱的过程。否则,具有等密度线的此类型可视化将无法正常工作。
ggplot(tidyr::uncount(templ, count)) +
geom_density_2d_filled(aes(temperature, relative_humidity_percent))
英文:
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))
<!-- -->
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论