我无法通过我正在使用的一些地图获取所需的scale_fill_gradient。我正在寻找的是具有完全相同的色标(如十六进制代码对应于完全相同的填充值)并具有 log10 转换的 2 个热图,而 2 个数据集具有不同的最大值。
这就是我的单个热图,我喜欢这个结果:
heatmap <- statebase +
geom_sf(data=heatbycounties, color="NA", aes(fill=fy16map)) +
scale_fill_gradient(trans="log10", low = "#F1EFEF", high = "#F25430", na.value = "#F1EFEF") +
geom_sf(data = c_states, color="white", fill="NA") + #adding white state lines back on top
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
rect = element_blank(),
plot.background = element_rect(fill="white"))`\
但是,如果我只是用单独的数据集(fy16map 和 fy22map)以这种方式生成两个地图,“高”颜色对应于不同的值,因此整个渐变也是如此。
我在scale_fill_gradient和scale_fill_gradientn中使用不同的参数组合进行了各种尝试,但大多数都会导致错误代码。我能够生成一个具有定义的色标(为“低”和“高”指定值)的颜色标度,但如果没有 log10,它完全难以辨认,因为该国的大部分地区都非常低 - 它就像一张白色地图,上面有一些橙色斑点。
是否可以同时包含 trans log10 和 指定梯度的最小值和最大值?当然,这有一个简单的解决方案,但我是 R 新手!谢谢!
解决方案1:
您可以尝试将填充渐变的限制设置为两个数据集中的最小值(分别为最大值),并使用
oob = squish
包中的 scales
。
请注意,您必须首先确定最小值和最大值,因为我不知道您正在使用什么数据。
library(scales)
+ scale_fill_gradient(trans="log10", low = "#F1EFEF", high = "#F25430", na.value = "#F1EFEF",
limits=c(min(log10(fy16map)), max(log10(fy16map)), oob=squish))
(也许)解决方案2:
您还可以使用
t(scale(t(mat)))
缩放矩阵。如果我没记错的话,这会将您的数据转换为均值 0 和标准差 1,因此具有相同的限制。