2012-05-14 13 views
15

¿Cuál es el significado de esta afirmación?¿Cómo funciona d3.scale.quantile?

quantize = d3.scale.quantile().domain([0, 15]).range(d3.range(9)); 

vi que el dominio es:

0 - 0
1 - 15

rango es de 0 a 8 y quantize.quantiles

0 - 1.6 
1 - 3.3 
2 - 4.9 
3 - 6.6 
4 - 8.3 
5 - 9.9 
6 -11.6 
7 -13.3 

¿Cómo se calculan los valores de quantize.quantiles? Traté de llamar al quantize(2) pero el resultado fue 1. ¿Cómo funciona quantile?

+0

¿Quizás conoces el significado de quantile y cómo está funcionando? – user1365697

+3

Si desea comprender mejor cómo funcionan estas básculas, puede jugar con esta [visualización] interactiva (http://bl.ocks.org/aviddiviner/84d905e60c6788f77ee21d35f873b236) que hice. – Dave

Respuesta

4

Yo recomendaría leer el quantile scale documentation, especialmente en quantize.quantiles()

Pero básicamente, d3 ve que hay 9 valores en el rango de salida para esta escala, por lo que crea 9 cuantiles en base a la Conjunto de datos de 2 valores: [0, 15].
Esto lleva a los valores de quantize.quantiles() que muestra en su pregunta: [1.6, 3.3, .., 13.3], estos representan los límites de los cuantiles: cualquier cosa menor a 1.6 se asignará al primer elemento de el rango de salida (en este caso cero). Cualquier cosa menor que 3.3 y mayor que 1.6 será mapeada al segundo elemento del rango de salida (uno). Por lo tanto, cuantize (2) = one, como se esperaba.

21

La motivación de la escala de cuantiles es obtener clases que sean representativas de la distribución real de los valores en el conjunto de datos. Por lo tanto, es necesario proporcionarlo durante la construcción con la lista completa de valores. La escala luego divide el dominio de entrada (definido por estos valores) en intervalos (cuantiles), de modo que aproximadamente el mismo número de valores cae en cada uno de los intervalos.

De la documentación:

para calcular los cuantiles, el dominio de entrada está ordenada, y se trata como una población de valores discretos.

Por lo tanto, cuando se especifica el dominio que la mano en la escala de toda la lista de valores:

var scale = d3.scale.quantile() 
    .domain([1, 1, 2, 3, 2, 3, 16]) 
    .range(['blue', 'white', 'red']); 

Si corremos:

scale.quantiles() 

Se dará salida [2, 3 ] lo que significa que nuestra población de valores se dividió en estos tres subconjuntos:

[1, 1] [2, 2] [3, 3, 16] 

Tenga en cuenta que esta escala debe evitarse cuando hay valores atípicos en los datos que desea mostrar. En el ejemplo anterior 16 es un valor atípico que cae en el cuantil superior. Se le asigna la misma clase que 3, que probablemente no sea el comportamiento deseado:

scale(3) // will output "red" 
scale(16) // will output "red"