﻿<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://developers.de/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Armin Kalajdzija Posts : D3.js</title><link />http://developers.de/blogs/armin_kalajdzija/archive/tags/D3.js/default.aspx<description>Tags: D3.js</description><dc:language>en</dc:language><generator>CommunityServer 2008 SP1 (Build: 30619.63)</generator><item><title>How to use D3.js for Server Side Chart Generation in .NET (Part 2)</title><link />http://developers.de/blogs/armin_kalajdzija/archive/2015/07/22/how-to-use-d3-js-for-server-side-chart-generation-in-net-part-2.aspx<pubdate>Wed, 22 Jul 2015 11:56:00 GMT</pubdate><guid ispermalink="false">7e491611-45ad-4dae-a68f-c4cb64439510:1470935</guid><dc:creator>Armin Kalajdzija</dc:creator><slash:comments>1</slash:comments><wfw:commentrss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developers.de/blogs/armin_kalajdzija/rsscomments.aspx?PostID=1470935</wfw:commentrss><comments>http://developers.de/blogs/armin_kalajdzija/archive/2015/07/22/how-to-use-d3-js-for-server-side-chart-generation-in-net-part-2.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;How to use D3.js for Server Side Chart Generation in .NET&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://developers.de/blogs/armin_kalajdzija/archive/2015/07/15/how-to-use-d3-js-for-graph-generation-in-asp-net-web-application-part-1.aspx" target="_blank"&gt;Part 1: Creating a Donut Chart using D3.js&lt;/a&gt;     &lt;br /&gt;Part 2: Render/Export D3.js Chart as PNG Image using PhantomJS    &lt;br /&gt;&lt;a href="http://developers.de/blogs/armin_kalajdzija/archive/2015/07/30/how-to-use-d3-js-for-server-side-chart-generation-in-net-part-3.aspx" target="_blank"&gt;Part 3: Creating a simple REST Service using ASP.NET Web API&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So after we have created a HTML Template of our Donut Chart in the previous part, I will be dealing with exporting of this Chart as a PNG Image in this part of the Series. &lt;/p&gt;  &lt;p&gt;For that purpose we will be using &lt;a href="http://phantomjs.org/" target="_blank"&gt;PhantomJS&lt;/a&gt;. It is a headless webkit engine that can be scriptable with Javascript and has native support for DOM, CSS and SVG. I have chosen the PhantomJS over other engines because it is really easy to use, supports various exports (PNG, PDF etc.) out of the box and its implementation of DOM is definitely better then using JSDom under Node.js/IO.js … at least this is my personal opinion.     &lt;br /&gt;One more thing that I like about PhantomJS is that is one single .exe file. This means you don’t have to install anything so it is portable and you can simply put him in the same folder as your HTML Template.&lt;/p&gt;  &lt;p&gt;Now we need to script the PhantomJS to do what we want. We need to create new Javascript fille called &lt;strong&gt;render.js&lt;/strong&gt; that will contain our rendering logic shown in the Code Snippet:&lt;/p&gt;  &lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;height:440px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:440px;background-color:#f4f4f4;"&gt;   &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;     &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; page = require(&lt;span style="color:#006080;"&gt;&amp;#39;webpage&amp;#39;&lt;/span&gt;).create(),&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    fs = require(&lt;span style="color:#006080;"&gt;&amp;#39;fs&amp;#39;&lt;/span&gt;),&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;    system = require(&lt;span style="color:#006080;"&gt;&amp;#39;system&amp;#39;&lt;/span&gt;),&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    address, output;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (system.args.length &amp;lt; 3 || system.args.length &amp;gt; 3) &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    console.log(&lt;span style="color:#006080;"&gt;&amp;#39;Usage: render.js htmlFileName pngFileName&amp;#39;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;    phantom.exit(1);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;}&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;    address = &lt;span style="color:#006080;"&gt;&amp;#39;file:///&amp;#39;&lt;/span&gt; + fs.absolute(system.args[1]);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    output = system.args[2];&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;    &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    page.open(address, &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; (status) {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (status !== &lt;span style="color:#006080;"&gt;&amp;#39;success&amp;#39;&lt;/span&gt;) {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;            console.log(&lt;span style="color:#006080;"&gt;&amp;#39;Unable to load the address: &amp;#39;&lt;/span&gt; + address);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;            phantom.exit(1);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;        } &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;            window.setTimeout(&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; () {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;                page.render(output);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;                phantom.exit();&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;            }, 200);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;        }&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    });&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;As you can see, first we are including &lt;strong&gt;Webpage&lt;/strong&gt;, &lt;strong&gt;File System&lt;/strong&gt; and &lt;strong&gt;System&lt;/strong&gt; Module from PhantomJS API. &lt;strong&gt;Webpage&lt;/strong&gt; is needed for loading and rendering of our HTML Chart Template, &lt;strong&gt;File System&lt;/strong&gt; gives us access to local file system for reading and writing the files and &lt;strong&gt;System&lt;/strong&gt; Module is there only for accessing the command arguments on start of the PhantomJS.&lt;/p&gt;

