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:
Mais j'ai besoin de quelque chose comme ça:
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)
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()
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.
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'))