Sprucely title background

数据格式

Sprucely.io 渲染的每一个仪表板——无论是通过独立的 JavaScript 运行时、独立的 React 组件创建,还是保存在您的账户中——都遵循同一套底层 JSON 结构:一个用于设置仪表板整体样式的 config 对象,以及一个描述组件树的 data 对象。本参考文档完整说明了这套 JSON 结构,以及它所读取的数据集格式,还有针对特定列组合应选用哪种图表类型。如需了解嵌入方法,请参阅简单的仪表板集成说明。

仪表板 JSON

每个仪表板都是一个单一的 JSON 对象,包含两个顶层键:config,用于承载仪表板整体样式;以及 data,这是一棵从单一仪表板根节点出发、由多个带类型的组件节点构成的树。每个节点都有一个 type 字段,对于容器类型的节点,还包含一个 children 数组,用于存放嵌套的子节点。

  • dash - 仪表板的根节点。整棵树中有且只有一个,位于最顶层。
  • dash_stacker_hor / dash_stacker_ver - 将其子节点按行或按列排列。
  • dash_chart - 图表,使用下文所支持的某一种图表类型(见下文)。
  • dash_table - 数据表格。
  • dash_text - 文本块。
  • dash_image - 已上传的图片。
  • dash_spacer - 组件之间固定的空白间隔。

无论类型如何,每个组件都支持相同的外观样式字段:

  • size - 组件沿其容器主轴方向的尺寸:‘Auto’、‘<n>px’ 或 ‘<n>%’。
  • padding - 内边距,例如 ‘10px’(dash_spacer 除外)。
  • backgroundColor - CSS 颜色值,例如 ‘#FFFFFF’ 或 ‘transparent’。
  • borderRadius / borderWidth - 圆角半径与边框粗细,例如 ‘10px’。
  • borderColor - 边框的 CSS 颜色值。
  • shadow - true 或 false;是否添加投影。

图表组件

每种图表共用同一套字段;具体使用 xydr 中的哪几个,以及每个字段接受何种类型的列,取决于图表类型——下文各小节分别介绍每一种受支持的图表类型,并配有基于同一个小型示例数据集渲染的实时示例。

  • datasetId - 该图表所读取的数据集——必须与某个数据集的名称一致。
  • chartType - area, bar, cell, dot, hexbin or line。
  • title - 可选的图表标题。
  • dataFunction - 应用于 d 的聚合方式:count (default), sum, average, min, max, median or stddev。使用 count 时,d 应保持未设置。
  • x - X 维度对应的列(所有图表类型都必填)。
  • y - Y 维度对应的列(仅适用于 cell、dot 和 hexbin,且这三种类型必填)。
  • d - 聚合到图表数值/颜色维度中的列。
  • r - 半径维度对应的列(仅适用于 dot,且为必填)。
  • seasonX / seasonY - 将时间列按周期性时段分组:year, quarter, month, week, dayofyear, day, dayofweek, hour, minute or second。

维度列会依据其声明的类型被划分为分类型、时间型或连续型——详见下文的数据集 JSON 部分。当 dataFunction 为 count 时,d 维度应保持未设置——计数(count)不需要数值列。其他任何聚合方式(sum, average, min, max, median or stddev)都需要该列。

图表类型所需的维度必须填写:cell、dot 和 hexbin 缺少 y 就无法绘制,dot 缺少 r 同样无法绘制。缺少其中任何一项的请求都会被拒绝,因此如果数据集中没有合适的列,请改选不需要该维度的图表类型——area、bar 和 line 只需 x,hexbin 则无需半径列即可呈现两个维度。

柱状图

x 可接受分类型、连续型或时间型的列。d 必须是连续型,且仅在 dataFunction 不为 count 时使用。当 x 为时间列时,可设置 seasonX,将其按周期性时段(例如星期几)分组。yr 不使用。

折线图

x 可接受连续型或时间型的列——不支持分类型。d 必须是连续型,仅在 dataFunction 不为 count 时使用。不支持季节性分组。yr 不使用。

面积图

x 可接受连续型或时间型的列——不支持分类型。d 必须是连续型,仅在 dataFunction 不为 count 时使用。不支持季节性分组。yr 不使用。

热力图

xy 都需要分类型的列,或启用了季节性分组的时间列(x 对应 seasonX,y 对应 seasonY)。d 必须是连续型,仅在 dataFunction 不为 count 时使用。使用 seasonY 时,还要求 x 本身已解析为分类型维度——可以是真正的分类型列,也可以是设置了 seasonX 的时间列。r 不使用。

散点图

xy 可接受连续型或时间型的列。rd 必须均为连续型——不能是分类型或时间型。不支持季节性分组。散点图在数据行数不超过几百行时呈现效果最佳。

六边形分箱图

xy 都可接受连续型或时间型的列——不支持分类型。d 必须是连续型,仅在 dataFunction 不为 count 时使用。不支持季节性分组。r 不使用。

其他组件

表格 (dash_table)

  • datasetId - 要显示的数据集。
  • fontFamily - 默认 Arial;可选 Arial, Calibri, Cambria, Century Gothic, Courier New, Garamond, Helvetica, Consolas/Monaco (Monospace), Lucida Bright, Lucida Sans, Segoe UI, Tahoma, Verdana 之一。
  • fontSize - 默认 12px;6-256px 或 1-10vw。
  • color - 默认 inherit。
  • bold / italic - true or false,默认 false。
  • ratio - 宽高比,数值范围为 0.125 to 16。

