<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Build Extension from D3js in Integration, Extension &amp; APIs</title>
    <link>https://community.qlik.com/t5/Integration-Extension-APIs/Build-Extension-from-D3js/m-p/1316310#M7387</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 13px;"&gt;Hi Experts,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;I'm new to build Qlik Sense Extension from D3js,&lt;/P&gt;&lt;P&gt;I start with two sites below, and the sample worked very well &lt;/P&gt;&lt;P&gt;&lt;A href="http://www.axisgroup.com/tutorial-how-to-build-a-qlik-sense-extension-with-d3/"&gt;http://www.axisgroup.com/tutorial-how-to-build-a-qlik-sense-extension-with-d3/&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;A _jive_internal="true" href="https://community.qlik.com/docs/DOC-16347"&gt;https://community.qlik.com/docs/DOC-16347 &lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;So I start to use this sample to build extension&lt;/P&gt;&lt;P&gt;&lt;A href="https://bl.ocks.org/mbostock/4062085" style="font-size: 10pt;" title="https://bl.ocks.org/mbostock/4062085"&gt;https://bl.ocks.org/mbostock/4062085&lt;/A&gt;‌&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;But when I finish the code and import the dimensions and measures from test data,&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;It's always no error but all blank&lt;IMG src="https://community.qlik.com/legacyfs/online/emoticons/confused.png" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;&lt;IMG alt="ex1.JPG" class="jive-image image-1" src="https://community.qlik.com/legacyfs/online/167389_ex1.JPG" style="height: auto;" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;&lt;IMG alt="ex2.JPG" class="jive-image image-2" src="https://community.qlik.com/legacyfs/online/167390_ex2.JPG" style="height: auto;" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;I also tried another D3js sample to use, but almost all samples are same problem&lt;IMG src="https://community.qlik.com/legacyfs/online/emoticons/cry.png" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This is my code&lt;/P&gt;&lt;PRE __default_attr="javascript" __jive_macro_name="code" class="jive_macro_code jive_text_macro _jivemacro_uid_14979286028549554" jivemacro_uid="_14979286028549554"&gt;
