Chart Data Functions

Use Cases #

In graphic development, you may need to use JS to process the data passed from the backend. All functions can be called directly in the graphic’s JS code area.

Data Convention: All examples use the following standard 2D array, where the first row is the header and subsequent rows are data:

dataset = [['category', 'C1', 'C2'],
           ['R1',        12,   18],
           ['R2',        10,   17]]

Dataset Transformation #

ds_transform(dataset) #

Row-column transpose: Swaps rows and columns of a 2D array (matrix transpose). Commonly used for axis flipping.

result = ds_transform(dataset)
// [['category', 'R1', 'R2'], ['C1', 12, 10], ['C2', 18, 17]]

ds_createMap(dataset) #

Generate key → [] dictionary: Converts a 2D array to a dictionary with first column values as keys and remaining columns as arrays. Commonly used in ECharts to get series data by name.

result = ds_createMap(dataset)
// { "category": ["C1", "C2"], "R1": [12, 18], "R2": [10, 17] }
let r1Data = result['R1']  // [12, 18]

ds_createMap_all(dataset) #

Generate object array: Converts a 2D array to [{col1: val, col2: val, ...}, ...] format (skips header row). Commonly used for pie chart data, ECharts dataset source, and field-name-based access.

result = ds_createMap_all(dataset)
// [{"category":"R1","C1":12,"C2":18}, {"category":"R2","C1":10,"C2":17}]
let pieData = ds_createMap_all(dataset).map(item => ({name: item.category, value: item.C1}))

ds_mapToList(dataset) #

Object array to 2D array: Reverses ds_createMap_all — converts object array back to standard 2D format (header + data rows).


ds_pivot(dataset, indexs=null, column=null, value=null) #

Data pivot (rows to columns): Pivots detail data in “dimension + pivot column + value” format to a wide table. Defaults to last two columns as pivot and value.

dataset3 = [['City', 'Type', 'Count'], ['Changsha', 'A', 35], ['Shanghai', 'B', 19]]
result = ds_pivot(dataset3)
// [["City", "A", "B"], ["Changsha", 35, 0], ["Shanghai", 0, 19]]

ds_tree(dataset, label='label', children='children') #

Generate tree structure: Converts “parent, child” 2D array to nested tree structure for ECharts tree/treemap. Supports fatherName/childName fields to separate codes from display names.

dataset = [["father", "child"], ["Hunan", "Changsha"], ["Hunan", "Chenzhou"], ["Guangdong", "Guangzhou"]]
result = ds_tree(dataset)
// [{id:"Hunan", label:"Hunan", children:[{id:"Changsha",label:"Changsha"},{id:"Chenzhou",label:"Chenzhou"}]}, ...]

ds_distinct(a, b=[]) #

Array deduplication: Removes duplicates from one or two merged arrays.

ds_distinct(['A', 'B', 'A', 'C'])  // ['A', 'B', 'C']
ds_distinct(['A', 'B'], ['B', 'C', 'D'])  // ['A', 'B', 'C', 'D']

ds_filter(dataset, fun) #

Dataset filtering: Filters data rows using a function. Header row is always preserved. fun receives each row; true keeps, false removes.

result = ds_filter(dataset, item => item[0] === 'R1')
// [['category','C1','C2'], ['R1', 12, 18]]

ds_sort(dataset, index=0, asc=true) #

Dataset sorting: Sorts data rows by specified column index (header preserved). Supports ascending/descending and custom compare functions.

ds_sort(dataset, 1)         // Ascending by column 1
ds_sort(dataset, 1, false)  // Descending by column 1
ds_sort(dataset, (a, b) => b[2] - a[2])  // Custom compare

ds_remove_column(dataset, remove_list=[0]) #

Remove columns: Deletes specified column indices from a 2D array.


ds_split(data, sep=',', head_add=[]) #

Split first column: Splits the first column’s string by separator into multiple fields and merges into the dataset.


ds_sumColumn(dataset, column) #

Column sum: Sums all numeric values in the specified column (from row 1, skipping header).

ds_sumColumn(dataset, 1)  // 22 (12 + 10)

ds_percentAcc(dataset, row) #

Cumulative percentage row: Calculates cumulative percentage for the specified row and appends it to the dataset. Commonly used for Pareto charts.


Dataset Association #

ds_leftjoin(a, b, withhead=true, type=1) #

Left join: Left joins two datasets by their first column. All rows from a are preserved; unmatched columns in b are filled with 0.

dataset2 = [['category', 'C3'], ['R1', 38], ['R6', 13]]
result = ds_leftjoin(dataset, dataset2)
// [['category','C1','C2','C3'], ['R1',12,18,38], ['R2',10,17,0]]

ds_crossjoin(a, b, withhead=true) #

Cross join (inner join): Only preserves rows where first columns match (SQL INNER JOIN).


ds_fulljoin(a, b, withhead=true) #

