(二)Superset 1.3图表篇——Time-series Table

本系列文章基于Superset 1.3.0版本。1.3.0版本目前支持分布,趋势,地理等等类型共59张图表。本次1.3版本的更新图表有了一些新的变化,而之前也一直没有做过非常细致的图表教程。

而且目前可以参考的资料有限,大部分还需要自己探索。所以本系列文章将对这59张图表的使用做一个整理。

Superset的安装入门,以及数据集的准备,请参考之前的教程,1.3版本依然可用。有问题随时沟通~

本系列第二篇 Time-series Table。

也就是时间序列图表,这类图表还是比较不太常用。在1.3.0的例子中,也没有给出相关的例子。简单理解就是将时间序列图作为表中的一列。这对于部分趋势类图表的展示,还是非常的有意义的。

一、选择Time-series Table类型图表

首先,还是先选择新建Time-series Table类型图表。

由于使用时间序列,本次采用的新的数据集,新冠疫情数据。需要数据集的同学请后台回复 covid_test获取数据集csv。

二、Time-series Table图表设置

进入图表设置页面,这里会报一个错误

Controls

### Superset 中实现 Cross-filtering 功能的次开发 在 Apache Superset 中,通过自定义 JavaScript 和 Python 后端逻辑可以实现跨过滤(Cross-filtering)功能。此过程涉及前端和后端两部分的工作。 #### 前端修改 为了实现在不同图表之间共享筛选条件的功能,在前端需要监听特定事件并传播这些事件到其他组件。这通常涉及到对现有 React 组件树中的 `FilterBox` 或者任何用于输入筛选器值的小部件进行扩展[^1]: ```javascript // src/explore/components/controls/FiltersControl.jsx import React from &#39;react&#39;; import PropTypes from &#39;prop-types&#39;; class FiltersControl extends React.PureComponent { handleApplyFilters = () => { const { filters } = this.state; // 发布全局事件以便其他组件订阅 window.dispatchEvent( new CustomEvent(&#39;applyGlobalFilters&#39;, { detail: filters }) ); } render() { return ( <div> {/* 渲染过滤表单 */} <button onClick={this.handleApplyFilters}>应用</button> </div> ) } } export default FiltersControl; ``` 为了让其他可视化组件能够响应这个新的全局事件,可以在各个视图组件内添加相应的侦听器: ```javascript componentDidMount() { window.addEventListener(&#39;applyGlobalFilters&#39;, this.onGlobalFiltersApplied); } onGlobalFiltersApplied(event) { const appliedFilters = event.detail; // 更新当前组件的状态或者其他操作来反映新设置好的过滤参数 this.setState({ ... }); } ``` #### 后端支持 对于某些复杂场景下可能还需要调整服务器端 API 来处理来自客户端的新请求模式。例如当用户选择了多个维度作为联合查询条件时,则需确保 SQL 查询构建器能正确解析并执行多维联接查询[^2]: ```python from superset.connectors.sqla.models import SqlMetric, TableColumn from sqlalchemy.orm.session import Session as SASession def apply_cross_filters(query_obj, filter_values): """根据传入的交叉筛选条件动态修改SQLAlchemy ORM查询""" session: SASession for column_name, value_list in filter_values.items(): table_column: TableColumn = query_obj.datasource.get_column(column_name) if not table_column or not isinstance(value_list, list): continue # 构建IN子句 clause = table_column.column.in_(value_list) # 将条件附加到原始查询上 query_obj.having_criteria.append(clause) # 修改后的视图函数片段 @csrf.exempt @app.route(&#39;/api/v1/chart/<chart_id>/data&#39;) def get_chart_data(chart_id=None): ... cross_filter_params = request.args.getlist(&#39;crossFilters[]&#39;) try: parsed_filters = json.loads(cross_filter_params[0]) if cross_filter_params else {} apply_cross_filters(form.query_obj(), parsed_filters) except Exception as e: logging.error(f&#39;Failed to parse cross-filters params: {e}&#39;) abort(400, "Invalid cross-filters parameters") result = form.get_df() ... return jsonify({&#39;result&#39;: result}) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据流动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值