web-dev-qa-db-fra.com

Dégradé continu et heatmap à échelle fixe ggplot2

Je passe de Mathematica à R mais je rencontre des difficultés avec les visualisations.

J'essaie de faire une carte thermique comme suit:

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)

Et je reçois ceci:

enter image description here

Mais j'ai besoin de quelque chose comme ça: enter image description here

C'est-à-dire que j'aimerais que la couleur soit continue (dégradée) sur la surface de la parcelle plutôt que discrète pour chaque carré. J'ai vu dans d'autres SO questions que certaines personnes interpolent des données, mais je pense qu'il devrait exister un moyen plus simple de le faire dans l'appel à ggplot (Mathematica le fait par défaut).

De plus, je voudrais verrouiller l’échelle de couleur de sorte que le 0 soit toujours blanc (séparant par conséquent les couleurs chaudes pour les valeurs positives et le froid pour les négatives) et que la répartition des couleurs est toujours la même sur les tracés indépendamment de la plage des données ( puisque je vais utiliser la même structure de tracé pour plusieurs jeux de données)

4
jlp

Vous pouvez utiliser geom_raster avec 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()

 enter image description here

Pour obtenir la même correspondance de couleurs avec les valeurs pi0 dans tous vos tracés, définissez l'argument limits de scale_fill_gradient2 pour qu'il soit identique dans chaque tracé. Par exemple, si vous avez trois trames de données appelées short, short2 et short3, vous pouvez procéder comme suit:

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

Ensuite, définissez limits=pi0.rng dans scale_fill_gradient2 dans toutes vos parcelles.

6
eipi10

Je voudrais ajuster votre scale_fill_gradient2:

scale_fill_gradient2('pi0', low = "blue", mid = "white", high = "red", midpoint = 0)

pour rendre les couleurs de la parcelle directement comparables, ajoutez une constante limits à chaque parcelle:

scale_fill_gradient2('pi0', low = "blue", mid = "white", high = "red", midpoint = 0, limits=c('your lower limit','your upper limit'))
1
Marine-Max