今天找到一个ChartDirector的非常不错的生成Chart图的库,它生成的结果是图片。它是使用C++开发的,同时支持多种语言的绑定,可以在象Python这样在的动态语言中使用。除了它,我还找到一个叫XML/SWF的Falsh的生成Chart图的东西,从名字可以看出,它是使用XML作为数据交换的格式。它与前者不同,通过SWF可以实现动态的图效果,还可以实时变化。不过考虑到它的体积和下载速度,我还是先考虑如何使用ChartDirector吧。下面是简单的使用方法。

一、安装

ChartDirector支持多种平台,我是在Windows下测试的。下载ChartDirector后,我没有发现有标准的安装程序,文档中的安排说明就是手工来做。于是我在Lib/site-packages下创建了一个chartdir的目录,然后将lib目录下的文件拷贝到这个目录下。再在site-packages目录下创建了名为chartdir.pth的文件,内容就一行:chartdir,它就是chartdir目录名。这样就可以方便地导入pychartdir库了。

二、测试

ChartDirector提供了一个chm格式的文档,写得非常详细,有许多的例子,还有生成的效果图。而且ChartDirector本身也带了许多的例子程序可以直接运行测试的。例子分为两种,一种是生成图形文件,另一种是在CGI下运行,输出字节流的。因此你可以简单地运行第一类的例子,直接生成图片看结果进行测试。很简单。

三、在Django中进行测试

在第二类的例子中,它为了生成二进制数据,代码如:

print "Content-type: image/png\n"
binaryPrint(c.makeChart2(PNG))

第一行是输出结果的Content-type,第二行是输出二进制的结果。在文档上说明,print会对回车进行转换,并且输出多余的回车。不过这是在传统的CGI方式下才有的,在Django下,提供了HttpResponse可以很好的处理MIME类型和二进制数据,如:

return HttpResponse(c.makeChart2(PNG), ‘image/png’)

同时要注意,这里的makeChart2后面有个2,而且参数是输出图片的格式,与直接生成文件的方法不一样。那么View方法只要最后象上面就行了。其它的代码可以直接从例子中拷贝就行了。

四、中文处理

中文是非常重要的一点。而ChartDirector很好的支持了unicode,你可以使用utf-8编码的程序,在程序前加上:#coding=utf-8,并且保存程序为utf-8编码。有些方法提供对字体的设置,如addTitle(‘中文’, ’simsun.ttc’, 15),第二个参数就是字体文件(simsun.ttc就是宋体字体的文件名),它不使用字体名称。那么如果你想整个字体都为中文字体的话,可以使用:setDefaultFonts(’simsun.ttc’),这样整个图都使用宋体了。

五、版权

这个库本身是有版权的,但你可以在不交钱的情况下使用,不过对于无版权的使用,它会自动在图形底部生成一个黄色的信息条。如果你感得它有用,可以考虑注册,如果象我一样还不想花钱,那么有就有吧。


10条评论

  1. 真能找啊。

  2. 刚刚下的,1.2.1有一个exe,但这个1.2.2就不会了,多谢

  3. 没有exe的,就要自已去编译了,我没编译过。

  4. limodu你好, 我用ChartDirector画图, 在我的系统上按照你的方法

    setDefaultFonts(’simsun.ttc’)

    依然无法显示中文。

    是不是因为我的系统english xp的缘故呢?

    有无什么解决方法啊?

  5. simsun.ttc是安装到windows系统中的一款宋体字体,不知道你有没有。你可以试着改一下其它的英文字体试一试。在ChartDirector的文档中有说明。

  6. 请问一下

    我是在freebsd下面使用的,那么应该把simsun.ttc放到哪个目录呢?我尝试了多次无法正确显示中文

  7. 应该可以访问到就行了,使用绝对路径?我只在windows下试过,建议你看一下文档看是否有说明。

  8. 恩,查了下文档,果然是路径放错了,现在已经解决了。

  9. limodou,

    可否指导一下在web2py中如何使用ChartDirector直接生成图形在浏览器上。生成静态方法然后用img标签链接过去我们已经成功。但是类似上文中Django里直接output到浏览器却一直不知怎么做。

  10. 我与Massimo联系了一下,他给出了办法。贴在这里给大家参考吧。

    you just do

    return c.makeChart2(PNG)

    The content type is set automatically if you call the action with the extension

    with http://…./app/controller/function.png

    Or you can set it manually

    response.headers['Content-Type']=’image/png’

发表评论

评论也有版权!

click to change验证码