valores mostrar horizontal graficas ejemplos data chart bar javascript d3.js bar-chart dc.js crossfilter

mostrar - graficas html javascript



Mostrar valores en la parte superior de las barras en un barChart (4)

Aquí hay un poco de una solución hacky usando el método de renderlet . jsFiddle : http://jsfiddle.net/tpsc5f9f/4/

JS

var barChart = dc.barChart("#Chart") .width(480).height(300) .dimension(XDimension) .group(YDimension) .transitionDuration(500) .xUnits(dc.units.ordinal) .x(d3.scale.ordinal().domain(XDimension)) dc.renderAll(); barChart.renderlet(function(chart){ moveGroupNames(); }); function moveGroupNames() { var $chart = $(''#Chart''), bar = $chart.find(''.bar''); bar.each(function (i, item) { var bar_top = this.height.baseVal.value; var bar_left = this.width.baseVal.value; var bar_offset_x = 30; var bar_offset_y = 33; var bar_val = $(this).find(''title'').html().split('':'')[1]; $chart.append(''<div class="val" style="bottom:''+(bar_top+bar_offset_y)+''px;left:''+((bar_left*i)+(bar_offset_x))+''px;width:''+bar_left+''px">''+bar_val+''</div>''); }); }

CSS agregado

body { margin-top:20px; } #Chart { position:relative; } #Chart .val { position:absolute; left:0; bottom:0; text-align: center; }

Tengo un gráfico de barras con escala ordinal para el eje x. Quiero mostrar los valores y en la parte superior de cada barra o en la parte inferior de cada barra. También sería aceptable mostrar los valores de y cuando uno pasa sobre la barra. ¿Hay una función o una forma en un dc.js para hacer eso? Aquí está el jsfiddle y mi código está debajo de la imagen>

Editar: Aquí está mi código: HTML

<body> <div id=''Chart''> </div> </body>

JS

var data = [{ Category: "A", ID: "1" }, { Category: "A", ID: "1" }, { Category: "A", ID: "1" }, { Category: "A", ID: "2" }, { Category: "A", ID: "2" }, { Category: "B", ID: "1" }, { Category: "B", ID: "1" }, { Category: "B", ID: "1" }, { Category: "B", ID: "2" }, { Category: "B", ID: "3" }, { Category: "B", ID: "3" }, { Category: "B", ID: "3" }, { Category: "B", ID: "4" }, { Category: "C", ID: "1" }, { Category: "C", ID: "2" }, { Category: "C", ID: "3" }, { Category: "C", ID: "4" }, { Category: "C", ID: "4" },{ Category: "C", ID: "5" }]; var ndx = crossfilter(data); var XDimension = ndx.dimension(function (d) { return d.Category; }); var YDimension = XDimension.group().reduceCount(function (d) { return d.value; }); dc.barChart("#Chart") .width(480).height(300) .dimension(XDimension) .group(YDimension) .transitionDuration(500) .xUnits(dc.units.ordinal) .label(function(d) {return d.value}) .x(d3.scale.ordinal().domain(XDimension)) dc.renderAll();


Esta función reubicará las etiquetas de un gráfico de filas al final de cada fila. Una técnica similar podría usarse para un gráfico de barras usando el atributo "y".

  • Las etiquetas se animan junto con la fila rect, usando la transición del gráficoDuración
  • Utiliza el valor de la función del archivoAccessor
  • Usa la escala xAxis de la gráfica para calcular la posición de la etiqueta

rowChart.on(''pretransition'', function(chart) { var padding = 2; chart.selectAll(''g.row > text'') //find all row labels .attr(''x'', padding) //move labels to starting position .transition() //start transition .duration(chart.transitionDuration()) //use chart''s transitionDuration so labels animate with rows .attr(''x'', function(d){ //set label final position var dataValue = chart.valueAccessor()(d); //use chart''s value accessor as basis for row label position var scaledValue = chart.xAxis().scale()(dataValue); //convert numeric value to row width return scaledValue+padding; //return scaled value to set label position }); });


Si utiliza un ValueAccessor especializado con un gráfico, puede realizar la siguiente sustitución en la solución "D3-ish way" de dimirc.

Cambio

.text(function(d){ return d3.select(d).data()[0].data.value })

A

.text(function(d){ return chart.valueAccessor()(d3.select(d).data()[0].data) });


Ver jsfiddle actualizado

.renderlet(function(chart){ var barsData = []; var bars = chart.selectAll(''.bar'').each(function(d) { barsData.push(d); }); //Remove old values (if found) d3.select(bars[0][0].parentNode).select(''#inline-labels'').remove(); //Create group for labels var gLabels = d3.select(bars[0][0].parentNode).append(''g'').attr(''id'',''inline-labels''); for (var i = bars[0].length - 1; i >= 0; i--) { var b = bars[0][i]; //Only create label if bar height is tall enough if (+b.getAttribute(''height'') < 18) continue; gLabels .append("text") .text(barsData[i].data.value) .attr(''x'', +b.getAttribute(''x'') + (b.getAttribute(''width'')/2) ) .attr(''y'', +b.getAttribute(''y'') + 15) .attr(''text-anchor'', ''middle'') .attr(''fill'', ''white''); } })

Si no desea que las etiquetas estén visibles cuando las barras se vuelven a dibujar (por ejemplo, cuando las barras cambian después de que el usuario filtre / haga clic en otro gráfico) puede mover la comprobación de los valores anteriores de renderlet a un oyente preRedraw .

.on("preRedraw", function(chart){ //Remove old values (if found) chart.select(''#inline-labels'').remove(); })

Alternativa

Manera D3-ish

Demo jsfiddle

.renderlet(function (chart) { //Check if labels exist var gLabels = chart.select(".labels"); if (gLabels.empty()){ gLabels = chart.select(".chart-body").append(''g'').classed(''labels'', true); } var gLabelsData = gLabels.selectAll("text").data(chart.selectAll(".bar")[0]); gLabelsData.exit().remove(); //Remove unused elements gLabelsData.enter().append("text") //Add new elements gLabelsData .attr(''text-anchor'', ''middle'') .attr(''fill'', ''white'') .text(function(d){ return d3.select(d).data()[0].data.value }) .attr(''x'', function(d){ return +d.getAttribute(''x'') + (d.getAttribute(''width'')/2); }) .attr(''y'', function(d){ return +d.getAttribute(''y'') + 15; }) .attr(''style'', function(d){ if (+d.getAttribute(''height'') < 18) return "display:none"; }); })