Cómo limitar d3.svg.¿etiquetas de eje a entero?


Existe alguna posibilidad de limitar el número de d3.svg.¿etiquetas de enteros de eje mostradas en el gráfico? Tomemos por ejemplo este gráfico. Solo hay 5 tamaños aquí: [0, 1, 2, 3, 4]. Sin embargo, las marcas también se muestran para .5, 1.5, 2.5 y 3.5.

introduzca la descripción de la imagen aquí

Author: paxRoman, 2012-09-28

3 answers

Debería poder usar d3.format en lugar de escribir su propia función de formato para esto.

d3.svg.axis()
    .tickFormat(d3.format("d"));

También puede usar tickFormat en su escala que el eje usará automáticamente por defecto.

 55
Author: Bill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-28 16:20:58

Me he dado cuenta de que es suficiente ocultar estos valores, en lugar de excluir completamente. Esto se puede hacer usando el tickFormat (https://github.com/mbostock/d3/wiki/Formatting#wiki-d3_format) como tal:

d3.svg.axis()
    .tickFormat(function(e){
        if(Math.floor(e) != e)
        {
            return;
        }

        return e;
    });
 16
Author: Gajus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-28 16:12:37

El uso de d3.format("d") como tickFormat podría no funcionar en todos los escenarios ( ver este error). En los dispositivos Windows Phone (y probablemente otros) cálculos imprecisos pueden llevar a situaciones en las que las marcas no se detectan correctamente como números enteros, es decir, una marca de "3" puede almacenarse internamente como 2.999999999997 que para d3.format("d") no es un número entero.

Como resultado, el eje no se muestra en absoluto. Este comportamiento se hace especialmente evidente en rangos de garrapatas de hasta 10.

Uno la posible solución es tolerar el error de la máquina especificando un valor de epsilon. Los valores no tienen que ser enteros exactos de esta manera, pero pueden diferir del siguiente entero hasta el rango de epsilon (que debe ser mucho menor que su error de datos):

var epsilon = Math.pow(10,-7);

var axis = d3.svg.axis().tickFormat(function(d) {
    if (((d - Math.floor(d)) > epsilon) && ((Math.ceil(d) -d) > epsilon))
        return;
    return d;
}

Otra solución, que también se menciona en otros hilos, es especificar un conteo de garrapatas fijo y luego redondear las garrapatas (que ahora deberían ser "casi" enteros) al entero más cercano. Usted necesita saber el valor máximo de sus datos para esto para trabajar:

var axis = d3.svg.axis().ticks(dataMax).tickFormat(d3.format(".0f"))
 6
Author: Marcus Krahl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-16 07:46:30