r - 在 ggplot2 图中使用多个汇总统计
问题描述
我正在分析一些房屋销售交易数据,我想生成一个地理图,其颜色表示每个(十六进制)区域的平均价格。某些区域的数据有限,我想通过调整不透明度以反映每个区域中的点数来表明这一点。
这需要我为每个十六进制计算两个统计数据:平均价格和点数。ggplot2 包使计算和在图表中绘制一个统计数据变得非常容易,但我不知道如何计算两个。
为了说明这一点:
library(ggplot2)
N = 1000;
df_demo = data.frame(A=runif(N), B=runif(N), C=runif(N)) # dummy data
# I want to produce a hex-binned version of this:
ggplot(data=df_demo) + geom_point(mapping=aes(x=A, y=B, color=C))
# It's easy to get each hex's average price *or* its point density:
ggplot(data=df_demo) + stat_summary_hex(mapping=aes(x=A,y=B,z=C), fun=mean) # color = average of C across hex, but opacity can't be adjusted
ggplot(data=df_demo) + geom_hex(mapping=aes(x=A, y=B, color=C, alpha=..ndensity..)) # opacity = normalised # of points, but color is *total* value which is wrong
我想结合最后两行的效果,但这似乎不是一个选择:..ndensity.. 统计在 stat_summary_hex() 的上下文中不起作用,并且 geom_hex() 不会计算平均值。
有没有办法做到这一点,我忽略了?或者,是否有一种明显的方法可以在构建绘图之前预先计算所需的统计数据?例如,通过在我的 dplyr 管道期间确定每个数据的预期十六进制。
可能没有简单解决方案的一个提示是这个非 CRAN 包 - 如果我理解正确的话 - 或多或少地解决了这个问题。但是,如果可能的话,我宁愿不依赖 CRAN 之外的代码,所以我一直希望我错过了一些明显的东西。
解决方案
不同的几何呢?例如geom_tile
- 您可以为每个维度 (A/B) 创建切割,然后预先计算每个图块的平均值和数量,然后像这样绘制:
library(tidyverse)
N = 1000;
df_demo = data.frame(A=runif(N), B=runif(N), C=runif(N)) %>%
mutate(cuts_a= cut(A, breaks = 20), cuts_b= cut(B, breaks = 20)) %>%
group_by(cuts_a, cuts_b) %>% mutate(mean_c = mean(C), n_obs = n())
# I want to produce a hex-binned version of this:
ggplot(data=df_demo) +
geom_tile(mapping=aes(x=cuts_a, y=cuts_b, fill=mean_c, alpha = n_obs))
由reprex 包于 2020-02-13 创建(v0.3.0)
推荐阅读
- c# - 后续 http 请求后 TempData 仍然可用吗?
- angular - 如何在 Angular 7 中处理嵌套的 HTTP 请求?
- javascript - 在 map 函数中切换条件语句
- java - File.lastmodified() 生成错误的日期和月份
- c# - 读取一个文本文件,直到一行包含一些字符串文件,然后再次继续读取下一行,直到遇到另一个字符串
- powershell - Start-AzureRmDataFactoryV2Trigger 触发器 XXX 具有意外的资源提供程序:、意外的资源类型,或两者兼有
- android - 如何在xml中隐藏另一个组件后面的布局?
- node.js - 将基本身份验证与 loopback.js 和 ldap 一起使用
- r - 折线图 ggplot - 两条线,来自同一站点/秒的数据点
- python - 使用 python-requests 请求时出现 SSL 错误