论坛首页 编程语言技术论坛

让google来为rails画图表

浏览 16992 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-07-26  

      去年年底的时候,所做的一个rails项目涉及到图表功能,主要有显示投票结果(柱状图)、网上办事统计结果(饼状图)、已办事件按月统计结果(线状图)……,当时可真是一件很麻烦的事情,开始准备搬flex来做,结果考虑到开发成本等等原因没采用,后来是自己写js,做了好一段时间,结果在跨平台上效果却不是很理想。当时真是苦煞我也,心想要是请几个专职的google专家来帮我做成和google一样的效果多好啊,巧合的是Google于去年晚些时候悄然推出了新图表API。Google图表最初是作为视频和财经服务的一项中间项目,后来Google决定将其公诸于世。Google始终如一地向大家提供如此优雅和高效的解决方案来处理通用问题,当然Google图表也不例外。

      那么是Google图表是如何为我们服务的呢?主要通过简单地发送一条URL来生成图表,调用者的主要工作是构建这些URL,该URL最主要有以下三个参数:图表的类型、图表的大小和图表的数据。图表的类型由“cht”参数指定。图表大小用chs指定,包括图表的长和宽,用整数来表示。图表数据用chd表示,Google提供了四种不同的数据编码方式,最简单的就是文本编码。通过给数据添加“t:”前缀。比如 http://chart.apis.google.com/chart?cht=lc&chs=100x50&chd=t:25,75,50 就是一条完整的图表服务路径,更完整的图表API可以参考 http://code.google.com/apis/chart/

      那么接下来我们就是去构建这些URL,这里仍存在2个问题:

1 构建这样的URL需要大量的字符串拼接操作,较为繁琐,对于比较数据量比较大的图表,构建这样的URL就很麻烦。

2 构建这样的URL其实很多地方是重复的,只是少数的参数不一样,对于有大量图表显示的系统来说要做很多重复性的工作。

幸运的是,我们不必重复发明轮子了,DEEpak Jois已经封装了该API,他的gem叫做gchartrb,提供一个整洁简明的方式来生成图表URL。使用该gem的第一步是安装它:gem install gchartrb。 使用起来超乎想象的简单,效果也非常的炫,不信?看看我做的一些demo吧:)

 

场景一 venn图 例如:A有500个元素,B有400个元素,C有300个元素,AB交集为200,AC交集为100, BC交集为50通过以上的数据得到代表变量A,B,C的三个圆圈,圆圈的面积代表变量所含元素个数,圆圈的交集代表变量之间的交集。

 

require 'rubygems'
require 'google_chart'
def venn_diagram
    GoogleChart::VennDiagram.new("400x400", 'Venn Diagram') do |vd|
      vd.data "Blue", 500,'0000ff'
      vd.data "Green", 400, '00ff00'
      vd.data "Red", 300, 'ff0000'
      vd.intersections 200, 100, 50
      @chart = vd.to_url
    end
end
<%= image_tag @chart %> 

 

 

场景二 柱状图 例如JE会员分布图,beijing 20000人, shanghai 18000人,tianjin 10000人,nanjing 8000 ,guangzhou 14000,shenzhen 16000

 

 def bar_chart
    GoogleChart::BarChart.new('800x200', "Bar Chart", :vertical, false) do |bc|
      bc.data "beijing", [20000], '0000ff'
      bc.data "shanghai", [18000], 'ff0000'
      bc.data "tianjin", [10000], '00ff00'
      bc.data "nanjing", [8000], '00aaff'
      bc.data "guangzhou", [16000], '0effee'
      bc.data "shenzhen", [14000], 'eeff00'
      @chart = bc.to_url
    end
  end
<%= image_tag @chart %> 

 

场景三 饼状图 例如JE文章投票人数统计,very good 200票, good 150票,just so so100票,bad 180票

 

def pie_chart
    GoogleChart::PieChart.new('320x200', "Pie Chart",false) do |pc|
      pc.data "very good", 300
      pc.data "good", 200
      pc.data "just so so", 100
      pc.data "bad", 180
      pc.show_labels = true
      @chart = pc.to_url
    end
end
<%= image_tag @chart %> 

  

 场景四 折线图 例如统计每周JE会员增加数量,一周的数量分别是 56 48 68 59 66 67 59

 

GoogleChart::LineChart.new('320x200', "Line XY Chart", true) do |lcxy|
      lcxy.data "amount", [[1,56], [2,48], [3,68], [4,59], [5,66], [6,67], [7,59]], '0000ff'
      @chart = lcxy.to_url
end
<%= image_tag @chart %> 

 

 

当然图表中的数据源在实际应用是应该来自于数据库的!

   发表时间:2008-07-27  
已经用过了,中文也能很好地支持,不错的东东,不过要联网哦,如果有单独的API包就好了。
0 请登录后投票
   发表时间:2008-07-28  
中文支持得不行。

中文GBK编码下不能正常显示,中文UTF-8编码下,字符数计算得不对,只能显示部分文字。
0 请登录后投票
   发表时间:2008-07-28  
用Iconv.conv()转化下
0 请登录后投票
   发表时间:2008-07-29  
有个问题哦 要一直联网 对了 javaeye的新闻贴有一个极其强悍的10个最有用的webchart图 另外.NET有silverlight 还有OPENFLASHCHART
0 请登录后投票
   发表时间:2008-07-29  
