Superset自定义图表开发

Supserset

Superset作为一个开源的BI系统,具有一套完整的BI可视化实现流程。实现的步骤大致可以分为以下几步:

1. 首先,连接用于bi分析的数据库;

2. 根据数据表或SQL Lab查询生成数据集;

3. 由数据集创建对应类型图表;

4. 将创建好的图表添加到BI可视化看板中。


Superset自带的图表类型相当完善,包括卡片,柱状,折线,面积,扇形,散点......,能够实现客户的基本需求,一般来说根据上述步骤就可以完成一份看起来还不错的bi看板。

Superset个性化

但若是客户对于bi看板的布局样式有一定的需求,那么就可能需要Superset图表的开发需求。

1. 看板样式

在创建的一份bi看板时,通常会使用的Superset默认的样式,我们可以在CSS选择中使用css模板,在css模板中的样式可以影响到看板的基本样式和布局。

2. 图表样式

通常Superset中的基础图表中的样式是固定的,不轻易修改,即使是十分基础的样式,例如,如果需要修改字体的颜色和大小,也无法实现。因此,如果希望图表能够实现一些个性化的需求,需要自定义图表,接下来是对自定义图表开发的讲解。


Superset自定义图表开发

在Superset中,图表作为可视化插件注册到可视化工具中,因此创建自定义图表也就是Superset插件的开发。和其他的开发一样,先了解代码的结构。

进入Superset项目

superset 项目目录

- superset 后端代码文件夹

- superset-frontend 前端代码文件夹

​- plugins superset插件文件夹

​- plugin-chart-echarts echart 图表类型文件夹

​...

...

可以看到所有的图表都是放到了plugins文件夹中,并且能够根据目录看出Superset使用了开源的图表库echart,并把基于echart生成的图表放到一个文件夹下。这里使用Pie图表作为例子讲解。还是先了解代码结构:

Pie

- images 存放图片目录

- buildQuery.ts 用于构建数据库查询对象,返回构建查询上下文

- controlPanel.tsx 用于创建控制面板

- EchartsPie.tsx 返回视图

- index.ts 定义图表

- transformProps.ts 用于返回props

- types.ts 定义数据结构

首先了解数据结构,需要了解结构包括:

QueryFormData 存储查询的基础数据,可以根据控制面板返回的数据对其进行扩展

BaseChartProps 

部分属性:

​height 图表高度

​width 图表宽度

​formData 返回控制面板数据,也是请求有效载荷

​queriesData 返回数据响应数据

BaseTransformedProps 传递给EchartsPie的数据。

ControlPanelConfig 用于生成控制面板

我们在创建图表时,可以扩展这些数据结构来获取图表所需要的数据。


controlPanel.tsx

const config: ControlPanelConfig = {
controlPanelSections: [
{
label: t('Query'),
expanded: true,
controlSetRows: [
['groupby'],
['metric'],
['adhoc_filters'],
['row_limit'],
[
{
name: 'sort_by_metric',
config: {
...sharedControls.sort_by_metric,
default: true,
},
},
],
],
},
...

主要配置controlPanelSections

controlPanelSetions数组中每个对象相当于控制面板中的一组配置,controlSetRows数组中的每一个元素相当于控制面板中的一列。

groupby,metric, adhoc_filters, row_limit是Superset中原始的控件,我们也可以自定一个空间,只需要按照固定的格式写好数据就可以

{
name: 'show_labels_threshold', // 控件名称
config: {
type: 'TextControl', // 控件的类型
label: t('Percentage threshold'), // 控件的Label
renderTrigger: true,
isFloat: true,
default: 5, // 默认参数
description: t(
'Minimum threshold in percentage points for showing labels.',
),
},
},

我们主要关注type字段,Superset中定义了很多的控件类型

  • TextControl
  • SelectControl
  • CheckboxControl
  • SliderControl
  • DndColumnSelect
  • ...

但是最常见的还是提到的这几种控件类型


buildQuery.ts

export default function buildQuery(formData: QueryFormData) {
const { metric, sort_by_metric } = formData;
return buildQueryContext(formData, baseQueryObject => [
{
...baseQueryObject,
...(sort_by_metric && { orderby: [[metric, false]] }),
},
]);
}

buildQuery获取控制面板传递过来的参数,根据查询columns,分组,过滤,排序等信息查询数据。

transformProps.ts

transformProps的工作是负责转换查询的数据信息,并返回视图真正需要的数据,视图在接收到props之后,可以直接使用数据。


EchartsPie.tsx

export default function EchartsPie(props: PieChartTransformedProps) {
const { height, width, echartOptions, selectedValues, refs } = props;

const eventHandlers = allEventHandlers(props);

return (
<Echart
refs={refs}
height={height}
width={width}
echartOptions={echartOptions}
eventHandlers={eventHandlers}
selectedValues={selectedValues}
/>
);
}

返回一个元素由React进行渲染生成视图,这个元素可以进行嵌套。


index.ts

在index中,构建了图表,在构建中包含的信息包括

{
buildQuery,
controlPanel,
transformProps,
loadChart,
metadata // 主要用于初始图表的基本信息,如图表图标,类型,介绍等等

}

将定义好的组件都配置好之后,图表开发也完成了。

最后将创建好的插件集成到 superset-frontend/src/visualizations/presets/MainPreset.js

new EchartsPieChartPlugin().configure({ key: VizType.Pie }),

这样就完成了Pie图表的创建。


AI/BI
黄晓锋 2025年2月14日
分析这篇文章

存档
登录 留下评论
查询数据库数据生成指标图表