A Quick and dirty Google Chart wrapper.
if 0 {
Google Chart API [http://code.google.com/apis/chart] Tcl wrapper.
[Scott Beasley] 2008-10-22
}
######################################################
# Simple package to generate Google charts from tcl.
#
# License: Do as you wish. No Warranty given.
#
# Scott Beasley 10-21-2008
######################################################
package provide googlecharts
package require autoproxy
namespace eval GoogleChart {
# See http://code.google.com/apis/chart/ for info
# on the Google chart api.
proc GChart {chart_hnd type {wid 250} {hgt 200}} {
upvar $chart_hnd chart_array
set chart_array(type) $type
set chart_array(width) $wid
set chart_array(height) $hgt
set chart_array(low) 0
set chart_array(high) 0
}
proc GChartSize {chart_hnd wid hgt} {
upvar $chart_hnd chart_array
set chart_array(width) $wid
set chart_array(height) $hgt
}
proc GChartRange {chart_hnd low high} {
upvar $chart_hnd chart_array
set chart_array(low) $low
set chart_array(high) $high
}
proc GChartType {chart_hnd type} {
upvar $chart_hnd chart_array
set chart_array(type) $type
}
proc GChartTitle {chart_hnd title {color "0000ff"} {size 12}} {
upvar $chart_hnd chart_array
regsub -all " " $title {+} title
set chart_array(title) $title
set chart_array(titlecolor) $color
set chart_array(titlesize) $size
}
proc GChartLegend {chart_hnd legend {side r}} {
upvar $chart_hnd chart_array
set chart_array(legend) $legend
set chart_array(legendside) $side
}
proc GChartAddDataSet {chart_hnd data} {
upvar $chart_hnd chart_array
if {[info exists chart_array(data)]} {
lappend chart_array(data) $data
} else {
set chart_array(data) $data
}
}
proc GChartLables {chart_hnd lables} {
upvar $chart_hnd chart_array
set chart_array(lables) $lables
}
proc GChartLableOrder {chart_hnd order} {
upvar $chart_hnd chart_array
set chart_array(lableorder) $order
}
proc GChartColors {chart_hnd colors} {
upvar $chart_hnd chart_array
set chart_array(colors) $colors
}
proc GChartPlotToURL {chart_hnd} {
upvar $chart_hnd chart_array
return [build_plot_URL chart_array]
}
proc GChartPlotToMemory {chart_hnd} {
upvar $chart_hnd chart_array
set url [build_plot_URL chart_array]
set toc [http::geturl $url]
set chart_graph [http::data $toc]
upvar $toc state
if {$state(type) ne {image/png}} {
http::cleanup $toc
return -code error {}
} else {
http::cleanup $toc
return $chart_graph
}
}
proc GChartPlotToChannel {chart_hnd chan} {
upvar $chart_hnd chart_array
set url [build_plot_URL chart_array]
set toc [http::geturl $url -channel $chan]
upvar $toc state
if {$state(type) ne {image/png}} {
http::cleanup $toc
return -code error 1
} else {
http::cleanup $toc
return 0
}
}
proc GChartPlotToFile {chart_hnd filename} {
upvar $chart_hnd chart_array
set url [build_plot_URL chart_array]
set fd [open $filename "w"]
fconfigure $fd -translation binary
set toc [http::geturl $url -channel $fd]
close $fd
upvar $toc state
if {$state(type) ne {image/png}} {
http::cleanup $toc
return -code error 1
} else {
http::cleanup $toc
return 0
}
}
proc build_plot_URL {chart_hnd} {
upvar $chart_hnd chart_array
set range {}
if {$chart_array(high) != 0} {
set range "&chds=$chart_array(low),$chart_array(high)&"
}
set UrlLineOut {}
append UrlLineOut {http://chart.apis.google.com/chart?} \
"cht=$chart_array(type)" $range
set lable_hdr {chxl=}
set data_hdr {chd=t:}
set colors_hdr {chco=}
set legend_hdr {}
set title_hdr {}
foreach data $chart_array(data) {
if {$data == {}} {
break
}
foreach data_entry $data {
append data_hdr $data_entry ","
}
append data_hdr "|"
}
set iLabeleSetCnt 0
foreach lables $chart_array(lables) {
append lable_hdr $iLabeleSetCnt ":|"
incr iLabeleSetCnt
foreach lable_text $lables {
append lable_hdr $lable_text "|"
}
}
foreach color $chart_array(colors) {
append colors_hdr $color ","
}
if {[info exists chart_array(title)]} {
set title_hdr "&chtt=$chart_array(title)&chts=$chart_array(titlecolor),$chart_array(titlesize)&"
}
if {[info exists chart_array(legend)]} {
set legend_hdr {&chdl=}
foreach legend $chart_array(legend) {
append legend_hdr $legend "|"
}
set legend_hdr [string trimright $legend_hdr "|"]
append legend_hdr "&chdlp=$chart_array(legendside)&"
}
set data_hdr [string trimright $data_hdr ",|"]
set colors_hdr [string trimright $colors_hdr ","]
append UrlLineOut $lable_hdr "&chs=$chart_array(width)" "x" \
"$chart_array(height)&chxt=$chart_array(lableorder)" \
"&$data_hdr&$colors_hdr$title_hdr$legend_hdr"
return $UrlLineOut
}
}
set IWANTTOTEST 1
if {$IWANTTOTEST == 1} {
#
# The autoproxy package is used to get at the http package.
# You will need to conect to your proxy before the charts
# can be generated. Not needed if you are JUST generating
# a URL for later use or if you are not behind a proxy server.
#
autoproxy::init
autoproxy::configure -basic -username joeuser -password joespasswd
#
# See the Google chart api site for more details on types etc...
#
#::GoogleChart::GChart my_chart "bvg"
::GoogleChart::GChart my_chart "p3"
::GoogleChart::GChartSize my_chart 250 150
::GoogleChart::GChartRange my_chart 0 100
::GoogleChart::GChartAddDataSet my_chart {{1 2 3 4 5}}
::GoogleChart::GChartLables my_chart {{Jan Feb Mar Apr May} {1 2 3 4 5}}
::GoogleChart::GChartLableOrder my_chart {x,y}
::GoogleChart::GChartColors my_chart "0000ff"
::GoogleChart::GChartTitle my_chart {Foo Bar} "ff0000" 20
::GoogleChart::GChartLegend my_chart {Jan Feb Mar Apr May} l
set fd [open "chart.png" "w"]
fconfigure $fd -translation binary
#puts -nonewline $fd [::GoogleChart::GChartPlotToMemory my_chart]
::GoogleChart::GChartPlotToChannel my_chart $fd
close $fd
puts [::GoogleChart::GChartPlotToURL my_chart]
}
Category Plotting