Na przykład chciałbym odwzorować kolor na z
, z 0 mapami na "biały".Inne podejścia do obsługi ekstremalnych wartości/dystrybucji przy użyciu 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")
Jak widać kolor nie jest bardzo przydatny wskaźnik, zamiast przenoszenia ogólne pojęcie o tym, w jaki sposób wartości są rozłożone, tylko teraz kolor opowiada jakie wartości są ekstremalne, pozostawiając wartości większościowe nierozróżnialne przez niewykwalifikowany oczu .
Istnieje metoda Non-linear color distribution over the range of values in a geom_raster, ale wydaje się nieco skomplikowana i mogę tylko niejasno zrozumieć, jak to działa.
I wtedy pomyślałem, że może order
jest dobrym Przeskaluje sposób, stąd:
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))
To działało do pewnego stopnia (tutaj użyłem ecdf
zamiast order
znaleźć to wartość 0 jest przeskalowany. Jednak wadą jest to, że chciałbym zachować etykiety legendy jako nieskalowane wartości, zamiast przeskalowanych.Tak coś takiego jak labels=function(x) quantile(a$z, x)
, którego nie mogę sprawić, aby działało.Również, uważam za głupie, aby wielokrotnie używać ecdf
i quantile
, aby przeskalować do przodu i do tyłu.
Czy istnieje lepsze lub prostsze podejście w takich przypadkach, np. solidne (nie musi być optymalne lub bardzo dokładne) wystarczy, aby wypełnić rozsądne kolory dla wszystkich rodzajów mapowanych wartości.