中文支持很好啊,我没遇到出不来的文字。
当然我是用的google_chart。
0 请登录后投票
   发表时间:2008-08-01  
right now 写道
用Iconv.conv()转化下


你试过了?怎么用?
0 请登录后投票
   发表时间:2008-08-01  
robertpi 写道
中文支持很好啊,我没遇到出不来的文字。
当然我是用的google_chart。


什么环境?示例是?
0 请登录后投票
   发表时间:2008-08-01  
鼠标移上去的时候有没有相应的值提示?
0 请登录后投票
   发表时间:2008-08-06  
liuqiang 写道

      去年年底的时候,所做的一个rails项目涉及到图表功能,主要有显示投票结果(柱状图)、网上办事统计结果(饼状图)、已办事件按月统计结果(线状图)……,当时可真是一件很麻烦的事情,开始准备搬flex来做,结果考虑到开发成本等等原因没采用,后来是自己写js,做了好一段时间,结果在跨平台上效果却不是很理想。当时真是苦煞我也,心想要是请几个专职的google专家来帮我做成和google一样的效果多好啊,巧合的是Google于去年晚些时候悄然推出了新图表API。Google图表最初是作为视频和财经服务的一项中间项目,后来Google决定将其公诸于世。Google始终如一地向大家提供如此优雅和高效的解决方案来处理通用问题,当然Google图表也不例外。

      那么是Google图表是如何为我们服务的呢?主要通过简单地发送一条URL来生成图表,调用者的主要工作是构建这些URL,该URL最主要有以下三个参数:图表的类型、图表的大小和图表的数据。图表的类型由“cht”参数指定。图表大小用chs指定,包括图表的长和宽,用整数来表示。图表数据用chd表示,Google提供了四种不同的数据编码方式,最简单的就是文本编码。通过给数据添加“t:”前缀。比如 http://chart.apis.google.com/chart?cht=lc&chs=100x50&chd=t:25,75,50 就是一条完整的图表服务路径,更完整的图表API可以参考 http://code.google.com/apis/chart/

      那么接下来我们就是去构建这些URL,这里仍存在2个问题:

1 构建这样的URL需要大量的字符串拼接操作,较为繁琐,对于比较数据量比较大的图表,构建这样的URL就很麻烦。

2 构建这样的URL其实很多地方是重复的,只是少数的参数不一样,对于有大量图表显示的系统来说要做很多重复性的工作。

幸运的是,我们不必重复发明轮子了,DEEpak Jois已经封装了该API,他的gem叫做gchartrb,提供一个整洁简明的方式来生成图表URL。使用该gem的第一步是安装它:gem install gchartrb。 使用起来超乎想象的简单,效果也非常的炫,不信?看看我做的一些demo吧:)

 

场景一 venn图 例如:A有500个元素,B有400个元素,C有300个元素,AB交集为200,AC交集为100, BC交集为50通过以上的数据得到代表变量A,B,C的三个圆圈,圆圈的面积代表变量所含元素个数,圆圈的交集代表变量之间的交集。

 

require 'rubygems'
require 'google_chart'
def venn_diagram
    GoogleChart::VennDiagram.new("400x400", 'Venn Diagram') do |vd|
      vd.data "Blue", 500,'0000ff'
      vd.data "Green", 400, '00ff00'
      vd.data "Red", 300, 'ff0000'
      vd.intersections 200, 100, 50
      @chart = vd.to_url
    end
end
<%= image_tag @chart %> 

 

 

场景二 柱状图 例如JE会员分布图,beijing 20000人, shanghai 18000人,tianjin 10000人,nanjing 8000 ,guangzhou 14000,shenzhen 16000

 

 def bar_chart
    GoogleChart::BarChart.new('800x200', "Bar Chart", :vertical, false) do |bc|
      bc.data "beijing", [20000], '0000ff'
      bc.data "shanghai", [18000], 'ff0000'
      bc.data "tianjin", [10000], '00ff00'
      bc.data "nanjing", [8000], '00aaff'
      bc.data "guangzhou", [16000], '0effee'
      bc.data "shenzhen", [14000], 'eeff00'
      @chart = bc.to_url
    end
  end
<%= image_tag @chart %> 

 

场景三 饼状图 例如JE文章投票人数统计,very good 200票, good 150票,just so so100票,bad 180票

 

def pie_chart
    GoogleChart::PieChart.new('320x200', "Pie Chart",false) do |pc|
      pc.data "very good", 300
      pc.data "good", 200
      pc.data "just so so", 100
      pc.data "bad", 180
      pc.show_labels = true
      @chart = pc.to_url
    end
end
<%= image_tag @chart %> 

 

 场景四 折线图 例如统计每周JE会员增加数量,一周的数量分别是 56 48 68 59 66 67 59

 

GoogleChart::LineChart.new('320x200', "Line XY Chart", true) do |lcxy|
      lcxy.data "amount", [[1,56], [2,48], [3,68], [4,59], [5,66], [6,67], [7,59]], '0000ff'
      @chart = lcxy.to_url
end
<%= image_tag @chart %> 

 

 

当然图表中的数据源在实际应用是应该来自于数据库的!

 

0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics