2012-07-02 5 views
11

Al cambiar los límites superiores para scale_fill_gradient2, también se aplica la escala de colores para los valores < 0, ya que la distribución de color alrededor de 0 parece ser siempre simétrica. ¿Hay alguna manera de obtener una distribución asimétrica de los valores de color?distribución asimétrica del color en scale_gradient2?

Aquí un ejemplo mínima de una parcela usando geom_tile():

data <- read.csv("http://protzkeule.de/data.csv") 
p <- ggplot(data=data, aes(x=variable, y=meas)) + geom_tile(aes(fill=value)) 

parcela con límites simétricos:

p + scale_fill_gradient2(low="blue", mid="white", high="red", guide="colorbar", limits=c(-.1,.1)) 

pero cuando se cambia el límite superior, la asignación de color inferior cambia también (ver la barra de colores):

p + scale_fill_gradient2(low="blue", mid="white", high="red", guide="colorbar", limits=c(-.1,.3)) 
+0

que podría ser malentendido lo que eres buscando, pero intenta pasar 'midpoint = -0.1' a' scale_fill_gradient2'. ¿Es eso lo que quieres? – joran

+0

Quise decir '0.1', no' -0.1' allí obviamente, pero estoy pensando que eso no es lo que estabas buscando de todos modos, basado en la respuesta de Brian. – joran

Respuesta

14

Lo que quiere es scale_fill_gradientn . Los argumentos no son muy claras (Me tomó una hora o así para averiguar finalmente parte de él hacia fuera), sin embargo:

library("scales") 
p + scale_fill_gradientn(colours = c("blue","white","red"), 
         values = rescale(c(-.1,0,.3)), 
         guide = "colorbar", limits=c(-.1,.3)) 

que da:

enter image description here

+0

Gracias, creo que ahora lo tengo. Corrígeme si estoy equivocado pero con 'values' asigna los valores a los que se asigna un color del vector' colours' Lo único que no entiendo es qué sucede si el vector pasado a 'values' tiene más elementos que el vector pasado a' colours'. – Dahaniel

+0

'values' y' colours' deben tener la misma longitud. Se emparejan de forma efectiva, donde el valor corresponde al color en ese punto, y todo lo que se encuentre entre él y el siguiente punto se interpola. Realmente no sé qué pasaría si no tuvieran la misma longitud; al menos conceptualmente es un error, pero no sé si se produce un error real. En su ejemplo, -0.1 está mapeado en azul, 0.0 está mapeado en blanco, y 0.3 está mapeado en rojo; los valores entre -0.1 y 0.0 están interpolados entre azul y blanco; los valores entre 0.0 y 0.3 están interpolados entre blanco y rojo. –

+0

@BrianDiggs Estoy utilizando su solución de una manera similar, pero ¿hay alguna manera de mostrar discretamente la barra de colores para los primeros valores? P.ej. [la respuesta de la longitud del sépalo aquí] (https://stackoverflow.com/questions/17713456/easiest-way-to-discretize-continuous-scales-for-ggplot2-color-scales) – guy

Cuestiones relacionadas