Full outer join: Preserves all rows from both datasets, filling unmatched with 0 (SQL FULL OUTER JOIN).


ds_union(a, b, withhead=true) #

Vertical merge (UNION ALL): Concatenates two datasets vertically, using the first dataset’s header.


Dataset Refresh #

ds_param(name) #

Get parameter: Gets a value from the global parameter dictionary filter_param by name.

let city = ds_param('city')  // 'Changsha'

ds_setParam('name', value) #

Set global parameter: Writes a parameter to filter_param. When value is empty/null/undefined, the parameter is automatically deleted.

ds_setParam('city', 'Changsha')  // filter_param becomes {city: 'Changsha'}
ds_setParam('city', '')           // Removes the parameter

// Typical linkage scenario
myChart.on('click', function(params) {
    ds_setParam('city', params.name)
    ds_refresh(2)
})

ds_refresh(index, param=filter_param, r=null) #

Refresh graphic / get data: Triggers the specified graphic to re-request data and render.

Parameter Description Default
index Graphic sequence number
param Parameter dictionary filter_param
r null sync refresh; 0 async; 'list' returns 2D array; 'map' returns object array null
ds_refresh(2)                              // Refresh with global params
ds_refresh(2, {city: 'Changsha'})          // Refresh with custom params
let data = ds_refresh(2, filter_param, 'list')  // Get data as 2D array
ds_refresh(2, filter_param, 0)              // Async refresh without waiting

ds_my(callback=null, force=false) #

Get current user info: Gets username, name, OA roles/position/department, and Django groups. Returns {username, name, roles:[], position, department, groups:[]}.

let my = ds_my()
if (my.roles.includes('admin')) { /* admin logic */ }
ds_setParam('dept', ds_my().department)

Data Processing #

ds_rowname(dataset, start_row=1, column=0) #

Get column data: Extracts all values from the specified column starting from a given row. Commonly used for dimension lists.

ds_rowname(dataset)  // ['R1', 'R2']

ds_getStatistic(dataset) #

Process metric data: Unifies multiple dataset dictionaries into [[metric names...], [metric values...]] format for indicator card components.


ds_toThousands(num) #

Number to thousands format: Converts a number to comma-separated thousands string.

ds_toThousands(1234567)  // '1,234,567'

ds_round(num, qty=2) #

Decimal formatting: Rounds a number to specified decimal places (default 2), returns string.

ds_round(3.14159)      // '3.14'
ds_round(3.14159, 4)   // '3.1416'

ds_generateLastDay(n=15, joinChat='-') #

Generate recent N days: Generates a date array for the last N days (with header row ['zymd']).

result = ds_generateLastDay(5)
// [['zymd'], ['2024-01-11'], ..., ['2024-01-15']]

ds_generateUUID() #

Generate UUID: Generates a random UUID v4 string.


base64.encode(str) / base64.decode(str) #

Base64 encode/decode: Global utility supporting UTF-8 characters including Chinese.


new Date().format('yyyy-MM-dd hh:mm:ss') #

Date formatting: Date prototype extension for formatted date strings.

Placeholder Meaning
yyyy 4-digit year
MM 2-digit month
dd 2-digit day
hh 2-digit hour (24h)
mm 2-digit minute
ss 2-digit second
new Date().format('yyyy-MM-dd')  // '2024-01-15'

Component Rendering #

ds_formatArray(dataset, formatStr) #

Format array to string: Replaces $fieldName placeholders in a format string with each row’s data, joining results with newlines.

ds_formatArray(dataset6, '$name scored $score, grade $grade')
// 'Alice scored 95, grade A\nBob scored 82, grade B'

ds_vue(eid, dataset, param=null, ds_list=null) #

Dynamic Vue component rendering: Asynchronously loads Vue + ElementUI and creates a Vue instance on the specified DOM element.

await ds_vue('#container_1', dataset)
let vm = await ds_vue('#container_1', dataset, {city: 'Changsha'}, [2, 3])

ds_chart(dataset, index=999, chartType=null) #

Dynamic chart rendering: Auto-detects and renders ECharts graphics (pie or bar/line), supports click-to-switch chart type. Also accepts ECharts option objects or HTML strings.

await ds_chart(dataset, 1)           // Auto-detect type
await ds_chart(dataset, 1, 'pie')    // Force pie chart
await ds_chart({xAxis:{...}, series:[...]}, 1)  // Pass ECharts option
await ds_chart('<div>No data</div>', 1)          // Render HTML

ds_loadcss(css, id=null) #

Dynamically load styles: Injects CSS into <head>. Supports built-in CSS names, full URLs, or CSS strings.

ds_loadcss('smt_swiper')  // Load /static/smartchart/opt/smt_swiper.css
ds_loadcss('.my-box { color: red; }', 'my-style')  // Inject CSS string

ds_loadjs(name, async=false, force=false) #

Dynamically load JS: Loads JavaScript scripts. Supports built-in JS names or full URLs. Already-loaded scripts are skipped (use force=true to reload).

