javascript - IBM Cognos Analytics 与 D3.js 条形图高度问题

标签 javascript d3.js cognos cognos-10 cognos-bi

我在 IBM Cognos Analytics 中配置 D3 条形图示例时遇到问题。 我已经编辑了 Cognos 中的 D3 示例以合并值的标题,但不幸的是我似乎无法正确显示数据。 看起来矩形已正确分配给值,但每个条形的高度是相同的。因此它看起来像 1 个大酒吧。

有谁知道如何解决这个问题吗?我尝试在 bl.ocks.org 上查看一些示例,但它不起作用(例如我尝试复制此 https://bl.ocks.org/caravinden/eb0e5a2b38c8815919290fa838c6b63b )!

它看起来是这样的:

enter image description here

define( ["https://censored/samples/javascript/lib/d3.min.js"], function( d3 ) {
"use strict";

function D3BarChart()
{
};

D3BarChart.prototype.draw = function( oControlHost )
{
    var o = oControlHost.configuration;
    var margin = {top: 20, right: 150, bottom: 30, left: 80},
        width = 1040 - margin.left - margin.right,
        height = 500 - margin.top - margin.bottom;

    var x = d3.scaleLinear()
        .domain( [0, d3.max( this.m_aValues )])
        .range( [0, width] );

    var y = d3.scaleBand()
    //  .domain(data.map(function(d) { return this.m_aLabels;}))
        .rangeRound([height, 0])
        .padding(0.1);

    var xAxis = d3.axisBottom(x);

    var yAxis = d3.axisLeft(y);

    var svg = d3.select(oControlHost.container).append("svg")
        .attr("width", width + margin.left + margin.right)
        .attr("height", height + margin.top + margin.bottom)
        .append("g")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

    svg.selectAll( ".bar" )
    .data( this.m_aValues)
    .enter().append( "rect" )
    .attr("class", "bar")
    .attr("y", function(d) { return this.m_aLabels; })
    .attr( "width", function(d) { return x(d); } )
    .attr( "height", y.bandwidth())
    .text( function( d ) { return d; } );

    svg.append("g")
      .attr("class", "y axis")
      .call((yAxis)
        .tickSize(3)
        .tickPadding(6));
};

D3BarChart.prototype.setData = function( oControlHost, oDataStore )
{
               this.m_oDataStore = oDataStore;
               this.m_aValues = [];
               this.m_aLabels = [];
               var iRowCount = oDataStore.rowCount;
               for ( var iRow = 0; iRow < iRowCount; iRow++ )
               {
                              this.m_aLabels.push( oDataStore.getCellValue( iRow, 0 ) );
                              this.m_aValues.push( oDataStore.getCellValue( iRow, 1 ) );
               }
};

return D3BarChart;
});

最佳答案

您的数据不合适。看起来您有两个数组,每个数据点都需要一个数组:

this.data = [];
var iRowCount = oDataStore.rowCount;
for ( var iRow = 0; iRow < iRowCount; iRow++ )
{
  this.data.push( {label: oDataStore.getCellValue( iRow, 0 ), value: oDataStore.getCellValue( iRow, 1 ) } );
}

然后您的域将变为:

var x = d3.scaleLinear()
    .domain( [0, d3.max(this.data, function(d) { return d.value; } ])
    .range( [0, width] );

var y = d3.scaleBand()
    .domain(this.data.map(function(d) { return d.label; }))
    .rangeRound([height, 0])
    .padding(0.1);

最后你的酒吧变成了;

svg.selectAll( ".bar" )
  .data( this.data )
  .enter().append( "rect" )
  .attr("class", "bar")
  .attr("y", function(d) { return y(d.label); })
  .attr( "width", function(d) { return x(d.value); } )
  .attr( "height", y.bandwidth())
  .text( function( d ) { return d.label; } );

关于javascript - IBM Cognos Analytics 与 D3.js 条形图高度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52964318/

相关文章:

javascript - 为什么要为 img 标签获取预加载框?

javascript - 如何用javascript读取txt文件

javascript - d3 从左到右的折线图动画

javascript - D3图表不显示

javascript - 在 Cognos Report Studio 上通过 HTML/javascript/php 运行 .vbs 脚本

mysql - IBM Cognos _days_between 函数不起作用

javascript - Node.js 和 Express 上使用 Angular 进行客户端路由

javascript - JS 类切换不适用于 getElementsByClassName

javascript - d3 textwrap 合并 <b> 和 <em> 标签

cognos - 行中的数据而不是列中的数据