我希望创建多个密度图,制作“动态热力图”。由于每个动画帧应该是可比较的,因此我希望每个图形上的密度->颜色映射对于所有图形都相同,即使数据的范围对于每个图形都发生了变化。这是我为每个单独的图形使用的代码:
假设我使用相同的代码,但是'this_df'在每一帧中都会改变。因此,在一个图形中,密度可能从0到4e-4不等。在另一个图形中,密度范围从0到4e-2不等。
默认情况下,ggplot将为每个密度计算一个不同的密度->颜色映射。但这意味着两个图形--动画的两个帧--实际上并不可比较。如果这是直方图或密度图,我只需调用coord_cartesian并更改x和y lim即可。但对于密度图,我不知道如何更改比例尺。
我能找到的最接近的是: Overlay two ggplot2 stat_density2d plots with alpha channels 但是我没有将两个密度图放在同一图表上的选项,因为我希望它们成为不同的帧。
非常感谢任何帮助!
编辑:
以下是一个可重现的示例:
ggplot(data= this_df, aes(x=X, y=Y) ) +
geom_point(aes(color= as.factor(condition)), alpha= .25) +
coord_cartesian(ylim= c(0, 768), xlim= c(0,1024)) + scale_y_reverse() +
stat_density2d(mapping= aes(alpha = ..level..), geom="polygon", bins=3, size=1)
假设我使用相同的代码,但是'this_df'在每一帧中都会改变。因此,在一个图形中,密度可能从0到4e-4不等。在另一个图形中,密度范围从0到4e-2不等。
默认情况下,ggplot将为每个密度计算一个不同的密度->颜色映射。但这意味着两个图形--动画的两个帧--实际上并不可比较。如果这是直方图或密度图,我只需调用coord_cartesian并更改x和y lim即可。但对于密度图,我不知道如何更改比例尺。
我能找到的最接近的是: Overlay two ggplot2 stat_density2d plots with alpha channels 但是我没有将两个密度图放在同一图表上的选项,因为我希望它们成为不同的帧。
非常感谢任何帮助!
编辑:
以下是一个可重现的示例:
set.seed(4)
g = list(NA,NA)
for (i in 1:2) {
sdev = runif(1)
X = rnorm(1000, mean = 512, sd= 300*sdev)
Y = rnorm(1000, mean = 384, sd= 200*sdev)
this_df = as.data.frame( cbind(X = X,Y = Y, condition = 1:2) )
g[[i]] = ggplot(data= this_df, aes(x=X, y=Y) ) +
geom_point(aes(color= as.factor(condition)), alpha= .25) +
coord_cartesian(ylim= c(0, 768), xlim= c(0,1024)) + scale_y_reverse() +
stat_density2d(mapping= aes(alpha = ..level.., color= as.factor(condition)), geom="contour", bins=4, size= 2)
}
print(g) # level has a different scale for each
alpha
映射到级别,而不是颜色。你可以通过添加scale_alpha_continuous(limits=...)
来控制 alpha 比例尺,其中limits
是一个向量,指定以..level..
为单位的限制范围,因此我猜是 (0,4e-2)。如果您提供数据集,可能会有人愿意给您更多帮助。 - jlhoward+ scale_alpha_continuous(limits= c(0, 2e-6))
,它会使alpha缩放连续,但不会修复轮廓。如何使两个图形中的轮廓缩放保持一致? - jwdinkstat_density2d(...)
中使用breaks=...
。 - jlhoward