<?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 Re: Sunburst extension in QlikView</title>
    <link>https://community.qlik.com/t5/QlikView/Sunburst-extension/m-p/703882#M1240998</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Emanuele,&lt;/P&gt;&lt;P&gt;Did you find the answer for &lt;STRONG&gt;loading data from Qlikview instead of Csv file in d3? &lt;/STRONG&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 29 Dec 2014 15:54:10 GMT</pubDate>
    <dc:creator>Anonymous</dc:creator>
    <dc:date>2014-12-29T15:54:10Z</dc:date>
    <item>
      <title>Sunburst extension</title>
      <link>https://community.qlik.com/t5/QlikView/Sunburst-extension/m-p/703880#M1240992</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi All,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm quite new to Qlikview, the community and D3. I've been unsuccessfully trying to understand how to create a Sequence Sunburst (from the d3 library) and I haven't found any answer in the community.&lt;/P&gt;&lt;P&gt;Does anyone know how to do it? I understand the basics of how to create a d3 extension in qlikview, but I don't know how to replicate the above chart.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Cheers&lt;/P&gt;&lt;P&gt;Emanuele&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 26 Jan 2026 16:26:21 GMT</pubDate>
      <guid>https://community.qlik.com/t5/QlikView/Sunburst-extension/m-p/703880#M1240992</guid>
      <dc:creator />
      <dc:date>2026-01-26T16:26:21Z</dc:date>
    </item>
    <item>
      <title>Re: Sunburst extension</title>
      <link>https://community.qlik.com/t5/QlikView/Sunburst-extension/m-p/703881#M1240995</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;STRONG&gt; Does anyone know how to change this code in order for it to able to load data from Qlikview and not from a Csv file? &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;var template_path = Qva.Remote + "?public=only&amp;amp;name=Extensions/Sunburst/";&lt;/P&gt;&lt;P&gt;function extension_Init()&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Use QlikView's method of loading other files needed by an extension. These files should be added to your extension .zip file (.qar)&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (typeof jQuery == 'undefined') {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Qva.LoadScript(template_path + 'jquery.js', extension_Done);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; else {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; extension_Done();&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&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;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;function extension_Done(){&lt;/P&gt;&lt;P&gt;&amp;nbsp; //Add extension&lt;/P&gt;&lt;P&gt;&amp;nbsp; Qva.AddExtension('Sunburst', function(){&lt;/P&gt;&lt;P&gt;&amp;nbsp; //Load a CSS style sheet&lt;/P&gt;&lt;P&gt;&amp;nbsp; Qva.LoadCSS(template_path + "sequences.css");&lt;/P&gt;&lt;P&gt;&amp;nbsp; var _this = this;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Dimensions of sunburst.&lt;/P&gt;&lt;P&gt;var width = 750;&lt;/P&gt;&lt;P&gt;var height = 600;&lt;/P&gt;&lt;P&gt;var radius = Math.min(width, height) / 2;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Breadcrumb dimensions: width, height, spacing, width of tip/tail.&lt;/P&gt;&lt;P&gt;var b = {&lt;/P&gt;&lt;P&gt;&amp;nbsp; w: 75, h: 30, s: 3, t: 10&lt;/P&gt;&lt;P&gt;};&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Mapping of step names to colors.&lt;/P&gt;&lt;P&gt;var colors = {&lt;/P&gt;&lt;P&gt;&amp;nbsp; "STEP 1": "#5687d1",&lt;/P&gt;&lt;P&gt;&amp;nbsp; "STEP 2": "#7b615c",&lt;/P&gt;&lt;P&gt;&amp;nbsp; "STEP 3": "#de783b",&lt;/P&gt;&lt;P&gt;&amp;nbsp; "STEP 4": "#6ab975",&lt;/P&gt;&lt;P&gt;&amp;nbsp; "STEP 5": "#a173d1",&lt;/P&gt;&lt;P&gt;&amp;nbsp; "END": "#bbbbbb"&lt;/P&gt;&lt;P&gt;};&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Total size of all segments; we set this later, after loading the data.&lt;/P&gt;&lt;P&gt;var totalSize = 0; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;var vis = d3.select("#chart").append("svg:svg")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("width", width)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("height", height)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .append("svg:g")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("id", "container")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;var partition = d3.layout.partition()&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .size([2 * Math.PI, radius * radius])&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .value(function(d) { return d.size; });&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;var arc = d3.svg.arc()&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .startAngle(function(d) { return d.x; })&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .endAngle(function(d) { return d.x + d.dx; })&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .innerRadius(function(d) { return Math.sqrt(d.y); })&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .outerRadius(function(d) { return Math.sqrt(d.y + d.dy); });&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Use d3.text and d3.csv.parseRows so that we do not need to have a header&lt;/P&gt;&lt;P&gt;// row, and can receive the csv as an array of arrays.&lt;/P&gt;&lt;P&gt;var text = "&lt;/P&gt;&lt;P&gt;Contacted-Delivered-Open-Click-end,3600\n\&lt;/P&gt;&lt;P&gt;Contacted-Delivered-Open-end,25605\n\&lt;/P&gt;&lt;P&gt;Contacted-end,11513\n\&lt;/P&gt;&lt;P&gt;";&lt;/P&gt;&lt;P&gt;&amp;nbsp; var csv = d3.csv.parseRows(text);&lt;/P&gt;&lt;P&gt;&amp;nbsp; var json = buildHierarchy(csv);&lt;/P&gt;&lt;P&gt;&amp;nbsp; createVisualization(json);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Main function to draw and set up the visualization, once we have the data.&lt;/P&gt;&lt;P&gt;function createVisualization(json) {&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Basic setup of page elements.&lt;/P&gt;&lt;P&gt;&amp;nbsp; initializeBreadcrumbTrail();&lt;/P&gt;&lt;P&gt;&amp;nbsp; drawLegend();&lt;/P&gt;&lt;P&gt;&amp;nbsp; d3.select("#togglelegend").on("click", toggleLegend);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Bounding circle underneath the sunburst, to make it easier to detect&lt;/P&gt;&lt;P&gt;&amp;nbsp; // when the mouse leaves the parent g.&lt;/P&gt;&lt;P&gt;&amp;nbsp; vis.append("svg:circle")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("r", radius)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .style("opacity", 0);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // For efficiency, filter nodes to keep only those large enough to see.&lt;/P&gt;&lt;P&gt;&amp;nbsp; var nodes = partition.nodes(json)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .filter(function(d) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (d.dx &amp;gt; 0.005); // 0.005 radians = 0.29 degrees&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var path = vis.data([json]).selectAll("path")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data(nodes)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .enter().append("svg:path")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("display", function(d) { return d.depth ? null : "none"; })&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("d", arc)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("fill-rule", "evenodd")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .style("fill", function(d) { return colors[d.name]; })&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .style("opacity", 1)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .on("mouseover", mouseover);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Add the mouseleave handler to the bounding circle.&lt;/P&gt;&lt;P&gt;&amp;nbsp; d3.select("#container").on("mouseleave", mouseleave);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Get total size of the tree = value of root node from partition.&lt;/P&gt;&lt;P&gt;&amp;nbsp; totalSize = path.node().__data__.value;&lt;/P&gt;&lt;P&gt; };&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Fade all but the current sequence, and show it in the breadcrumb trail.&lt;/P&gt;&lt;P&gt;function mouseover(d) {&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var percentage = (100 * d.value / totalSize).toPrecision(3);&lt;/P&gt;&lt;P&gt;&amp;nbsp; var percentageString = percentage + "%";&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (percentage &amp;lt; 0.1) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; percentageString = "&amp;lt; 0.1%";&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; d3.select("#percentage")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .text(percentageString);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; d3.select("#explanation")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .style("visibility", "");&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var sequenceArray = getAncestors(d);&lt;/P&gt;&lt;P&gt;&amp;nbsp; updateBreadcrumbs(sequenceArray, percentageString);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Fade all the segments.&lt;/P&gt;&lt;P&gt;&amp;nbsp; d3.selectAll("path")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .style("opacity", 0.3);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Then highlight only those that are an ancestor of the current segment.&lt;/P&gt;&lt;P&gt;&amp;nbsp; vis.selectAll("path")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .filter(function(node) {&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (sequenceArray.indexOf(node) &amp;gt;= 0);&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;&amp;nbsp;&amp;nbsp; })&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .style("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;// Restore everything to full opacity when moving off the visualization.&lt;/P&gt;&lt;P&gt;function mouseleave(d) {&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Hide the breadcrumb trail&lt;/P&gt;&lt;P&gt;&amp;nbsp; d3.select("#trail")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .style("visibility", "hidden");&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Deactivate all segments during transition.&lt;/P&gt;&lt;P&gt;&amp;nbsp; d3.selectAll("path").on("mouseover", null);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Transition each segment to full opacity and then reactivate it.&lt;/P&gt;&lt;P&gt;&amp;nbsp; d3.selectAll("path")&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; .duration(1000)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .style("opacity", 1)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .each("end", function() {&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;&amp;nbsp;&amp;nbsp; d3.select(this).on("mouseover", mouseover);&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; });&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; d3.select("#explanation")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .style("visibility", "hidden");&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Given a node in a partition layout, return an array of all of its ancestor&lt;/P&gt;&lt;P&gt;// nodes, highest first, but excluding the root.&lt;/P&gt;&lt;P&gt;function getAncestors(node) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; var path = [];&lt;/P&gt;&lt;P&gt;&amp;nbsp; var current = node;&lt;/P&gt;&lt;P&gt;&amp;nbsp; while (current.parent) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; path.unshift(current);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; current = current.parent;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; return path;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;function initializeBreadcrumbTrail() {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Add the svg area.&lt;/P&gt;&lt;P&gt;&amp;nbsp; var trail = d3.select("#sequence").append("svg:svg")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("width", width)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("height", 100)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("id", "trail");&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Add the label at the end, for the percentage.&lt;/P&gt;&lt;P&gt;&amp;nbsp; trail.append("svg:text")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("id", "endlabel")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .style("fill", "#000");&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Generate a string that describes the points of a breadcrumb polygon.&lt;/P&gt;&lt;P&gt;function breadcrumbPoints(d, i) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; var points = [];&lt;/P&gt;&lt;P&gt;&amp;nbsp; points.push("0,0");&lt;/P&gt;&lt;P&gt;&amp;nbsp; points.push(b.w + ",0");&lt;/P&gt;&lt;P&gt;&amp;nbsp; points.push(b.w + b.t + "," + (b.h / 2));&lt;/P&gt;&lt;P&gt;&amp;nbsp; points.push(b.w + "," + b.h);&lt;/P&gt;&lt;P&gt;&amp;nbsp; points.push("0," + b.h);&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (i &amp;gt; 0) { // Leftmost breadcrumb; don't include 6th vertex.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; points.push(b.t + "," + (b.h / 2));&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; return points.join(" ");&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Update the breadcrumb trail to show the current sequence and percentage.&lt;/P&gt;&lt;P&gt;function updateBreadcrumbs(nodeArray, percentageString) {&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Data join; key function combines name and depth (= position in sequence).&lt;/P&gt;&lt;P&gt;&amp;nbsp; var g = d3.select("#trail")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .selectAll("g")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data(nodeArray, function(d) { return d.name + d.depth; });&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Add breadcrumb and label for entering nodes.&lt;/P&gt;&lt;P&gt;&amp;nbsp; var entering = g.enter().append("svg:g");&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; entering.append("svg:polygon")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("points", breadcrumbPoints)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .style("fill", function(d) { return colors[d.name]; });&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; entering.append("svg:text")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("x", (b.w + b.t) / 2)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("y", b.h / 2)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("dy", "0.35em")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("text-anchor", "middle")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .text(function(d) { return d.name; });&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Set position for entering and updating nodes.&lt;/P&gt;&lt;P&gt;&amp;nbsp; g.attr("transform", function(d, i) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "translate(" + i * (b.w + b.s) + ", 0)";&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; // Remove exiting nodes.&lt;/P&gt;&lt;P&gt;&amp;nbsp; g.exit().remove();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Now move and update the percentage at the end.&lt;/P&gt;&lt;P&gt;&amp;nbsp; d3.select("#trail").select("#endlabel")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("x", (nodeArray.length + 0.5) * (b.w + b.s))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("y", b.h / 2)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("dy", "0.35em")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("text-anchor", "middle")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .text(percentageString);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Make the breadcrumb trail visible, if it's hidden.&lt;/P&gt;&lt;P&gt;&amp;nbsp; d3.select("#trail")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .style("visibility", "");&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;function drawLegend() {&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Dimensions of legend item: width, height, spacing, radius of rounded rect.&lt;/P&gt;&lt;P&gt;&amp;nbsp; var li = {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; w: 50, h: 15, s: 3, r: 3&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; var legend = d3.select("#legend").append("svg:svg")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("width", li.w)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("height", d3.keys(colors).length * (li.h + li.s));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var g = legend.selectAll("g")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data(d3.entries(colors))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .enter().append("svg:g")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("transform", function(d, i) {&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;&amp;nbsp;&amp;nbsp; return "translate(0," + i * (li.h + li.s) + ")";&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; });&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; g.append("svg:rect")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("rx", li.r)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("ry", li.r)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("width", li.w)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("height", li.h)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .style("fill", function(d) { return d.value; });&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; g.append("svg:text")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("x", li.w / 2)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("y", li.h / 2)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("dy", "0.35em")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .attr("text-anchor", "middle")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .text(function(d) { return d.key; });&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;function toggleLegend() {&lt;/P&gt;&lt;P&gt;&amp;nbsp; var legend = d3.select("#legend");&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (legend.style("visibility") == "hidden") {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; legend.style("visibility", "");&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; legend.style("visibility", "hidden");&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;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Take a 2-column CSV and transform it into a hierarchical structure suitable&lt;/P&gt;&lt;P&gt;// for a partition layout. The first column is a sequence of step names, from&lt;/P&gt;&lt;P&gt;// root to leaf, separated by hyphens. The second column is a count of how &lt;/P&gt;&lt;P&gt;// often that sequence occurred.&lt;/P&gt;&lt;P&gt;function buildHierarchy(csv) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; var root = {"name": "root", "children": []};&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (var i = 0; i &amp;lt; csv.length; i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var sequence = csv&lt;I&gt;[0];&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var size = +csv&lt;I&gt;[1];&lt;/I&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (isNaN(size)) { // e.g. if this is a header row&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var parts = sequence.split("-");&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var currentNode = root;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var j = 0; j &amp;lt; parts.length; j++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var children = currentNode["children"];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var nodeName = parts&lt;J&gt;;&lt;/J&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var childNode;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (j + 1 &amp;lt; parts.length) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; // Not yet at the end of the sequence; move down the tree.&lt;/P&gt;&lt;P&gt;&amp;nbsp; var foundChild = false;&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (var k = 0; k &amp;lt; children.length; k++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if (children&lt;K&gt;["name"] == nodeName) {&lt;/K&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childNode = children&lt;K&gt;;&lt;/K&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foundChild = true;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; // If we don't already have a child node for this branch, create it.&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (!foundChild) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; childNode = {"name": nodeName, "children": []};&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; children.push(childNode);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; currentNode = childNode;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Reached the end of the sequence; create a leaf node.&lt;/P&gt;&lt;P&gt;&amp;nbsp; childNode = {"name": nodeName, "size": size};&lt;/P&gt;&lt;P&gt;&amp;nbsp; children.push(childNode);&lt;/P&gt;&lt;P&gt;&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; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; return root;&lt;/P&gt;&lt;P&gt;}; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Thanks&lt;/STRONG&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 28 Oct 2014 14:51:40 GMT</pubDate>
      <guid>https://community.qlik.com/t5/QlikView/Sunburst-extension/m-p/703881#M1240995</guid>
      <dc:creator />
      <dc:date>2014-10-28T14:51:40Z</dc:date>
    </item>
    <item>
      <title>Re: Sunburst extension</title>
      <link>https://community.qlik.com/t5/QlikView/Sunburst-extension/m-p/703882#M1240998</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Emanuele,&lt;/P&gt;&lt;P&gt;Did you find the answer for &lt;STRONG&gt;loading data from Qlikview instead of Csv file in d3? &lt;/STRONG&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 29 Dec 2014 15:54:10 GMT</pubDate>
      <guid>https://community.qlik.com/t5/QlikView/Sunburst-extension/m-p/703882#M1240998</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2014-12-29T15:54:10Z</dc:date>
    </item>
  </channel>
</rss>

