Google 开源了一个 Python 库,可用于创建 DataTable
对象以供可视化图表使用。此库可用于在 Python 中创建 DataTable
,并以以下三种格式之一输出:
- JSON 字符串 - 如果您托管的页面托管了使用您的数据的可视化图表,则可以生成 JSON 字符串以传入
DataTable
构造函数进行填充。 - JSON 响应 - 如果您不托管托管可视化图表的网页,而只是想充当外部可视化图表的数据源,则可以创建可响应数据请求的完整 JSON 响应字符串。
- JavaScript 字符串 - 您可以将数据表格输出为由多行 JavaScript 代码构成的字符串,此代码将使用您的 Python 表格中的数据填充并填充
google.visualization.DataTable
对象。然后,您可以在引擎中运行此 JavaScript,以生成并填充google.visualization.DataTable
对象。这通常仅用于调试。
本文档假定您了解基本的 Python 编程,并已阅读有关创建可视化图表和使用可视化图表的可视化文档。
内容
如何使用库
以下是基本步骤:
1. 创建 gviz_api.DataTable
对象
通过上述链接导入 gviz_api.py 库,并实例化 gviz_api.DataTable
类。该类接受两个参数:一个表架构,用于描述表中数据的格式,以及一些可选数据以填充表。您可以稍后根据需要添加数据,也可以完全覆盖数据,但不能移除个别行,也可以清除表架构。
2. 描述表架构
表架构由传递到构造函数的 table_description
参数指定。您之后无法对其进行更改。架构描述了表中的所有列:每列的数据类型、ID 和可选标签。
每个元组都由一个元组 (ID [,data_type [,label [,custom_properties]]]) 进行描述。
- ID - 用于标识列的字符串 ID。可以包含空格。 每列的 ID 必须是唯一的。
- data_type - [可选] 该列中的数据的 Python 数据类型的字符串描述符。您可以在 SingleValueToJS() 方法中找到支持的数据类型列表。例如“字符串”和“布尔值”。如果未指定,则默认为“字符串”。
- label - 列的名称,易于查看,可作为可视化图表的一部分显示。如果未指定,则使用 ID 值。
- custom_properties - 自定义列属性的 {String:String} 字典。
表架构是列描述符元组的集合。每个列表成员、字典键或字典值都必须是另一个集合或描述符元组。您可以使用字典或列表的任意组合,但每个键、值或成员最终必须评估为描述符元组。以下是一些示例。
- 列列表:[('a', 'number'), ('b', 'string')]
- 列表字典:{('a', 'number'): [('b', 'number'), ('c', 'string')]}
- 字典字典:{('a', 'number'): {'b': 'number', 'c': 'string'}}
- 以及任何级别的嵌套。
3. 填充数据
如需向表添加数据,请按照与表架构完全相同的结构构建数据元素的结构。例如,如果您的架构是列表,则数据必须为列表:
- schema: [("color", "string"), ("shape", "string")]
- 数据:[["blue", "square"], ["red", "Circle"]]
如果架构是字典,则数据必须是字典:
- schema:{("rowname", "string"): [("color", "string"), ("shape", "string")] }
- 数据:{"row1": ["blue", "square"], "row2": ["red", "Circle"]}
表中的一行是相应数据和架构的一部分。例如,以下是将两列列表的架构应用于两行数据的方式。
Schema:[(color),(shape)] / \ Data: [["blue", "square"], ["red", "circle"]] Table: Color Shape blue square red circle
请注意,字典键的计算结果为列数据。您可以在代码的 AttachData() 方法文档中找到更复杂的示例。允许这样复杂的嵌套是为了让您能够使用适合自己需求的 Python 数据结构。
4. 输出数据
最常见的输出格式为 JSON,因此您可能需要使用 ToJsonResponse()
函数来创建要返回的数据。但是,如果您要解析输入请求并支持不同的输出格式,则可以调用任何其他输出方法以返回其他格式,包括逗号分隔值、制表符分隔值和 JavaScript。JavaScript 通常仅用于调试。如需了解如何处理请求以获取首选响应格式,请参阅实现数据源。
用法示例
以下是一些示例,演示了如何使用各种输出格式。
ToJSon 和 ToJS 示例
#!/usr/bin/python import gviz_api page_template = """ <html> <script src="https://www.gstatic.com/charts/loader.js"></script> <script> google.charts.load('current', {packages:['table']}); google.charts.setOnLoadCallback(drawTable); function drawTable() { %(jscode)s var jscode_table = new google.visualization.Table(document.getElementById('table_div_jscode')); jscode_table.draw(jscode_data, {showRowNumber: true}); var json_table = new google.visualization.Table(document.getElementById('table_div_json')); var json_data = new google.visualization.DataTable(%(json)s, 0.6); json_table.draw(json_data, {showRowNumber: true}); } </script> <body> <H1>Table created using ToJSCode</H1> <div id="table_div_jscode"></div> <H1>Table created using ToJSon</H1> <div id="table_div_json"></div> </body> </html> """ def main(): # Creating the data description = {"name": ("string", "Name"), "salary": ("number", "Salary"), "full_time": ("boolean", "Full Time Employee")} data = [{"name": "Mike", "salary": (10000, "$10,000"), "full_time": True}, {"name": "Jim", "salary": (800, "$800"), "full_time": False}, {"name": "Alice", "salary": (12500, "$12,500"), "full_time": True}, {"name": "Bob", "salary": (7000, "$7,000"), "full_time": True}] # Loading it into gviz_api.DataTable data_table = gviz_api.DataTable(description) data_table.LoadData(data) # Create a JavaScript code string. jscode = data_table.ToJSCode("jscode_data", columns_order=("name", "salary", "full_time"), order_by="salary") # Create a JSON string. json = data_table.ToJSon(columns_order=("name", "salary", "full_time"), order_by="salary") # Put the JS code and JSON string into the template. print "Content-type: text/html" print print page_template % vars() if __name__ == '__main__': main()
ToJSonResponse 示例
JSonResponse 供远程客户端在数据请求中使用。
#!/usr/bin/python import gviz_api description = {"name": ("string", "Name"), "salary": ("number", "Salary"), "full_time": ("boolean", "Full Time Employee")} data = [{"name": "Mike", "salary": (10000, "$10,000"), "full_time": True}, {"name": "Jim", "salary": (800, "$800"), "full_time": False}, {"name": "Alice", "salary": (12500, "$12,500"), "full_time": True}, {"name": "Bob", "salary": (7000, "$7,000"), "full_time": True}] data_table = gviz_api.DataTable(description) data_table.LoadData(data) print "Content-type: text/plain" print print data_table.ToJSonResponse(columns_order=("name", "salary", "full_time"), order_by="salary")