&lt;p&gt;Next thing is to check if the PhantomJS is started with enough arguments, and if everything is fine, we are proceeding to the main part of the script which is nothing more then loading the given HTML file in &lt;strong&gt;Webpage&lt;/strong&gt; Module and calling the &lt;strong&gt;Render()&lt;/strong&gt; method to the given output file. Depending of which file extension has been given to &lt;strong&gt;Render()&lt;/strong&gt; method (PNG, PDF, JPEG or GIF), it will deliver the correct output format of the file.&lt;/p&gt;

&lt;p&gt;Now when everything is in the same folder, we can simply start PhantomJS with following command:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:200px;background-color:#f4f4f4;"&gt;
  &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;
    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;C:\Temp\Chart&amp;gt; phantomjs.exe render.js donut.html donut.png&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;As a result, you should find your Donut Chart as PNG file written on the File System looking something like this:&lt;/p&gt;

&lt;p&gt;&lt;img title="donut" style="display:inline;" alt="donut" src="http://developers.de/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/armin_5F00_kalajdzija/donut_5F00_thumb_5F00_1AADF2CB.png" width="608" height="416" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://developers.de/aggbug.aspx?PostID=1470935" width="1" height="1"&gt;</description><category domain="http://developers.de/blogs/armin_kalajdzija/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://developers.de/blogs/armin_kalajdzija/archive/tags/D3.js/default.aspx">D3.js</category><category domain="http://developers.de/blogs/armin_kalajdzija/archive/tags/PhantomJS/default.aspx">PhantomJS</category></item><item><title>How to use D3.js for Server Side Chart Generation in .NET (Part 1)</title><link />http://developers.de/blogs/armin_kalajdzija/archive/2015/07/15/how-to-use-d3-js-for-graph-generation-in-asp-net-web-application-part-1.aspx<pubdate>Wed, 15 Jul 2015 09:44:00 GMT</pubdate><guid ispermalink="false">7e491611-45ad-4dae-a68f-c4cb64439510:1462421</guid><dc:creator>Armin Kalajdzija</dc:creator><slash:comments>2</slash:comments><wfw:commentrss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developers.de/blogs/armin_kalajdzija/rsscomments.aspx?PostID=1462421</wfw:commentrss><comments>http://developers.de/blogs/armin_kalajdzija/archive/2015/07/15/how-to-use-d3-js-for-graph-generation-in-asp-net-web-application-part-1.aspx#comments</comments><description>&lt;p&gt;After finally finishing my studies (for now), I am getting my &amp;quot;old life&amp;quot; back again! That means more time for coding, research and of course blogging. As one of my first (small?!) series that I will be writing will be about &amp;quot;How to use D3.js for Server Side Chart Generation in .NET&amp;quot; that will be splitted in few parts, so lets get started!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;How to use D3.js for Server Side Chart Generation in .NET&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Part 1: Creating a Donut Chart using D3.js    &lt;br /&gt;&lt;a href="http://developers.de/blogs/armin_kalajdzija/archive/2015/07/22/how-to-use-d3-js-for-server-side-chart-generation-in-net-part-2.aspx" target="_blank"&gt;Part 2: Render/Export D3.js Chart as PNG Image using PhantomJS&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://developers.de/blogs/armin_kalajdzija/archive/2015/07/30/how-to-use-d3-js-for-server-side-chart-generation-in-net-part-3.aspx" target="_blank"&gt;Part 3: Creating a simple REST Service using ASP.NET Web API&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;First of all, we need a simple empty HTML Document that will be used later on as a Tamplate for our chart generation. It has do contain the D3.js logic for our Donut Chart and all other needed assets like CSS, Images etc.&lt;/p&gt;  &lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;height:360px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:400px;background-color:#f4f4f4;"&gt;   &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;     &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color:#800000;"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;html&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;meta&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;charset&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;body {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;  position: relative;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;  background-color: #FFF;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;}&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;svg {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    width: 100%;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;    height: 100%;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;}&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;text {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;    font-size: 15px;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    font-family: Arial;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;}&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;body&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;script&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;src&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://d3js.org/d3.v3.min.js&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;script&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;chart&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;body&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;As you can see, we have defined few CSS global styles for Body, SVG, and Texts and the most important thing, we have included the latest minified D3.js version from their CDN and added a wrapper DIV with &lt;strong&gt;id=”chart”&lt;/strong&gt; that will contain our generated chart.&lt;/p&gt;

