29 comments

[ 3.1 ms ] story [ 76.7 ms ] thread
We use d3 extensively here at TwoSides and love it.

Here's some examples: http://www.twosides.co/issues/185-should-euthanasia-or-physi... http://www.twosides.co/jono (the venn diagram/bar graph wouldn't be transparent if you had an account)

This is the best web UI I've seen in a long time, both in terms of functionality and beauty. Good luck.
Just curious, but do you support IE below 9? If so, how? svgweb?
Aww, thought this was for Diablo 3...
Don't be sad for the downvotes; they just don't get it.
Same here bro, same here :(
I have eyed d3 eagerly for a while and now we enjoy using it for our node knockout entry (http://rapminder.com/).

This tutorial comes in handy - thanks!

D3 is getting a lot of love lately! I like this tutorial as it nicely explains how to use events and animation. If you missed it, I wrote a D3 tutorial two weeks ago that shows how to do basic charting: http://www.recursion.org/d3-for-mere-mortals/
Thanks for writing it. I decided to start learning D3 last night and your tutorial was really helpful.
Very nicely written and had the right level of details to get me started. Awesome, thanks!
(comment deleted)
I might be missing something, since I just started learning it. But instead of drawing a circle like this

    sampleSVG.append("svg:circle")
        .style("stroke", "gray")
        .style("fill", "white")
        .attr("r", 40)
        .attr("cx", 50)
        .attr("cy", 50)
        .attr("width", 100)
        .attr("height", 100);
I'd prefer to express it like this

    sampleSVG.append("svg:circle")
        .style({
            "stroke": "gray",
            "fill": "white"})
        .attr({
            "r": 40,
            "cx": 50,
            "cy": 50,
            "width": 100,
            "height": 100});
That way, I can just pass object literals as arguments to functions such as attr.
Checkout this branch of d3:

https://github.com/mbostock/d3/commits/map https://github.com/mbostock/d3/pull/179

We're working on this syntax for: style, classed, property, on, attr, attrTween, style, styleTween. It's a more concise syntax, especially when the attrs are functions. An example from the tutorial:

  d3.select(this).selectAll("rect")    
        .data(function(d){return d;})       
        .enter().append("svg:rect")
        .attr("fill", "aliceblue")
        .attr("stroke", "steelblue")
        .attr("stroke-width", "1px")
        .attr("width", function(d, i){return (histoW/dataset[0].length)+"px"})
        .attr("height", function(d, i){return (d/dataMax[rectIdx]*histoH)+"px"})
        .attr("x", function(d, i){return i*(histoW/dataset[0].length)+"px"})
Becomes:

    d3.select(this).selectAll("rect")    
        .data(function(d){return d;})       
        .enter().append("svg:rect")
        .attr(function(d,i ) {
          return {
            "fill": "aliceblue",
            "stroke": "steelblue",
            "stroke-width": "1px",
            "width": (histoW/dataset[0].length)+"px",
            "height": (d/dataMax[rectIdx]*histoH)+"px",
            "x": i*(histoW/dataset[0].length)+"px"
          };
        });
Three anonymous functions become a single function which returns an object.
So it's like an incredibly verbose Raphaël?

http://raphaeljs.com

For making a circle, I thought the same thing.
Unlike Raphaël or its predecessor library Protovis (http://mbostock.github.com/protovis/), D3 uses SVG as the graphical representation.

This is more verbose, but is actually really powerful, because there's no translation between what your code is doing and what the browser is using to display your graphics. You can do anything SVG can do in your visualizations, and it is much easier to debug.

Raphaël uses SVG (and VML for IE browsers). Says so on the main page.
Yes, and so does Protovis. But you don't interface with SVG directly. To draw a circle in Raphaël, you use Raphaël.circle. In Protovis, you use pv.Dot.

To draw a circle in D3? svg:circle.

So both use SVG, you just use the SVG syntax. How is that an advantage? The whole point of libraries like that is not to abstract the presentation layer.

Raphaël can be switched to WebGL, for instance, and you won't even need to rewrite any code using that library, while you're stuck with the verbose low level calls to a particular implementation of SVG.

You're missing the point.

Raphaël is a simple, unified interface to SVG and VML. You ask for a circle, and it will make one, whether in SVG or VML.

But if you have an array of data and want to visualize it, you have to write the code that creates the circle (and its position, size, color, etc) for each point. And if that data changes, you have to write the code which adds circles, removes circles, or animates the update of existing circles with the new corresponding data.

D3 is a general library to help you write that code, but it assumes you are working with DOM objects. It will create/remove/update HTML, SVG, or VML elements -- whatever you want. D3 is not a renderer abstraction library like Raphaël; it is a data to DOM mapper.

You could make something like D3 for Raphaël, but it makes sense to just assume you have SVG support now. You get to use its groups, CSS, and standard DOM events, without reinventing those wheels.