原文:http://www.infoq.com/cn/articles/sharma-charts-in-rails
当分析完数据库中的数据,需要将结果以某种形式展示给用户的时候,有些Web应用程序比较偏好采用报告的形式。不过,图表的优点是能够根据报告,给出直观的视觉展现,并且可以帮助开发者观察趋势以及简化数据的综合分析过程。有很多技术能够帮助开发者构建出这类应用程序,Ruby on Rails就是其中之一。在本文中,我们将会详细介绍如何使用Ruby on Rails创建图表。
相关厂商内容
Martin Fowler演讲:21世纪的软件设计
Mary Poppendieck演讲:业务驱动的敏捷实施
8月31日前报名享受8折优惠,5人以上团购享有更多优惠
敏捷技术日之测试驱动开发9月4日北京举行,欢迎报名!
分享卓越软件研发管理实践(珠海 9.18-19)
相关赞助商
2010第五届敏捷中国大会四大主题:业务敏捷、技术实践、组织转型及管理实践,为技术团队搭建开放的交流平台。现在报名,8折优 惠!Powered by ThoughtWorks
优秀的软件能够从数据库中的数据或者报告中快速高效地生成图表。Gruff、JFreeChart、XML/SWF charts和FusionCharts是Ruby on Rails上为数不多能满足我们需求的软件。不过你得明白,并不是所有这些软件我们都试用和测试过,所以下面的信息大部分是取自产品文档。
Gruff JFreeChart XML/SWF FusionCharts免费版 FusionCharts v3 (商业版)
类型 Ruby类 Java Class文件 Flash图表组件 Flash图表组件 Flash图表组件
操作系统平台 平台独立 平台独立 平台独立 平台独立 平台独立
是否需要Adobe Flash插件 不是 不是 是 是 是
是否可用于高级数据分析 不可以 可以 可以 不可以 可以
是否需要安装软件或者其他插件 需要,需要安装RMagick,ImageMagick 和Gruff 需要,JDK 1.3版或更高 不需要 不需要 不需要
能否生成动态图表 不能 能 能 能 能
是否支持输出到图片 支持 支持 支持 不支持 支持
UTF8支持 文档未提及 是 是 是 是
易用性 易用,但是需要写很多代码 并不易用。对用户较友好 很复杂,太多用于配置图表的xml标记 非常易用,开发者和用户都可以轻易上手 非常易用,开发者和用户都可以轻易上手
2D/3D条形图支持 是 是 是 是 是
折线图支持 是 是 是 是 是
散点图支持 是 是 是 是 是
面状图支持 是 是 是 是 是
2D/3D饼图支持 是 是 是 是 是
2D/3D环状图支持 不 是,以环形图形式 是 是 是
甘特图支持 不 是 不 是 是(FusionWidgets v3的一部分)
混合图支持 不 是 是 是 是
仪表图支持 不 是(XML/SWF标准的一部分) 是 不 是(FusionWidgets v3的一部分)
实时图支持 不 不 不 不 是(FusionWidgets v3的一部分)
数据驱动地图 不 不 不 不 是(FusionWidgets v3的一部分)
本文中,我们将会研究如何使用FusionCharts和MySQL在Rails中绘制图表。FusionCharts是一个基于Flash的图表生成组件,它能够帮助开发者创建可交互的动态图表。同样,它也可以和任何一种Web脚本语言绑定,以最少的代码绘制出优秀的图表。不仅如此,FusionCharts甚至可以封装成模块并在RoR中使用。易于使用、多种图表类型支持、优秀的文档以及良好的支持是本文我们介绍FusionCharts的原因。
这篇文章以一个应用程序为例,描述了在RoR下FusionCharts生成图表的机制。这个应用完整运行所需要的软件有:
• FusionCharts 免费版/ v3:
FusionCharts免费版可以从www.fusioncharts.com/free下载。而功能更全面的商业版可以从www.fusioncharts.com上下载。在本文中,我们使用的是免费版。
FusionCharts的安装需要将安装包中的SWF和.rb文件拷贝到合适的位置。.rb文件是在Download Package > Code > RoR > Libraries目录下。
• Ruby 1.8.6或更高版本:
下载地址是http://www.rubyonrails.org/down
• Rails gem 2.0.2或更高版本:
在RubyGems加载之后,如果要完整安装Rails以及其依赖包,你可以输入如下命令:
gem install rails
Rails也可以从此页面下载。
• MySQL 4.0或者更高版本:
MySQL可以从此处下载。
这里我们以一个计时器为例。这个程序是为员工设计的,员工需要填写每周的上班时间,并且可以查看自己的工时表。本文将会从两个部分来讨论这个应用程序。第一个部分将处理开发上的问题,包括列举、编辑、展示和删除雇员以及工时表。如果你已经有一个需要集成图表的应用程序,你可以跳过这部分,然后直接进入下一个部分,下个部分将会阐述如何将图表和应用程序集成在一起。本文假设读者有基本的Ruby on Rails的知识。
创建基本的计时器程序
在脚手架框架(scaffolding framework)的帮助下,一些基本功能,例如列举、编辑、展示和删除雇员以及时间表,可以很简单地生成出来。生成基本的员工和时间表控制器的命令如下:(运行第一个命令后,在创建的TimeTrackerApplication目录下运行后面两个命令)
rails –d mysql TimeTrackerApplication
ruby script/generate scaffold Employee name:text
ruby script/generate scaffold Timesheet log_date:datetime hours_spent:integer employee_id:integer下一步,你需要修改config文件夹里面的database.yml,让其指向“timetrackerdb”,并且配置好用户名和密码。运行如下命令创建数据库:
rake db:create
rake db:migrate在mysql中运行如下命令,创建employees和timetables表的外键。
alter table timesheets add constraint fk_employee_id foreign key fk_employee_id(employee_id) references employees(id) on delete cascade 当然,创建外键的方法有多种;不过如果要深入下去,那么就超出了本文的讨论范围。你需要在模型之间创建关联才能够在Ruby on Rails中表示外键。
在Employee模型中,在类声明语句后,加入如下语句:
has_many :timesheets 而在Timesheet模型你需要加入:
belongs_to :employee 运行sql脚本db/sampledata.sql将样例数据插入到数据库中。至此,基本的程序和数据已经就绪,你可以增加、查看、编辑和删除雇员。
在应用程序中集成图表
当程序就绪之后,下面我将介绍如何生成一名员工的工作时间图表:
• 将FusionCharts文件夹(Download Package > Code > FusionCharts)拷贝到TimeTrackerApplication的public目录下。
• 将Download Package > Code > FusionCharts文件夹中的FusionCharts.js拷贝到public/javascripts文件夹下。
• 将Download Package > Code > RoR > Libraries文件夹中的fusioncharts_helper.rb拷贝到TimeTrackerApplication的lib目录下。
至此,FusionCharts的安装就已经完成了。
员工名单页中需要一个指向Time Tracker Chart的链接。这样,每个雇员都可以查看自己的工时图表。链接是在app/views/employees/index.html.erb文件中创建。列表1详细描述了链接创建的方法。这段代码是把这个链接加到此页面的其他链接之后。
列表1
<td><%= link_to 'Time Chart', {:action=>'view_timesheet_chart',:id=>employee.id} %></td>图1展示的是员工名单页面。在设置完数据库之后,开发者使用Ruby脚手架框架,可以很容易地实现这个功能。我们可以访问“http://yourserver:port/employees”来查看此页面。图1是屏幕部分截图。
图1
点击“Time Chart”链接将会调用employees控制器的view_timesheet_chart动作。列表2列出了它的代码。这个动作的作用是展示选中员工的工时表。它会向Employee模型查询指定员工在“2008-12-01”至“2008-12-07”这段时间的工时表,得到结果之后,渲染“view_timelog_chart.html.erb”文件。为了简单起见,在本文中,这个时间范围是固定的。当然,现实世界中,这个时间范围应该是可由员工指定。
列表2
EmployeesController
def view_timesheet_chart
start_date= "2008-12-01"
end_date="2008-12-07"
@employee_id = params[:id]
employee_details_with_timesheets = Employee.find_with_timesheets_in_date_range(@employee_id,start_date,end_date)
if(!employee_details_with_timesheets.nil?)
@employee_details_with_timesheets =employee_details_with_timesheets[0]
else
@employee_details_with_timesheets =nil;
end
headers["content-type"]="text/html"
end
这个动作以员工id为参数,它向Employee模型查询指定员工在特定时间范围内的工时表。我们将在Employee模型中加入如列表3所示的函数:
列表3
Employee.rb
def self.find_with_timesheets_in_date_range(id, start_date, end_date)
conditions="employees.id =? and log_date between ? and ?"
employee_details_with_timesheets=self.find(:all, :include=>'timesheets', :conditions=> [conditions,id,start_date,end_date],
rder=>'log_date asc')
return employee_details_with_timesheets
end最后,这个动作会渲染“view_time_chart.html.erb”文件。“view_time_chart.html.erb”模板使用的布局模板是“employee.html.erb”,所有employees控制器的视图都会采用这个布局模板。
列表4
view_timesheet_chart.html.erb (在app/views/employees文件夹中)
<%= javascript_include_tag "FusionCharts"%>
<%
#xml文件内容以字符串的形式从模板生成器中得到
str_xml = render "employees/timesheet_data"
#创建图表 - 3D柱状图,它的数据来自于strXML
render_chart '/FusionCharts/Column3D.swf' , '' , str_xml , 'TimeChart' , 650 , 400 , false , false do -%>
<% end -%> 从上面的代码,我们知道了如何在视图页面中渲染图表:
引入FusionCharts.js文件。
从生成器中获取xml数据.(生成器的数据来源是控制器)
使用合适的参数调用render_chart函数渲染图表,
通常情况下,图表会以甘特图的形式表示,当然FusionCharts也支持这种形式。在此,简单起见,我们使用了柱状图。
第二步和XML的生成有关。FusionCharts使用XML(扩展标记语言)创建和操作图表。整个FusionCharts图表都是由XML控制。例如,你可以使用XML定义图表的外观,也可以定义图表的功能。每种图表都有大量特性可供选择。FusionCharts也有自己的XML结构。现在讨论的图表是单系列图表(只有一个数据集),表示员工每周工作的天数和每天工作的时间。列表5是这个图表可以使用的一个XML例子。
列表5
单系列图表XML样例
<graph xAxisName="Day" showValues="1" caption="Time Tracker Chart" numberSuffix=" hrs." subcaption="For Employee John Wilson" yAxisName="Hours Spent">
<set name="Monday" value="8" color="AFD8F8"/>
<set name="Tuesday" value="6" color="F6BD0F"/>
<set name="Wednesday" value="5" color="8BBA00"/>
<set name="Thursday" value="9" color="A66EDD"/>
<set name="Friday" value="9" color="F984A1"/>
<set name="Saturday" value="8" color="CCCC00"/>
</graph>要用现有的数据生成和列表5类似的xml文件,那么就需要用到生成器。
生成器是如何生成图表XML的呢?它会用到控制器动作中的@employee_details_with_timesheets变量来构建出图表XML。列表6展示的是这个生成器的实现。
列表6
timesheet_data.builder (在app/views/employees文件夹中)
xml = Builder::XmlMarkup.new(:indent=>0)
options = {
:caption=>'Time Tracker Chart',
:subcaption=>'For Employee '+ @employee_details_with_timesheets.name ,
:yAxisName=>'Hours Spent',
AxisName=>'Day',
:showValues=>'1',
:formatNumberScale=>'0',
:numberSuffix=>' hrs.'
}
xml.graph(options) do
for timesheet in @employee_details_with_timesheets.timesheets do
log_day = timesheet.log_date.strftime('%a')
xml.set(
:name=>log_day,
:value=>timesheet.hours_spent,
:color=>''+get_FC_color)
end
end在生成器中,你首先要创建一个XMLMarkup对象,将其“indent”属性赋值为0,然后可以开始使用这个对象来构建XML了。
配置图表的所有选项都被放到了一个名为options的散列表中。如果希望了解更多options的信息,可以参考完整的FusionCharts文档。XML文件的root元素是“graph”,其子节点是“set”,一个“set”节点表示一个特定员工的工时表。每一个“set”元素都有name和value属性。name字段表示一周的第几天,而value字段表示的是在这一天中,当前员工的工作小时数。生成器使用控制器动作中的@employee_details_with_timesheets变量来存储这些值。
最后,在视图页中,render_chart函数将会渲染出图表。这个函数的参数是swf图表名称、url、width、height、debugMode和registerWithJS。它可以在lib文件夹的fusioncharts_helper模块中找到。正如列表7所示,引入application_helper.rb之后,就可以在所有的视图中使用这个函数。
列表7
application_helper.rb
require 'fusioncharts_helper'include FusionChartsHelper 展示图表的swf文件在public/FusionCharts文件夹中。这里我们已经使用了Column3D.swf这个文件名,但是也可以生成任意名字的其他任何单系列的图表。而且,数据不仅仅可以从dataXML方法得到,也可以从dataURL中获取。这种用法在FusionCharts的文档中有举例。
现在,在员工列表页面中点击一个员工的“Time Chart”链接,从01/12/2008到07/12/2008这一周的工作时间将会以图表的形式展现出来。就像图2一样。
图2
如何生成图表概述:
设置完FusionCharts,并且引入了application_helper.rb中的FusionChartsHelper之后,按照如下步骤生成图表:
控制器动作负责从数据库中寻找所需数据。
根据当前数据编写生成器。
在第一步提到的控制器动作所绑定的视图中,开发者有两种方式从生成器中取得XML,一种是直接将数据传递给生成器,或者让生成器从控制器动作中获取数据。
下一步,使用合理的参数(包括从第三步中得到的XML)调用render_chart函数。
通过一个计时器的讲解,你已经学到了如何在Ruby on Rails中使用FusionCharts创建简单的图表。而且,只要对这个程序进行简单的修改,你就能得到一个所有员工的工时图表。或者,你甚至可以深入下去,绘制出某个特定员工的详细工时表。当然,你也可以使用Ajax来获取图表。诸如此类的改进数不胜数。FusionCharts的下载包中就包含了很多值得深入研究的例子。本文讲解的应用程序可以从这里下载。
关于作者:
本文作者有着六年的IT咨询从业经验,并且对大量的Web技术感兴趣,包括J2EE栈、Ruby on Rails和PHP。
分享到:
相关推荐
在制作Fusion Charts报表时,我们需要构建一个符合Fusion Charts XML规范的文档,该文档包含图表的配置信息(如图表类型、标题、颜色等)以及数据项。 以下是一般步骤: 1. **初始化XML文档结构**:使用DOM4J的`...
Fusion charts 目前最新版本 v3.3.1. 下载下来后 直接覆盖 trail 版的 charts. 可以 打开 debug mode 看一下 版本号
10. **技术兼容**:Fusion Charts Free可以与各种前端框架如Angular、React、Vue等无缝集成,进一步提高开发效率。 通过Fusion Charts Free,开发者可以创建出引人入胜的、数据驱动的用户界面,不仅提升应用程序的...
2. 创建图表实例:使用Fusion Charts Helper类,你可以创建一个图表对象,指定图表类型(例如饼图、柱状图、线图等),并设置其基本属性,如宽高、背景色等。 3. 设置数据源:Fusion Charts支持XML和JSON格式的数据...
标题"Fusion Charts Demo"指的是一个使用FusionCharts技术的演示项目,这是一款强大的数据可视化工具,常用于创建交互式图表和图形。FusionCharts能够处理各种类型的数据,并将其转化为易于理解的、美观的图表,适用...
FusionCharts Free可以简洁地与用户进行交互,更重要的是,这基本上是一个完全免费的东西,使用它不会为自己带来太多困扰。... FusionCharts Free支持22种图表,而商用版FusionCharts v3可支持45种图表,不仅如此,...
**Fusion Charts与Backbone.js的整合** 在Web开发领域,数据可视化是不可或缺的一部分,而Fusion Charts是一款强大的JavaScript图表库,它提供了丰富的图表类型和高度定制化的能力,用于将复杂的数据转化为易于理解...
最初写这份文档,只是出于对FCF 的兴趣,也是为了给我的小站增加一点原创内容。后来发现越来越多的站转载这份教程,问题也就出来了。因为他们转载时并没有完整的转载,这样会给读者造成一些不便,于是我就想把它整理...
Axhub Charts Pro V2.1.1.rplib Axhub Charts Pro V2.1.1.rplib Axhub Charts Pro V2.1.1.rplib Axhub Charts Pro V2.1.1.rplib Axhub Charts Pro V2.1.1.rplib Axhub Charts Pro V2.1.1.rplib Axhub Charts Pro V...
6. **混合图(Combined Charts)**:将多种类型的图表组合在一个图形中,便于同时分析多个数据集。 7. **甘特图(Gantt Chart)**:专用于项目管理,展示任务的起止时间、进度和依赖关系。JFreeChart的甘特图可以...
在内网开发环境中,由于网络限制,通常难以访问到外部在线文档,这使得开发者在使用v-charts等依赖时面临困难。而这款离线文档解决了这一问题,使得开发者即使在没有互联网连接的情况下,也能便捷地查阅v-charts的...
LiveCharts 是一个流行的开源图表库,专为 .NET Framework 和 .NET Core 平台设计,用于在 WPF、UWP 和 WinForms 应用程序中创建动态、交互式的数据可视化图表。这个库允许开发者轻松地将各种图表类型,如柱状图、...
官方最新Fusioncharts 3.12.2,图表上无水印。支持最新的HTML5,跨平台。PCs, Macs, iPads, iPhones, Android devices, our JavaScript (HTML5) charts work everywhere. Heck, even on IE 6
`u-charts`是一个专门为uni-app设计的图表组件,它支持多种图表类型,如折线图、柱状图、饼图等,且具有良好的性能和可定制性。它的设计理念是简洁易用,让开发者可以快速地在项目中集成图表功能,无需过多的配置和...
此外,QtCharts还支持交互式功能,如缩放、平移、悬停显示数据点信息等。通过设置相应的交互模式,用户可以更直观地探索和理解图表数据。 最后,QtCharts的样式和主题也是其一大亮点。你可以自定义图表的颜色方案,...
FusionCharts的JavaScript类文件(通常位于下载包的"Charts"文件夹中)负责将SWF文件嵌入到HTML页面中,并处理与图表相关的JavaScript交互。这些类文件不仅用于初始化图表,还提供了丰富的API,允许开发者自定义...
LiveCharts.sln.DotSettings和Charts.sln.DotSettings文件则是Visual Studio的解决方案设置文件,用于存储用户界面布局、编译选项等个性化设置,这有助于开发环境的配置。 在项目中,nuget.exe是一个NuGet包管理器...