&lt;P&gt;/*globals define*/&lt;/P&gt;
&lt;P&gt;define( ["qlik", "jquery", "text!./style.css", "./d3.v3.min"], function ( qlik, $, cssContent ) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; 'use strict';&lt;/P&gt;
&lt;P&gt;&amp;nbsp; $( "&amp;lt;style&amp;gt;" ).html( cssContent ).appendTo( "head" );&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; return {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; initialProperties: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; qHyperCubeDef: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; qDimensions: [],&lt;/P&gt;
&lt;P&gt;&amp;nbsp; qMeasures: [],&lt;/P&gt;
&lt;P&gt;&amp;nbsp; qInitialDataFetch: [{&lt;/P&gt;
&lt;P&gt;&amp;nbsp; qWidth: 4,&lt;/P&gt;
&lt;P&gt;&amp;nbsp; qHeight: 1000&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }]&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp; definition: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; type: "items",&lt;/P&gt;
&lt;P&gt;&amp;nbsp; component: "accordion",&lt;/P&gt;
&lt;P&gt;&amp;nbsp; items: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; dimensions: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; uses: "dimensions",&lt;/P&gt;
&lt;P&gt;&amp;nbsp; min: 3&lt;/P&gt;
&lt;P&gt;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp; measures: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; uses: "measures",&lt;/P&gt;
&lt;P&gt;&amp;nbsp; min: 1&lt;/P&gt;
&lt;P&gt;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp; sorting: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; uses: "sorting"&lt;/P&gt;
&lt;P&gt;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp; settings: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; uses: "settings"&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp; snapshot: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; canTakeSnapshot: true&lt;/P&gt;
&lt;P&gt;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp; paint: function ( $element, layout ) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //console.log($element);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //console.log(layout);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get qMatrix data array&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var qMatrix = layout.qHyperCube.qDataPages[0].qMatrix;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // create a new array that contains the measure labels&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var measureLabels = layout.qHyperCube.qMeasureInfo.map(function(d) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return d.qFallbackTitle;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create a new array for our extension with a row for each row in the qMatrix&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var data = qMatrix.map(function(d) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // for each element in the matrix, create a new object that has a property&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // for the grouping dimension, the first metric, and the second metric&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Dim1":d[0].qText,&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "Dim2":d[1].qText,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Dim3":d[2].qText,&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "Metric1":d[3].qNum&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Chart object width&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var width = $element.width();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Chart object height&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var height = $element.height();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Chart object id&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var id = "container_" + layout.qInfo.qId;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Check to see if the chart element has already been created&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (document.getElementById(id)) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if it has been created, empty it's contents so we can redraw it&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#" + id).empty();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if it hasn't been created, create it with the appropiate id and size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $element.append($('&amp;lt;div /&amp;gt;;').attr("id", id).width(width).height(height));&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt; viz(data,measureLabels,width,height,id);&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; };&lt;/P&gt;
&lt;P&gt;} );&lt;/P&gt;
&lt;P&gt;var viz = function (data,labels,width,height,id) {&lt;/P&gt;
&lt;P&gt;var margin = {top: 20, right: 40, bottom: 30, left: 20},&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; width = width - margin.left - margin.right,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; height = height - margin.top - margin.bottom,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; barWidth = Math.floor(width / 19) - 1;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;var x = d3.scale.linear()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .range([barWidth / 2, width - barWidth / 2]);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;var y = d3.scale.linear()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .range([height, 0]);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;var yAxis = d3.svg.axis()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .scale(y)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .orient("right")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .tickSize(-width)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .tickFormat(function(d) { return Math.round(d / 1e6) + "M"; });&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;// An SVG element with a bottom-right origin.&lt;/P&gt;
&lt;P&gt;var svg = d3.select("body").append("svg")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("width", width + margin.left + margin.right)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("height", height + margin.top + margin.bottom)&lt;/P&gt;
&lt;P&gt;&amp;nbsp; .append("g")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("transform", "translate(" + margin.left + "," + margin.top + ")");&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;// A sliding container to hold the bars by birthyear.&lt;/P&gt;
&lt;P&gt;var birthyears = svg.append("g")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("class", "birthyears");&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;// A label for the current year.&lt;/P&gt;
&lt;P&gt;var title = svg.append("text")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("class", "title")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("dy", ".71em")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .text(2000);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Compute the extent of the data set in age and years.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; var age1 = d3.max(data, function(d) { return d.Dim2; }),&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; year0 = d3.min(data, function(d) { return d.Dim1; }),&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; year1 = d3.max(data, function(d) { return d.Dim1; }),&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; year = year1;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Update the scale domains.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; x.domain([year1 - age1, year1]);&lt;/P&gt;
&lt;P&gt;&amp;nbsp; y.domain([0, d3.max(data, function(d) { return d.Matric1; })]);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Produce a map from year and birthyear to [male, female].&lt;/P&gt;
&lt;P&gt;&amp;nbsp; data = d3.nest()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .key(function(d) { return d.Dim1; })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .key(function(d) { return d.Dim1 - d.Dim2; })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .rollup(function(v) { return v.map(function(d) { return d.Matric1; }); })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .map(data);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Add an axis to show the population values.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; svg.append("g")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("class", "y axis")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("transform", "translate(" + width + ",0)")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .call(yAxis)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .selectAll("g")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .filter(function(value) { return !value; })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .classed("zero", true);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Add labeled rects for each birthyear (so that no enter or exit is required).&lt;/P&gt;
&lt;P&gt;&amp;nbsp; var birthyear = birthyears.selectAll(".birthyear")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data(d3.range(year0 - age1, year1 + 1, 5))&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .enter().append("g")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("class", "birthyear")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("transform", function(birthyear) { return "translate(" + x(birthyear) + ",0)"; });&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; birthyear.selectAll("rect")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data(function(birthyear) { return data[year][birthyear] || [0, 0]; })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .enter().append("rect")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("x", -barWidth / 2)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("width", barWidth)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("y", y)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("height", function(value) { return height - y(value); });&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Add labels to show birthyear.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; birthyear.append("text")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("y", height - 4)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .text(function(birthyear) { return birthyear; });&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Add labels to show age (separate; not animated).&lt;/P&gt;
&lt;P&gt;&amp;nbsp; svg.selectAll(".age")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data(d3.range(0, age1 + 1, 5))&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .enter().append("text")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("class", "age")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("x", function(age) { return x(year - age); })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("y", height + 4)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("dy", ".71em")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .text(function(age) { return age; });&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Allow the arrow keys to change the displayed year.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; window.focus();&lt;/P&gt;
&lt;P&gt;&amp;nbsp; d3.select(window).on("keydown", function() {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (d3.event.keyCode) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 37: year = Math.max(year0, year - 10); break;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 39: year = Math.min(year1, year + 10); break;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; update();&lt;/P&gt;
&lt;P&gt;&amp;nbsp; });&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; function update() {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!(year in data)) return;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; title.text(year);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; birthyears.transition()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .duration(750)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("transform", "translate(" + (x(year1) - x(year)) + ",0)");&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; birthyear.selectAll("rect")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data(function(birthyear) { return data[year][birthyear] || [0, 0]; })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .transition()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .duration(750)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("y", y)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("height", function(value) { return height - y(value); });&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;/PRE&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;and css&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE __default_attr="css" __jive_macro_name="code" class="jive_macro_code jive_text_macro _jivemacro_uid_14979291018651993" jivemacro_uid="_14979291018651993"&gt;
&lt;P&gt;.qv-object-PopulationPyramid div.qv-object-content-container {&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid svg {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; font: 10px sans-serif;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid .y.axis path {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; display: none;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid .y.axis line {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; stroke: #fff;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; stroke-opacity: .2;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; shape-rendering: crispEdges;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid .y.axis .zero line {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; stroke: #000;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; stroke-opacity: 1;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid .title {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; font: 300 78px Helvetica Neue;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; fill: #666;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid .birthyear,&lt;/P&gt;
&lt;P&gt;.age {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; text-anchor: middle;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid .birthyear {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; fill: #fff;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid rect {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; fill-opacity: .6;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; fill: #e377c2;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid rect:first-child {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; fill: #1f77b4;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 13px;"&gt;Can any one help me solve this problem?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 13px;"&gt;Thanks!&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 20 Jun 2017 03:30:25 GMT</pubDate>
    <dc:creator />
    <dc:date>2017-06-20T03:30:25Z</dc:date>
    <item>
      <title>Build Extension from D3js</title>
      <link>https://community.qlik.com/t5/Integration-Extension-APIs/Build-Extension-from-D3js/m-p/1316310#M7387</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 13px;"&gt;Hi Experts,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;I'm new to build Qlik Sense Extension from D3js,&lt;/P&gt;&lt;P&gt;I start with two sites below, and the sample worked very well &lt;/P&gt;&lt;P&gt;&lt;A href="http://www.axisgroup.com/tutorial-how-to-build-a-qlik-sense-extension-with-d3/"&gt;http://www.axisgroup.com/tutorial-how-to-build-a-qlik-sense-extension-with-d3/&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;A _jive_internal="true" href="https://community.qlik.com/docs/DOC-16347"&gt;https://community.qlik.com/docs/DOC-16347 &lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;So I start to use this sample to build extension&lt;/P&gt;&lt;P&gt;&lt;A href="https://bl.ocks.org/mbostock/4062085" style="font-size: 10pt;" title="https://bl.ocks.org/mbostock/4062085"&gt;https://bl.ocks.org/mbostock/4062085&lt;/A&gt;‌&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;But when I finish the code and import the dimensions and measures from test data,&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;It's always no error but all blank&lt;IMG src="https://community.qlik.com/legacyfs/online/emoticons/confused.png" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;&lt;IMG alt="ex1.JPG" class="jive-image image-1" src="https://community.qlik.com/legacyfs/online/167389_ex1.JPG" style="height: auto;" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;&lt;IMG alt="ex2.JPG" class="jive-image image-2" src="https://community.qlik.com/legacyfs/online/167390_ex2.JPG" style="height: auto;" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;I also tried another D3js sample to use, but almost all samples are same problem&lt;IMG src="https://community.qlik.com/legacyfs/online/emoticons/cry.png" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This is my code&lt;/P&gt;&lt;PRE __default_attr="javascript" __jive_macro_name="code" class="jive_macro_code jive_text_macro _jivemacro_uid_14979286028549554" jivemacro_uid="_14979286028549554"&gt;
&lt;P&gt;/*globals define*/&lt;/P&gt;
&lt;P&gt;define( ["qlik", "jquery", "text!./style.css", "./d3.v3.min"], function ( qlik, $, cssContent ) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; 'use strict';&lt;/P&gt;
&lt;P&gt;&amp;nbsp; $( "&amp;lt;style&amp;gt;" ).html( cssContent ).appendTo( "head" );&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; return {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; initialProperties: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; qHyperCubeDef: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; qDimensions: [],&lt;/P&gt;
&lt;P&gt;&amp;nbsp; qMeasures: [],&lt;/P&gt;
&lt;P&gt;&amp;nbsp; qInitialDataFetch: [{&lt;/P&gt;
&lt;P&gt;&amp;nbsp; qWidth: 4,&lt;/P&gt;
&lt;P&gt;&amp;nbsp; qHeight: 1000&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }]&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp; definition: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; type: "items",&lt;/P&gt;
&lt;P&gt;&amp;nbsp; component: "accordion",&lt;/P&gt;
&lt;P&gt;&amp;nbsp; items: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; dimensions: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; uses: "dimensions",&lt;/P&gt;
&lt;P&gt;&amp;nbsp; min: 3&lt;/P&gt;
&lt;P&gt;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp; measures: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; uses: "measures",&lt;/P&gt;
&lt;P&gt;&amp;nbsp; min: 1&lt;/P&gt;
&lt;P&gt;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp; sorting: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; uses: "sorting"&lt;/P&gt;
&lt;P&gt;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp; settings: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; uses: "settings"&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp; snapshot: {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; canTakeSnapshot: true&lt;/P&gt;
&lt;P&gt;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp; paint: function ( $element, layout ) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //console.log($element);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //console.log(layout);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get qMatrix data array&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var qMatrix = layout.qHyperCube.qDataPages[0].qMatrix;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // create a new array that contains the measure labels&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var measureLabels = layout.qHyperCube.qMeasureInfo.map(function(d) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return d.qFallbackTitle;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create a new array for our extension with a row for each row in the qMatrix&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var data = qMatrix.map(function(d) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // for each element in the matrix, create a new object that has a property&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // for the grouping dimension, the first metric, and the second metric&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Dim1":d[0].qText,&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "Dim2":d[1].qText,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Dim3":d[2].qText,&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "Metric1":d[3].qNum&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Chart object width&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var width = $element.width();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Chart object height&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var height = $element.height();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Chart object id&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var id = "container_" + layout.qInfo.qId;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Check to see if the chart element has already been created&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (document.getElementById(id)) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if it has been created, empty it's contents so we can redraw it&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#" + id).empty();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if it hasn't been created, create it with the appropiate id and size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $element.append($('&amp;lt;div /&amp;gt;;').attr("id", id).width(width).height(height));&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt; viz(data,measureLabels,width,height,id);&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; };&lt;/P&gt;
&lt;P&gt;} );&lt;/P&gt;
&lt;P&gt;var viz = function (data,labels,width,height,id) {&lt;/P&gt;
&lt;P&gt;var margin = {top: 20, right: 40, bottom: 30, left: 20},&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; width = width - margin.left - margin.right,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; height = height - margin.top - margin.bottom,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; barWidth = Math.floor(width / 19) - 1;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;var x = d3.scale.linear()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .range([barWidth / 2, width - barWidth / 2]);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;var y = d3.scale.linear()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .range([height, 0]);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;var yAxis = d3.svg.axis()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .scale(y)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .orient("right")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .tickSize(-width)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .tickFormat(function(d) { return Math.round(d / 1e6) + "M"; });&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;// An SVG element with a bottom-right origin.&lt;/P&gt;
&lt;P&gt;var svg = d3.select("body").append("svg")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("width", width + margin.left + margin.right)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("height", height + margin.top + margin.bottom)&lt;/P&gt;
&lt;P&gt;&amp;nbsp; .append("g")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("transform", "translate(" + margin.left + "," + margin.top + ")");&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;// A sliding container to hold the bars by birthyear.&lt;/P&gt;
&lt;P&gt;var birthyears = svg.append("g")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("class", "birthyears");&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;// A label for the current year.&lt;/P&gt;
&lt;P&gt;var title = svg.append("text")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("class", "title")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("dy", ".71em")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .text(2000);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Compute the extent of the data set in age and years.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; var age1 = d3.max(data, function(d) { return d.Dim2; }),&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; year0 = d3.min(data, function(d) { return d.Dim1; }),&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; year1 = d3.max(data, function(d) { return d.Dim1; }),&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; year = year1;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Update the scale domains.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; x.domain([year1 - age1, year1]);&lt;/P&gt;
&lt;P&gt;&amp;nbsp; y.domain([0, d3.max(data, function(d) { return d.Matric1; })]);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Produce a map from year and birthyear to [male, female].&lt;/P&gt;
&lt;P&gt;&amp;nbsp; data = d3.nest()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .key(function(d) { return d.Dim1; })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .key(function(d) { return d.Dim1 - d.Dim2; })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .rollup(function(v) { return v.map(function(d) { return d.Matric1; }); })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .map(data);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Add an axis to show the population values.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; svg.append("g")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("class", "y axis")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("transform", "translate(" + width + ",0)")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .call(yAxis)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .selectAll("g")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .filter(function(value) { return !value; })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .classed("zero", true);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Add labeled rects for each birthyear (so that no enter or exit is required).&lt;/P&gt;
&lt;P&gt;&amp;nbsp; var birthyear = birthyears.selectAll(".birthyear")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data(d3.range(year0 - age1, year1 + 1, 5))&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .enter().append("g")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("class", "birthyear")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("transform", function(birthyear) { return "translate(" + x(birthyear) + ",0)"; });&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; birthyear.selectAll("rect")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data(function(birthyear) { return data[year][birthyear] || [0, 0]; })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .enter().append("rect")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("x", -barWidth / 2)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("width", barWidth)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("y", y)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("height", function(value) { return height - y(value); });&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Add labels to show birthyear.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; birthyear.append("text")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("y", height - 4)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .text(function(birthyear) { return birthyear; });&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Add labels to show age (separate; not animated).&lt;/P&gt;
&lt;P&gt;&amp;nbsp; svg.selectAll(".age")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data(d3.range(0, age1 + 1, 5))&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .enter().append("text")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("class", "age")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("x", function(age) { return x(year - age); })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("y", height + 4)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("dy", ".71em")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .text(function(age) { return age; });&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // Allow the arrow keys to change the displayed year.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; window.focus();&lt;/P&gt;
&lt;P&gt;&amp;nbsp; d3.select(window).on("keydown", function() {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (d3.event.keyCode) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 37: year = Math.max(year0, year - 10); break;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 39: year = Math.min(year1, year + 10); break;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; update();&lt;/P&gt;
&lt;P&gt;&amp;nbsp; });&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; function update() {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!(year in data)) return;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; title.text(year);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; birthyears.transition()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .duration(750)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("transform", "translate(" + (x(year1) - x(year)) + ",0)");&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; birthyear.selectAll("rect")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data(function(birthyear) { return data[year][birthyear] || [0, 0]; })&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .transition()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .duration(750)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("y", y)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("height", function(value) { return height - y(value); });&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;/PRE&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 13.3333px;"&gt;and css&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE __default_attr="css" __jive_macro_name="code" class="jive_macro_code jive_text_macro _jivemacro_uid_14979291018651993" jivemacro_uid="_14979291018651993"&gt;
&lt;P&gt;.qv-object-PopulationPyramid div.qv-object-content-container {&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid svg {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; font: 10px sans-serif;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid .y.axis path {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; display: none;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid .y.axis line {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; stroke: #fff;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; stroke-opacity: .2;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; shape-rendering: crispEdges;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid .y.axis .zero line {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; stroke: #000;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; stroke-opacity: 1;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid .title {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; font: 300 78px Helvetica Neue;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; fill: #666;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid .birthyear,&lt;/P&gt;
&lt;P&gt;.age {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; text-anchor: middle;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid .birthyear {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; fill: #fff;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid rect {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; fill-opacity: .6;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; fill: #e377c2;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;.qv-object-PopulationPyramid rect:first-child {&lt;/P&gt;
&lt;P&gt;&amp;nbsp; fill: #1f77b4;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 13px;"&gt;Can any one help me solve this problem?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 13px;"&gt;Thanks!&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 20 Jun 2017 03:30:25 GMT</pubDate>
      <guid>https://community.qlik.com/t5/Integration-Extension-APIs/Build-Extension-from-D3js/m-p/1316310#M7387</guid>
      <dc:creator />
      <dc:date>2017-06-20T03:30:25Z</dc:date>
    </item>
    <item>
      <title>Re: Build Extension from D3js</title>
      <link>https://community.qlik.com/t5/Integration-Extension-APIs/Build-Extension-from-D3js/m-p/1316311#M7388</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I find my mistake at &lt;/P&gt;&lt;OL class="dp-c" start="1" style="font-size: 12px; font-family: Consolas, 'Courier New', Courier, mono, serif; list-style-position: initial; list-style-image: initial; color: #5c5c5c; margin: 0 0 1px 45px !important;"&gt;&lt;LI&gt;&lt;SPAN style="font-weight: inherit; font-style: inherit; color: black; background-color: inherit; font-size: 9pt !important;"&gt;&lt;SPAN class="keyword" style="font-weight: inherit; font-style: inherit; color: #006699; background-color: inherit; font-size: 9pt !important;"&gt;var&lt;/SPAN&gt;&lt;SPAN style="font-weight: inherit; font-style: inherit; background-color: inherit; font-size: 9pt !important;"&gt; svg = d3.select(&lt;/SPAN&gt;&lt;SPAN class="string" style="font-weight: inherit; font-style: inherit; color: blue; background-color: inherit; font-size: 9pt !important;"&gt;"body"&lt;/SPAN&gt;&lt;SPAN style="font-weight: inherit; font-style: inherit; background-color: inherit; font-size: 9pt !important;"&gt;).append(&lt;/SPAN&gt;&lt;SPAN class="string" style="font-weight: inherit; font-style: inherit; color: blue; background-color: inherit; font-size: 9pt !important;"&gt;"svg"&lt;/SPAN&gt;&lt;SPAN style="font-weight: inherit; font-style: inherit; background-color: inherit; font-size: 9pt !important;"&gt;)&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&lt;SPAN style="color: black; font-size: 9pt !important; font-style: inherit; background-color: inherit; font-weight: inherit;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: black; font-size: 9pt !important; font-style: inherit; background-color: inherit; font-weight: inherit;"&gt;It must change to&lt;/SPAN&gt;&lt;/P&gt;&lt;OL class="dp-c" start="1" style="list-style-position: initial; list-style-image: initial; font-size: 12px; font-family: Consolas, 'Courier New', Courier, mono, serif; color: #5c5c5c; margin: 0 0 1px 45px !important;"&gt;&lt;LI&gt;&lt;SPAN style="font-weight: inherit; font-style: inherit; color: black; font-size: 9pt !important;"&gt;&lt;SPAN class="keyword" style="font-weight: inherit; font-style: inherit; color: #006699; font-size: 9pt !important;"&gt;var&lt;/SPAN&gt;&lt;SPAN style="font-weight: inherit; font-style: inherit; font-size: 9pt !important;"&gt; svg = d3.select(&lt;/SPAN&gt;&lt;SPAN class="string" style="font-weight: inherit; font-style: inherit; color: blue; font-size: 9pt !important;"&gt;"#"+id&lt;/SPAN&gt;&lt;SPAN style="font-weight: inherit; font-style: inherit; font-size: 9pt !important;"&gt;).append(&lt;/SPAN&gt;&lt;SPAN class="string" style="font-weight: inherit; font-style: inherit; color: blue; font-size: 9pt !important;"&gt;"svg"&lt;/SPAN&gt;&lt;SPAN style="font-weight: inherit; font-style: inherit; font-size: 9pt !important;"&gt;)&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&lt;SPAN style="color: black; font-size: 9pt !important; font-style: inherit; background-color: inherit; font-weight: inherit;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: black; font-size: 9pt !important; font-style: inherit; background-color: inherit; font-weight: inherit;"&gt; It's worked now!&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 06 Jul 2017 09:46:36 GMT</pubDate>
      <guid>https://community.qlik.com/t5/Integration-Extension-APIs/Build-Extension-from-D3js/m-p/1316311#M7388</guid>
      <dc:creator />
      <dc:date>2017-07-06T09:46:36Z</dc:date>
    </item>
  </channel>
</rss>

