Ad esempio, desidero mappare il colore su z
, con 0 mappe su "bianco".Altri approcci per gestire valori estremi/distribuzione quando si utilizza scale_fill_gradient?
> a <- data.frame(x=1:10, y=1, z=c(rnorm(8),-12,12))
> a
x y z
1 1 1 -0.4603911
2 2 1 -0.4868471
3 3 1 0.2180346
4 4 1 -0.8807652
5 5 1 1.7379462
6 6 1 -0.1334904
7 7 1 -0.3675578
8 8 1 0.9225425
9 9 1 -12.0000000
10 10 1 12.0000000
ggplot(a,aes(x=x,y=y,fill=z)) + geom_bar(stat="identity") +
scale_fill_gradient2(high="green", mid="white", low="red")
Come si può vedere il colore non è molto utile indicatore, invece di trasmettere un'idea generale di come sono distribuiti i valori, ora il colore dice solo che i valori sono estreme, lasciando i valori di maggioranza indistinguibili da occhi inesperti .
C'è un metodo Non-linear color distribution over the range of values in a geom_raster ma sembra un po 'complicato e posso solo capire vagamente come funziona.
Allora ho pensato che forse order
è un buon modo Rescale, quindi:
ggplot(a,aes(x=x,y=y,fill=ecdf(z)(z))) + geom_bar(stat="identity") +
scale_fill_gradient2(high="green", mid="white", low="red", midpoint=ecdf(a$z)(0))
ha funzionato in una certa misura (qui ho usato ecdf
invece di order
per trovare quale valore 0 viene ridimensionata. Tuttavia, lo svantaggio è che vorrei conservare le etichette della legenda come valori non graduati, invece di quelli riscalati, quindi qualcosa come labels=function(x) quantile(a$z, x)
, che non riesco a far funzionare, inoltre trovo stupido usare ripetutamente ecdf
e quantile
per eseguire il ridimensionamento in avanti e all'indietro.
Esiste un approccio migliore o più semplice in questi casi, ad es. robusto (non deve essere ottimale o molto preciso) abbastanza da riempire colori ragionevoli per tutti i tipi di distribuzioni di valori mappati.