跳转到主要内容

一个用于使用matplotlib创建服务器端图表/图形的软件包;还提供了通过Django直接提供这些图表的示例。

项目描述

作为一名开发者,在您的网站/服务上显示数据图表和图形的需求,提供了两种主要的选择:服务器端或客户端/浏览器端。

  • 服务器端图表生成的优势包括:在所有浏览器上显示的一致性(即使是IE也能处理显示图片),以及在浏览器之外重用图表图片,例如在生成PDF文档时。

  • 客户端/浏览器端图表生成的优势包括:交互性(如果需要),或者更动态的行为,例如用户的新输入立即更新的图表。

如果您需要Python服务器端图表生成,webplotlib可以为您提供一个方便且模块化的软件包/API。它是GPL许可的。

安装

注意:尽管我为Django环境编写了此软件包,但它可以很容易地在Django之外使用。有关更多详细信息,请参阅下文。

webplotlib有以下直接依赖项

  1. Numpy,matplotlib也依赖于它。您可以在全局范围内安装(例如,sudo pip install numpy)或仅对相关虚拟env安装。为了其全部功能,您需要安装系统依赖项(如Fortran),例如在Ubuntu上,需要安装libatlas-base-dev、gfortran、gcc、g++等软件包。

  2. Matplotlib - 您可以通过操作系统包管理系统(可能太旧了)、PyPI或从源代码获取。最新版本1.0.1在PyPI上,但pip目前拉取了错误的版本(截至2011年5月;这不是pip的错误,请参阅这个Stack Overflow讨论),除非您执行以下操作:pip install -f http://downloads.sourceforge.net/project/matplotlib/matplotlib/matplotlib-1.0.1/matplotlib-1.0.1.tar.gz matplotlib。您也可以将其全局或本地安装到虚拟环境中。请注意,Matplotlib有多个系统依赖项,具体取决于使用情况:例如,在Ubuntu服务器上使用时,请安装以下软件包:python、python-dev、libpng12-dev、libfreetype6-dev。

  3. py.test,如果您想运行单元测试。

在安装了依赖项(并在相关虚拟环境中)后,使用以下命令从PyPI安装webplotlib:

pip install webplotlib

或者您也可以通过GitHub从源代码安装。

用法

虽然我编写webplotlib是为了与Django项目一起使用,但目前没有直接依赖Django,因此您可以将webplotlib视为任何其他Python包并直接调用它。例如

from webplotlib.chart_builders import create_chart_as_png_str


# When you have at least one sequence (list, tuple, iterable)
# of data, you can plot it:
chart_png_str = create_chart_as_png_str(
    'timeseries',
    {'data': [[your_data_sequence]], 'names': 'MyDataLine'},
    labels_dct={'title': 'TheBigBoard', 'x': 'Data', 'y': 'Value'})
# Save chart_png_str, etc.

更多使用示例可以在test_chart_builders.py模块中找到。

Django集成:我在网上找到了一些令人困惑和不一致的Matplotlib与Django集成的示例,因此我在自己的项目上做了一些实验。您可以在webplotlib的views.py文件中看到一些示例,它展示了如何直接以字符串形式服务/返回服务器端生成的PNG图表,这在您想快速修改图表样式时非常有用。

因此,要在Django中使用webplotlib,请更新您的Django项目settings.py中的INSTALLED_APPS以包含‘webplotlib’,并更新您的项目urls.py文件(目前models.py中没有内容)如下所示:

urlpatterns = patterns('',
    ...
    (r'^wpl/', include('webplotlib.urls')),
    ...
    )

此外,考虑使用我的应用程序django-metaimage与webplotlib一起使用,该应用程序可以轻松处理创建新图像并将其保存到有用的Django ORM模型实例/表示中。

测试

可以使用Tox或py.test运行基本单元测试。

历史 + 设计

webplotlib依赖于Matplotlib - 可用最强大和最受欢迎的Python图表包 - 用于实际的图表生成。但我在2011年春季发现,缺乏在Web环境中使用Matplotlib的良好抽象示例,以及使用其非交互式、面向对象、面向程序员的接口的示例(相比之下,有大量的示例用于交互式用户驱动的图表创建,模拟MATLAB)。因此,需要编写一个新应用程序,可以快速用于生成服务器端图表。

我需要一个方法,通过单个函数调用生成Matplotlib图表(最初是时间序列和条形图),然后返回原始图表数据/图像作为字符串 - 从那里可以轻松保存它、进一步处理它(例如添加水印)或通过HTTP返回它等。在研究了大量在线示例和文档、进行实验和重构后,出现了webplotlib。最初它支持时间序列和条形图,接受序列并返回美观的PNG图像字符串,您可以立即使用。还将有更多的抽象(例如分别定义图表模板)和改进,但这个版本现在可以使用。

替代方案:为什么不使用Flash库?它不是开源的,具有与JavaScript库相同的限制。为什么不使用JavaScript库?在查看了一堆客户端库(Grafico、Highcharts、flot、Google图表工具、dygraphs、Raphaël)之后,我认为Protovis是它——统治它们的工具。但是在理解他们的文档和示例之后,我发现显示不一致:简单的图表在Firefox 3/4中看起来很好,但在Chrome中没有刻度和标签,这是不可接受的。而且我甚至懒得看IE的渲染效果,那里可能更多痛苦。此外,我的需求也变了;我需要在报告中使用图表,因此图表作为图像在不同媒介上保持一致是必不可少的。所以服务器端生成是唯一的选择,而用Python,你会发现Matplotlib没有真正的竞争对手。

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面