ds_loadjs('smt_log')
await ds_loadjs('/static/echart/dist/echarts.min.js', true)

ds_loadjson(mapURL, mmap=null) #

Load JSON / Register map: Synchronously loads a JSON file and returns parsed object. When mmap is provided, also registers as ECharts map.

ds_loadjson('/static/echart/map/hunan.json', 'hunan')

ds_scroll(name, interval=1000, step=10) #

Container auto-scroll: Auto-scrolls container content downward, loops back to top at bottom.


ds_liMarquee(name, marconfig=null) #

Seamless list scrolling: Based on liMarquee plugin for seamless scrolling with rich configuration.


ds_swiper(name, swconfig={}) #

Carousel component: Based on Swiper plugin for content carousel.


startSelectAnimate(myChart, dataLen, interval=1000, showtip=1) #

Chart carousel highlight: Auto-highlights ECharts data items in sequence with tooltip. Commonly used for unattended large-screen displays.


clickaction(myChart) #

Click highlight lock: Binds click-to-highlight effect on ECharts graphics — clicked item stays highlighted, click again to cancel. Useful for drill-down linkage.


addWaterMarker(str) #

Page watermark: Generates diagonal text watermark on page background.


Map and 3D #

ds_loadBmap(ak=null) #

Load Baidu Map: Dynamically loads Baidu Map JS API. Auto-reads bmap_ak from backend config if no AK provided.


ds_load3d() #

Load Three.js 3D environment: Dynamically loads three.js, OrbitControls, and SmartChart 3D wrapper libraries.


get_geoscatterList(dataset, geoCoordMap) #

Generate map scatter data: Matches “name, value” dataset with coordinate dictionary to generate ECharts effectScatter data format.

let geoCoordMap = {'Changsha': [112.98, 28.19], 'Guangzhou': [113.26, 23.13]}
let scatterData = get_geoscatterList(dataset, geoCoordMap)
// [{name:'Changsha', value:[112.98, 28.19, 100]}, ...]

get_geoflyList(dataset, geoCoordMap) #

Generate map flyline data: Matches “origin, destination, value” dataset with coordinates to generate ECharts lines series data.


Excel Dataset #

ds_excel_refresh(dataset) #

Refresh complex reports: Batch writes data to LuckySheet spreadsheet. Use #dfN.fieldName placeholders in cells to specify fill locations. Dataset format: {df0: 2D array, df1: 2D array, ...}.


ds_excel_value(fillCells, clear=false) #

Get cell values: Batch reads cell values from LuckySheet by coordinates (e.g., 'A1'). Commonly used in data entry scenarios.

let [name, amount, date] = ds_excel_value(['B2', 'C2', 'D2'])
ds_save(1, [[name, amount, date]])

Data Upload/Download #

ds_save(index, contents, update=0, id=null) #

Save/update data: Writes data to SmartChart dataset storage. update=0 for insert, update=1 for update (matched by first column primary key).

ds_save(1, [['name', 'sales'], ['Changsha', 100]])      // Insert
ds_save(1, [['name', 'sales'], ['Changsha', 150]], 1)  // Update

ds_download(filename, dataset, xls=0) #

Download data: Downloads dataset as CSV (default) or Excel (.xlsx when xls=1).

ds_download('sales_data', dataset)      // CSV
ds_download('sales_data', dataset, 1)   // Excel

ds_uploadfile(blob, filename, name=null, callback=null, ossConfig=null) #

Upload file: Uploads a Blob to the server, executes callback on success. Commonly used with file input elements.

document.getElementById('fileInput').addEventListener('change', function(e) {
    let file = e.target.files[0]
    ds_uploadfile(file, file.name, 'my_category', function(data) {
        console.log('Uploaded to:', data.url)
    })
})

Common JS Native Functions #

dataset.push(['R3', 5, 9])         // Append row
dataset.unshift(['header', 'C1'])  // Prepend row
dataset.slice(1)                   // Skip header
dataset.slice(-3)                  // Last 3 rows

// for loop (best performance, SmartChart recommended)
for (let i = 0; i < dataset.length; i++) { let row = dataset[i] }

// map (generate new array)
let values = dataset.slice(1).map(row => row[1])

// find (first matching element)
let row = dataset.slice(1).find(row => row[0] === 'R1')

// concat (merge arrays)
let merged = dataset.concat(other.slice(1))

Raw Data Format Reference #

Given SQL = SELECT dim1, dim2, metric FROM table, the standard 2D array format:

dataset = [['category', 'C1', 'C2'],  // Row 0: header (SQL field names)
           ['R1',        12,   18],    // Row 1+: data
           ['R2',        10,   17]]
  • Row 0: Header, corresponds to SQL query field names
  • Row 1+: Data rows; first column is typically a dimension (category), subsequent columns are metrics
  • All transformation functions accept this format as input; output format is consistent (except for ds_createMap, ds_createMap_all, and other conversion functions)