&lt;p&gt;Now we should define our &lt;strong&gt;dataset&lt;/strong&gt; that we will be using for our chart generation:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:200px;background-color:#f4f4f4;"&gt;
  &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;
    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; data = [{ label: &lt;span style="color:#006080;"&gt;&amp;#39;Here&amp;#39;&lt;/span&gt;, value: 190000, color: &lt;span style="color:#006080;"&gt;&amp;quot;#1e398f&amp;quot;&lt;/span&gt; },&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;            { label: &lt;span style="color:#006080;"&gt;&amp;#39;Some&amp;#39;&lt;/span&gt;, value: 50000, color: &lt;span style="color:#006080;"&gt;&amp;quot;#f7a600&amp;quot;&lt;/span&gt; },&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;            { label: &lt;span style="color:#006080;"&gt;&amp;#39;Labels&amp;#39;&lt;/span&gt;, value: 420000, color: &lt;span style="color:#006080;"&gt;&amp;quot;#e17e62&amp;quot;&lt;/span&gt; },&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;            { label: &lt;span style="color:#006080;"&gt;&amp;#39;Needed&amp;#39;&lt;/span&gt;, value: 1530000, color: &lt;span style="color:#006080;"&gt;&amp;quot;#985181&amp;quot;&lt;/span&gt; }];&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;I strongly suggest that you put all properties you will need in the dataset, so you don’t have to change anything in this Template HTML when you start using it from your ASP.NET Web Application later in this series.&lt;/p&gt;

&lt;p&gt;Before we start implementing the chart logic, we should also put following variables that are needed for correct calculation of our donut:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:200px;background-color:#f4f4f4;"&gt;
  &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;
    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; svg_width = 600;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; svg_height = 400;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&lt;span style="color:#008000;"&gt;/* Radius of the Donut should be a third of defined space */&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; radius = Math.min(svg_width, svg_height) / 3;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Now we are all set to start writing the chart generation code! I will split it in two parts, first will be rendering of needed SVG and Layout elements and second will be rendering of our Donut slices. So first part should look like this:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;height:310px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:310px;background-color:#f4f4f4;"&gt;
  &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;
    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; svg = d3.select(&lt;span style="color:#006080;"&gt;&amp;quot;#chart&amp;quot;&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;        .attr(&lt;span style="color:#006080;"&gt;&amp;quot;style&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;width: &amp;quot;&lt;/span&gt; + svg_width + &lt;span style="color:#006080;"&gt;&amp;quot;px; height: &amp;quot;&lt;/span&gt; + svg_height + &lt;span style="color:#006080;"&gt;&amp;quot;px&amp;quot;&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;        .append(&lt;span style="color:#006080;"&gt;&amp;quot;svg&amp;quot;&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;        .append(&lt;span style="color:#006080;"&gt;&amp;quot;g&amp;quot;&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    svg.append(&lt;span style="color:#006080;"&gt;&amp;quot;g&amp;quot;&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;        .attr(&lt;span style="color:#006080;"&gt;&amp;quot;class&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;slices&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; pie = d3.layout.pie()&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    .sort(&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;    .value(&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(d) {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; d.value;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;    });&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; arc = d3.svg.arc()&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    .outerRadius(radius)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;    .innerRadius(radius * 0.5);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;svg.attr(&lt;span style="color:#006080;"&gt;&amp;quot;transform&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;translate(&amp;quot;&lt;/span&gt; + svg_width / 2 + &lt;span style="color:#006080;"&gt;&amp;quot;,&amp;quot;&lt;/span&gt; + svg_height / 2 + &lt;span style="color:#006080;"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;First we have extended our wrapper DIV with &lt;strong&gt;width&lt;/strong&gt; and &lt;strong&gt;height&lt;/strong&gt; styles, and appended a SVG element to it. In this SVG element we will render our Donut chart. Then we created a d3.js &lt;strong&gt;pie layout object&lt;/strong&gt; and assigned a &lt;strong&gt;value&lt;/strong&gt; property to return same named &lt;strong&gt;value&lt;/strong&gt; property from our dataset (return &lt;strong&gt;d.value&lt;/strong&gt;, where “&lt;strong&gt;d&lt;/strong&gt;” is always assigned dataset for given object).&lt;/p&gt;

&lt;p&gt;Next thing is to define an arc object with &lt;strong&gt;outerRadius&lt;/strong&gt; and &lt;strong&gt;innerRadius&lt;/strong&gt;. By defining the &lt;strong&gt;innerRadius&lt;/strong&gt; we have actually created a Donut chart out of Pie chart by creating that hole in the middle of Pie that is half of our radius. &lt;/p&gt;

&lt;p&gt;Last but not least, we want to position the chart in the middle of our wrapping div by calling the &lt;strong&gt;translate&lt;/strong&gt; function with half of &lt;strong&gt;svg_width&lt;/strong&gt; and &lt;strong&gt;svg_height&lt;/strong&gt; as x,y position parameters.&lt;/p&gt;

&lt;p&gt;Now, all we need to do is to generate the Donut/Pie slices in form of SVG Paths and interpolate it on our arc object that is already defined and centered in our wrapper DIV:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;height:350px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:350px;background-color:#f4f4f4;"&gt;
  &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;
    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&lt;span style="color:#008000;"&gt;/* Render Pie Slices */&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; slice = svg.select(&lt;span style="color:#006080;"&gt;&amp;quot;.slices&amp;quot;&lt;/span&gt;).selectAll(&lt;span style="color:#006080;"&gt;&amp;quot;path.slice&amp;quot;&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;    .data(pie(data));&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;slice.enter()&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    .insert(&lt;span style="color:#006080;"&gt;&amp;quot;path&amp;quot;&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;    .style(&lt;span style="color:#006080;"&gt;&amp;quot;fill&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(d) { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; d.data.color; });&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;slice        &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    .transition().duration(1000)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;    .attrTween(&lt;span style="color:#006080;"&gt;&amp;quot;d&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(d) {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;._current = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;._current || d;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;        &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; interpolate = d3.interpolate(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;._current, d);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;._current = interpolate(0);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(t) {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; arc(interpolate(t));&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;        };&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;    })&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;"&gt;slice.exit()&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;"&gt;    .remove();&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Here is where the whole “magic” happens, that is at least what I thought when I first started using D3.js!&amp;#160; In short words, we are assigning our dataset to a &lt;strong&gt;pie layout&lt;/strong&gt; object and that object again in our &lt;strong&gt;.selectAll&lt;/strong&gt; statement. 

  &lt;br /&gt;This &lt;strong&gt;.selectAll&lt;/strong&gt; statement can be somehow hard to understand at the beginning but you will get used to it. Now we are going throughout every &lt;strong&gt;dataset&lt;/strong&gt; entry and basically inserting a &lt;strong&gt;path&lt;/strong&gt; element into our SVG with &lt;strong&gt;fill&lt;/strong&gt; color value from our dataset property named &lt;strong&gt;color&lt;/strong&gt; and in next step we are interpolating it on our &lt;strong&gt;arc&lt;/strong&gt; element. &lt;/p&gt;

&lt;p&gt;At the end, we should be able to see our new Donut chart by opening the HTML file in any Browser and it should be looking like on this &lt;a href="http://developers.de/blogs/armin_kalajdzija/d3demos/donut.html" target="_blank"&gt;Preview Page&lt;/a&gt; here.&lt;/p&gt;

&lt;p&gt;In the next Part of this Series, I will be explaining how to Render/Export this SVG Chart as PNG Image file using PhantomJS.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://developers.de/aggbug.aspx?PostID=1462421" width="1" height="1"&gt;</description><category domain="http://developers.de/blogs/armin_kalajdzija/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://developers.de/blogs/armin_kalajdzija/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://developers.de/blogs/armin_kalajdzija/archive/tags/.Net/default.aspx">.Net</category><category domain="http://developers.de/blogs/armin_kalajdzija/archive/tags/D3.js/default.aspx">D3.js</category></item></channel></rss>