文本 (dash_text)

  • text - 要显示的文本。
  • fontFamily / fontSize (default 3vw) / color / bold / italic - 与表格组件相同。
  • justifyContent / alignItems - ‘0’ start, ‘1’ center or ‘2’ end。

图片 (dash_image)

  • assetId - 已上传的图片资源。
  • objectFit - 默认 none;none, contain, cover or fill。

间隔 (dash_spacer)

  • size - 必填;默认 100px;0-100% 或 30-1000px。

堆叠容器 (dash_stacker_hor, dash_stacker_ver)

  • children - 嵌套的子组件,按行(dash_stacker_hor)或按列(dash_stacker_ver)排列。
  • gap - 默认 ‘10px’;子组件之间的间距。
  • minHeight - 该堆叠容器的最小高度。

数据集 JSON

数据集是一个单一的 JSON 对象,包含名称、带类型的列以及行数据:

{
  "name": "Orders",
  "headers": ["region", "category", "amount", "quantity"],
  "types": ["VARCHAR", "VARCHAR", "FLOAT", "INTEGER"],
  "entries": [
    ["North", "Electronics", 120.50, 2],
    ["South", "Clothing",     89.95, 1],
    ["North", "Furniture",   432.00, 5],
    ["South", "Electronics",  74.50, 1]
  ]
}
  • name - 数据集名称;图表和表格通过各自的 datasetId 字段引用它。
  • headers - 各列的名称,顺序与 entries 中每行的顺序一致。
  • types - 每个表头对应一个列类型——具体分类见下文。
  • entries - 行数据,每一行是一个按表头顺序排列的值数组。

您可以选择使用 row_startrow_endcol_startcol_end 来指定要导入的 entries 子范围(从零开始计数,首尾均包含)——这在只需从更大的表格中追加新行时非常有用。这四个字段默认均为完整范围:

{
  "name": "Orders",
  "headers": ["region", "amount"],
  "types": ["VARCHAR", "FLOAT"],
  "entries": [ ["North", 120.50], ["South", 89.95], ["North", 432.00], ["South", 74.50] ],
  "row_start": 0,
  "row_end": 1,
  "col_start": 0,
  "col_end": 1
}

每种列类型都被划分为分类型、时间型或连续型,这决定了它可以用于哪些图表维度——详见上文的图表组件部分:

  • 分类型 - BIT, BITSTRING, BOOLEAN, BOOL, LOGICAL, BLOB, BYTEA, BINARY, VARBINARY, UUID, VARCHAR, CHAR, BPCHAR, TEXT, STRING
  • 时间型 - DATE, TIME, TIMESTAMP, DATETIME, TIMESTAMP WITH TIME ZONE, TIMESTAMPTZ
  • 连续型 - 其他所有类型,例如 INTEGER, FLOAT, DOUBLE, BIGINT, DECIMAL

图表中的列引用(xydr)必须与表头名称完全一致,并区分大小写。

样式与主题覆盖

仪表板级别的颜色只需在 config.style.widget 中设置一次,便会应用于所有未单独覆盖这些设置的组件:

  • color - 默认文字颜色。
  • backgroundColor - 仪表板的默认背景色。
  • primaryColor - 前景/激活系列颜色,用于标题以及交叉筛选后高亮的数据系列。
  • primaryColorSubtle - cell、dot 和 hexbin 图表所使用的颜色渐变的低值端。
  • secondaryColor - 背景/未筛选系列颜色。

任何组件都可以直接在其 JSON 节点上覆盖自身的样式——backgroundColorcolorpaddingborderRadiusborderWidthborderColorshadow。下面的示例覆盖了某个图表自身的颜色与圆角,而仪表板的其余部分仍沿用共享主题:

{
  "type": "dash_chart",
  "datasetId": "Orders",
  "chartType": "hexbin",
  "x": "amount",
  "y": "quantity",
  "backgroundColor": "#F5F0FF",
  "borderRadius": "12px",
  "borderWidth": "1px",
  "borderColor": "#6E2BDC",
  "shadow": true
}

完整示例

一个小型仪表板示例,包含一个标题、并排的两个图表以及一个表格,全部读取自同一个数据集:

{
  "config": {
    "type": "dashboard",
    "style": {
      "widget": {
        "color": "#000000",
        "backgroundColor": "#FFFFFF",
        "primaryColor": "#6E2BDC",
        "primaryColorSubtle": "#E2D5F8",
        "secondaryColor": "#CCCCCC"
      }
    }
  },
  "data": {
    "type": "dash",
    "children": [
      { "type": "dash_text", "text": "Orders Overview", "fontSize": "2vw", "justifyContent": "0" },
      {
        "type": "dash_stacker_hor",
        "children": [
          { "type": "dash_chart", "datasetId": "Orders", "chartType": "bar",  "x": "region", "dataFunction": "count" },
          { "type": "dash_chart", "datasetId": "Orders", "chartType": "cell", "x": "region", "y": "category", "dataFunction": "count" }
        ]
      },
      { "type": "dash_table", "datasetId": "Orders" }
    ]
  }
}