Superset项目柱状图来自Echarts
首先Echarts实现柱状图数据缩放初始化默认值的效果
核心代码
设置Datazoom 的start 和end
myChart.showLoading();
$.get(ROOT_PATH + '/data/asset/data/obama_budget_proposal_2012.list.json',function (obama_budget_2012) {myChart.hideLoading();option = {tooltip: {trigger: 'axis',axisPointer: {type: 'shadow',label: {show: true}}},toolbox: {show: true,feature: {mark: { show: true },dataView: { show: true, readOnly: false },magicType: { show: true, type: ['line', 'bar'] },restore: { show: true },saveAsImage: { show: true }}},calculable: true,legend: {data: ['Growth', 'Budget 2011', 'Budget 2012'],itemGap: 5},grid: {top: '12%',left: '1%',right: '10%',containLabel: true},xAxis: [{type: 'category',data: obama_budget_2012.names}],yAxis: [{type: 'value',name: 'Budget (million USD)',axisLabel: {formatter: function (a) {a = +a;return isFinite(a) ? echarts.format.addCommas(+a / 1000) : '';}}}],dataZoom: [{show: true,start: 80,end: 100},{type: 'inside',start: 80,end: 100},{show: true,yAxisIndex: 0,filterMode: 'empty',width: 30,height: '80%',showDataShadow: false,left: '93%'}],series: [{name: 'Budget 2011',type: 'bar',data: obama_budget_2012.budget2011List},{name: 'Budget 2012',type: 'bar',data: obama_budget_2012.budget2012List}]};myChart.setOption(option);}
);
Superset 实现过程
superset-frontend\plugins\plugin-chart-echarts\src\Timeseries\Regular\Bar\controlPanel.tsx
新增函数createDataZoomControl && DEFAULT_FORM_DATA 新增xAxisBoundsZoom
const {logAxis,minorSplitLine,truncateYAxis,yAxisBounds,xAxisBoundsZoom,zoomable,xAxisLabelRotation,orientation,
} = DEFAULT_FORM_DATA;--------------------------------------------------
function createDataZoomControl(): ControlSetRow[] {return [[{name: 'zoomable',config: {type: 'CheckboxControl',label: t('Data Zoom'),default: zoomable,renderTrigger: true,description: t('Enable data zooming controls'),},},],[{name: 'x_axis_bounds_zoom',config: {type: 'BoundsControl',label: t('Data Zoom Axis Bounds'),renderTrigger: true,default: xAxisBounds,description: t('Bounds for the axis when Data Zoom is enabled. When left empty, the bounds are ' +'dynamically defined based on the min/max of the data. Note that ' +"this feature will only expand the axis range. It won't " +"narrow the data's extent.",),visibility: ({ controls }: ControlPanelsContainerProps) =>Boolean(controls?.zoomable?.value),},},],];
}
修改 controlPanelSections controlSetRows 的逻辑
controlSetRows: [...seriesOrderSection,['color_scheme'],...showValueSection,...createDataZoomControl(),// [// {// name: 'zoomable',// config: {// type: 'CheckboxControl',// label: t('Data Zoom'),// default: zoomable,// renderTrigger: true,// description: t('Enable data zooming controls'),// },// },// ],
superset-frontend\plugins\plugin-chart-echarts\src\Timeseries\types.ts
新增 xAxisBoundsZoom
export type EchartsTimeseriesFormData = QueryFormData 新增以下内容xAxisBoundsZoom: [number | undefined | null, number | undefined | null];
superset-frontend\plugins\plugin-chart-echarts\src\Timeseries\constants.ts
export const DEFAULT_FORM_DATA: EchartsTimeseriesFormData = 新增 xAxisBoundsZoom
xAxisBoundsZoom: [null, null],
核心逻辑
superset-frontend\plugins\plugin-chart-echarts\src\Timeseries\transformProps.ts
EchartsTimeseriesFormData = { ...DEFAULT_FORM_DATA, ...formData }; 内容里新增以下代码
xAxisBoundsZoom,--------------------------------------------
let [minZoom, maxZoom] = (xAxisBoundsZoom || []).map(parseYAxisBound);
if ((contributionMode === 'row' || isAreaExpand) && stack) {if (minZoom === undefined) minZoom = 0;if (maxZoom === undefined) maxZoom = 100;
} else if (logAxis && min === undefined && minPositiveValue !== undefined) {minZoom = calculateLowerLogTick(minPositiveValue);
}-------------------------------------------------
dataZoom: zoomable? [{type: 'slider',// start: TIMESERIES_CONSTANTS.dataZoomStart,start: minZoom,// end: TIMESERIES_CONSTANTS.dataZoomEnd,end: maxZoom,bottom: TIMESERIES_CONSTANTS.zoomBottom,},]: [],
效果展示