连续渐变色和固定比例热图ggplot2

jlp*_*jlp 4 r colors continuous 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)
Run Code Online (Sandbox Code Playgroud)

我得到了这个:

在此输入图像描述

但是我需要这样的东西: 在此输入图像描述

也就是说,我希望颜色在绘图表面上连续(降级)而不是每个正方形的离散.我在其他SO问题中看到有些人插入de数据,但我认为在ggplot调用中应该有一种更简单的方法(默认情况下在Mathematica中完成).

此外,我想锁定色标,使得0始终为白色(因此在暖色中分别为正值,在冷色之间为负值),并且色谱图的颜色分布始终相同,与数据范围无关(因为我将对几个数据集使用相同的绘图结构)

eip*_*i10 7

你可以用geom_rasterinterpolate=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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

要获得与pi0所有绘图中的值相同的颜色映射,请在每个绘图中将limits参数设置scale_fill_gradient2为相同.举例来说,如果你有一个名为3个数据帧short,short2以及short3,你可以这样做:

# Get range of `pi0` across all data frames
pi0.rng = range(lapply(list(short, short2, short3), function(s) s$pi0))
Run Code Online (Sandbox Code Playgroud)

然后limits=pi0.rngscale_fill_gradient2你的所有情节中插入.


Mar*_*Max 5

我会调整你的scale_fill_gradient2

scale_fill_gradient2('pi0', low = "blue", mid = "white", high = "red", midpoint = 0)
Run Code Online (Sandbox Code Playgroud)

为了使绘图颜色直接可比较,请添加limits与每个绘图一致的内容:

scale_fill_gradient2('pi0', low = "blue", mid = "white", high = "red", midpoint = 0, limits=c('your lower limit','your upper limit'))
Run Code Online (Sandbox Code Playgroud)