1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
# = Bubble charts
# Bubble charts, such as those provided by "Many Eyes":http://manyeyes.alphaworks.ibm.com/manyeyes/page/Bubble_Chart.html, encode data in the area of circles. Although less perceptually accurate than bar charts, they can pack hundreds of values into a small space. A similar technique is the Dorling cartogram, where circles are positioned according to geography rather than arbitrarily. Here we compare the file sizes of the Rubyvis library files
$:.unshift(File.dirname(__FILE__)+"/../../lib")
require 'rubyvis'
def get_files(path)
h={}
Dir.glob("#{path}/*").each {|e|
next if File.expand_path(e)=~/pkg|web|vendor|doc|~/
pa=File.expand_path(e)
if File.stat(pa).directory?
h[File.basename(pa)]=get_files(pa)
else
h[File.basename(pa)]=File.stat(pa).size
end
}
h
end
files=get_files(File.expand_path(File.dirname(__FILE__)+"/../../lib/"))
classes = Rubyvis.nodes(Rubyvis.flatten(files).leaf(lambda {|v| v.is_a? Numeric}).array)
classes[1,classes.size-1].each {|d|
#p d.node_value.keys
d.node_name = "/" + d.node_value[:keys].join("/")
i = d.node_name.rindex("/")
class << d
attr_accessor :class_name, :package_name
end
d.class_name = d.node_name[i+1,d.node_name.size-(i+1)].gsub(".rb","")
d.package_name = d.node_name[0,i]
d.node_value = d.node_value[:value]
}
# For pretty number formatting.
format = Rubyvis.Format.number
vis = Rubyvis::Panel.new.
width(600)
.height(600)
c20=Rubyvis::Colors.category20()
vis.add(pv.Layout.Pack)
.top(-50)
.bottom(-50)
.nodes(classes)
.size(lambda {|d| d.node_value})
.spacing(0)
.order(nil)
.node.add(Rubyvis::Dot)
.fill_style(lambda {|d| c20.scale(d.package_name)})
.stroke_style(lambda {|d| c20.scale(d.package_name).darker})
.visible(lambda {|d| d.parent_node})
.title(lambda {|d| d.node_name + ": " + format.format(d.node_value)})
.anchor("center").add(pv.Label)
.text(lambda {|d| d.class_name[0, Math.sqrt(d.node_value).to_i / 8]})
vis.render();
puts vis.to_svg
|