web-dev-qa-db-ja.com

連続グラデーションカラーと固定スケールヒートマップ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)

そして私はこれを得る:

enter image description here

しかし、私はこのようなものが必要です: enter image description here

つまり、色が正方形ごとに離散するのではなく、プロットの表面全体で連続(劣化)していることを望みます。他のSOの質問でデータを補間する人もいますが、ggplot呼び出し内でそれを行う簡単な方法があるはずです(Mathematicaではデフォルトで行われます)。

さらに、0が常に白(したがって、正の値の暖かい色と負の値の冷たい色を分離する)であり、データの範囲に関係なく、プロット全体で色の分布が常に同じになるように、カラースケールをロックしたいと思います(複数のデータセットに同じプロット構造を使用するため)

4
jlp

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()

enter image description here

すべてのプロットでpi0の値に同じカラーマッピングを取得するには、scale_fill_gradient2limits引数を各プロットで同じに設定します。たとえば、shortshort2、およびshort3という3つのデータフレームがある場合、次のように実行できます。

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

次に、すべてのプロットのlimits=pi0.rngscale_fill_gradient2を設定します。

6
eipi10

私はあなたの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'))
1
Marine-Max