连续渐变颜色和固定比例热图 ggplot2
Continuous gradient color & fixed scale heatmap ggplot2
我正在从 Mathematica 切换到 R,但我发现在可视化方面有些困难。
我正在尝试按如下方式制作热图:
short
penetration scc pi0
1 0 0 0.002545268
2 5 0 -0.408621176
3 10 0 -0.929432006
4 15 0 -1.121309680
5 20 0 -1.587298317
6 25 0 -2.957853131
7 30 0 -5.123329738
8 0 50 1.199748327
9 5 50 0.788581883
10 10 50 0.267771053
11 15 50 0.075893379
12 20 50 -0.390095258
13 25 50 -1.760650073
14 30 50 -3.926126679
15 0 100 2.396951386
16 5 100 1.985784941
17 10 100 1.464974112
18 15 100 1.273096438
19 20 100 0.807107801
20 25 100 -0.563447014
21 30 100 -2.728923621
mycol <- c("navy", "blue", "cyan", "lightcyan", "yellow", "red", "red4")
ggplot(data = short, aes(x = penetration, y = scc)) +
geom_tile(aes(fill = pi0)) +
scale_fill_gradientn(colours = mycol)
我明白了:
但我需要这样的东西:
也就是说,我希望绘图表面的颜色是连续的(退化的),而不是每个方块的离散颜色。我在其他 SO 问题中看到有人插入数据,但我认为在 ggplot 调用中应该有一种更简单的方法(在 Mathematica 中是默认完成的)。
此外,我想锁定色标,使 0 始终为白色(因此在正值的暖色和负值的冷色之间分开)并且颜色分布在各个图上始终相同,与数据范围(因为我将对多个数据集使用相同的绘图结构)
您可以将 geom_raster
与 interpolate=TRUE
一起使用:
ggplot(short , aes(x = penetration, y = scc)) +
geom_raster(aes(fill = pi0), interpolate=TRUE) +
scale_fill_gradient2(low="navy", mid="white", high="red",
midpoint=0, limits=range(short$pi0)) +
theme_classic()
要在所有绘图中将相同的颜色映射到 pi0
的值,请将 scale_fill_gradient2
的 limits
参数设置为在每个绘图中相同。例如,如果你有三个数据框 short
、short2
和 short3
,你可以这样做:
# Get range of `pi0` across all data frames
pi0.rng = range(lapply(list(short, short2, short3), function(s) s$pi0))
然后在所有地块的 scale_fill_gradient2
中设置 limits=pi0.rng
。
我会调整你的 scale_fill_gradient2
:
scale_fill_gradient2('pi0', low = "blue", mid = "white", high = "red", midpoint = 0)
要使绘图颜色直接可比,请向每个绘图添加一致的 limits
:
scale_fill_gradient2('pi0', low = "blue", mid = "white", high = "red", midpoint = 0, limits=c('your lower limit','your upper limit'))
我正在从 Mathematica 切换到 R,但我发现在可视化方面有些困难。
我正在尝试按如下方式制作热图:
short
penetration scc pi0
1 0 0 0.002545268
2 5 0 -0.408621176
3 10 0 -0.929432006
4 15 0 -1.121309680
5 20 0 -1.587298317
6 25 0 -2.957853131
7 30 0 -5.123329738
8 0 50 1.199748327
9 5 50 0.788581883
10 10 50 0.267771053
11 15 50 0.075893379
12 20 50 -0.390095258
13 25 50 -1.760650073
14 30 50 -3.926126679
15 0 100 2.396951386
16 5 100 1.985784941
17 10 100 1.464974112
18 15 100 1.273096438
19 20 100 0.807107801
20 25 100 -0.563447014
21 30 100 -2.728923621
mycol <- c("navy", "blue", "cyan", "lightcyan", "yellow", "red", "red4")
ggplot(data = short, aes(x = penetration, y = scc)) +
geom_tile(aes(fill = pi0)) +
scale_fill_gradientn(colours = mycol)
我明白了:
但我需要这样的东西:
也就是说,我希望绘图表面的颜色是连续的(退化的),而不是每个方块的离散颜色。我在其他 SO 问题中看到有人插入数据,但我认为在 ggplot 调用中应该有一种更简单的方法(在 Mathematica 中是默认完成的)。
此外,我想锁定色标,使 0 始终为白色(因此在正值的暖色和负值的冷色之间分开)并且颜色分布在各个图上始终相同,与数据范围(因为我将对多个数据集使用相同的绘图结构)
您可以将 geom_raster
与 interpolate=TRUE
一起使用:
ggplot(short , aes(x = penetration, y = scc)) +
geom_raster(aes(fill = pi0), interpolate=TRUE) +
scale_fill_gradient2(low="navy", mid="white", high="red",
midpoint=0, limits=range(short$pi0)) +
theme_classic()
要在所有绘图中将相同的颜色映射到 pi0
的值,请将 scale_fill_gradient2
的 limits
参数设置为在每个绘图中相同。例如,如果你有三个数据框 short
、short2
和 short3
,你可以这样做:
# Get range of `pi0` across all data frames
pi0.rng = range(lapply(list(short, short2, short3), function(s) s$pi0))
然后在所有地块的 scale_fill_gradient2
中设置 limits=pi0.rng
。
我会调整你的 scale_fill_gradient2
:
scale_fill_gradient2('pi0', low = "blue", mid = "white", high = "red", midpoint = 0)
要使绘图颜色直接可比,请向每个绘图添加一致的 limits
:
scale_fill_gradient2('pi0', low = "blue", mid = "white", high = "red", midpoint = 0, limits=c('your lower limit','your upper limit'))