UNPKG

@czi-sds/data-viz

Version:
308 lines (307 loc) 11.4 kB
/// <reference types="react" /> import { HTMLAttributes } from "react"; import { DatasetComponentOption, ECharts, EChartsOption, ScatterSeriesOption } from "echarts"; import { DiscreteColorGeneratorOptions, TooltipTableContentProps } from "@czi-sds/components"; interface CreateChartOptionsProps { /** * Display reference line and axis value under mouse pointer * https://echarts.apache.org/en/option.html#axisPointer */ axisPointer?: EChartsOption["axisPointer"]; /** * The data array to be visualized * The data point object shape can be whatever you like, but it must be consistent with the `encode` option * For example, if the data point shape is: * { * geneIndex: 0, * cellTypeIndex: 0, * percentage: 0.5 * } * and you want geneIndex to be encoded to x axis and cellTypeIndex to be encoded to y axis, then make sure your encode option is: * encode: { * x: 'geneIndex', * y: 'cellTypeIndex' * } */ data: DatasetComponentOption["source"]; /** * The `dataZoom` prop is utilized for implementing zoom functionality within a * specific area of the chart. This feature empowers users to inspect data in * granular detail, obtain an overview of the entire dataset, or eliminate * outlier points. * By applying the `dataZoom` prop while locking the zoom level, the chart * efficiently renders a confined portion of the heatmap. This selective * rendering strategy becomes especially advantageous when dealing with * extensive datasets. Instead of rendering the entire heatmap at once, * the chart dynamically loads and renders specific segments as the user * scrolls through the data. This approach optimizes performance and enables * the creation of heatmaps with large amounts of data. * https://echarts.apache.org/en/option.html#dataZoom */ dataZoom?: EChartsOption["dataZoom"]; /** * The `camera` prop is utilized for implementing camera view port functionality * within a specific area of the chart. This feature empowers users to render * a confined portion of the heatmap. This selective rendering strategy becomes * especially advantageous when dealing with extensive datasets. Instead of * rendering the entire heatmap at once, the chart dynamically loads and renders * specific segments as the user scrolls through the data. This approach optimizes * performance and enables the creation of heatmaps with large amounts of data. * * The `height` and `width` properties are used to specify the dimensions of the * camera view port. The `active` property is used to enable or disable the camera * view port functionality. */ camera?: { active: boolean; height: number; width: number; }; /** * Customize the style of each cell item when mouse hovers on it, such as color, border, opacity, etc. * https://echarts.apache.org/en/option.html#series-scatter.emphasis */ emphasis?: ScatterSeriesOption["emphasis"]; /** * The data for the x axis * For example: * [{ value: "gene1", textStyle: { color: "red" } }, "gene2", "gene3"] */ xAxisData: CategoryAxisData; /** * The data for the y axis * For example: * [{ value: "cellType1", textStyle: { color: "red" } }, "cellType2", "cellType3"] */ yAxisData: CategoryAxisData; /** * The width of the chart in pixels */ width: number; /** * The height of the chart in pixels */ height: number; /** * Provide a mapping of data key to x/y axis encoding * For example, if the data is: * { * geneIndex: 0, * cellTypeIndex: 0, * percentage: 0.5 * } * and we want to encode `geneIndex` to x axis and `cellTypeIndex` to y axis, then * encode: { * x: 'geneIndex', * y: 'cellTypeIndex' * } * https://echarts.apache.org/en/option.html#series-scatter.encode */ encode?: { x: string; y: string; }; /** * Customize the style of each cell item, such as color, border, opacity, etc. * https://echarts.apache.org/en/option.html#series-scatter.itemStyle */ itemStyle?: ScatterSeriesOption["itemStyle"]; /** * The shape of the symbol. */ symbol?: "circle" | "rect" | "roundRect"; /** * `symbolSize` can be set to single numbers like 10, or use an array to represent width and height. For example, [20, 10] means symbol width is 20, and height is 10. * * If size of symbols needs to be different, you can set with callback function in the following format: * * (value: Array|number, params: Object) => number|Array * * The first parameter value is the value in data, and the second parameter params is the rest parameters of data item. * https://echarts.apache.org/en/option.html#series-scatter.symbolSize */ symbolSize?: ScatterSeriesOption["symbolSize"]; /** * https://echarts.apache.org/en/option.html#grid */ grid?: EChartsOption["grid"] | ((defaultOption: EChartsOption["grid"]) => EChartsOption["grid"]); /** * The options object to be passed to echarts.setOption() * https://echarts.apache.org/en/option.html */ options?: EChartsOption; /** * Event listeners for the chart * https://echarts.apache.org/en/api.html#events */ onEvents?: Record<string, (event: unknown, chart: ECharts) => void>; } type OrdinalRawValue = string | number; /** * (thuang): This copies echarts' CategoryAxisBaseOption["data"] type, since it's not exported */ type CategoryAxisData = (OrdinalRawValue | { value: OrdinalRawValue; /** * (thuang): This should be echarts `TextCommonOption` type, but it's not exported */ textStyle?: never; })[]; interface HeatmapChartProps extends HTMLAttributes<HTMLDivElement>, CreateChartOptionsProps { echartsRendererMode?: "svg" | "canvas"; } declare const _default: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<HeatmapChartProps & import("react").RefAttributes<HTMLDivElement>>>; interface StackedBarChartDataItem { /** * Display name for the segment */ name: string; /** * Numeric value for the segment */ value: number; /** * Color for the segment (hex or CSS color) * If not provided, colors will be automatically generated using cubehelix palette */ color?: string; /** * Unit label to display with the value in cumulative mode (e.g., "GB", "datasets", "MB") * Only shown in legend when mode is "cumulative" */ unit?: string; /** * Disable the item (prevents all events on the corresponding legend item and bar segment) * @default false */ disabled?: boolean; /** * Optional tooltip to display when hovering over the segment */ tooltip?: TooltipTableContentProps; } interface StackedBarChartProps extends HTMLAttributes<HTMLDivElement> { /** * Title to display above the chart */ title?: string; /** * Badge text to display next to the title * If not provided, defaults to showing item count based on selection: * - No selection: total count (e.g., "5") * - Partial selection: selected count (e.g., "3 of 5") * - All selected: "All" */ badge?: string; /** * Hide the badge when true * @default false */ hideBadge?: boolean; /** * Array of data items to display in the stacked bar */ data: StackedBarChartDataItem[]; /** * Width of the chart - accepts any CSS width value (e.g., "100%", "20vw", "300px", or number for pixels) * @default 100% */ width?: number | string; /** * Height of the bar in pixels (minimum 1px) * @default 16 */ barHeight?: number; /** * Whether to show the legend below the chart * @default true */ showLegend?: boolean; /** * Whether to show percentage values in the legend * @default true */ showLegendValues?: boolean; /** * Format for legend values * - "percentage": Shows percentage of the item in the bar chart (e.g., "20%") * - "count": Shows the count from the data object with the unit defined by the unit prop * @default "percentage" */ legendValueFormat?: "percentage" | "count"; /** * Array of selected item indices (controlled component) */ selectedIndices?: number[]; /** * Callback when legend selection changes */ onSelectionChange?: (selectedIndices: number[], selectedData: StackedBarChartDataItem[]) => void; /** * Callback when mouse enters a bar segment */ onSegmentMouseEnter?: (item: StackedBarChartDataItem, index: number) => void; /** * Callback when mouse leaves a bar segment */ onSegmentMouseLeave?: (item: StackedBarChartDataItem, index: number) => void; /** * Callback when mouse enters a legend item */ onLegendItemMouseEnter?: (item: StackedBarChartDataItem, index: number) => void; /** * Callback when mouse leaves a legend item */ onLegendItemMouseLeave?: (item: StackedBarChartDataItem, index: number) => void; /** * Callback when a bar segment is clicked */ onSegmentClick?: (item: StackedBarChartDataItem, index: number) => void; /** * Callback when a legend item is clicked */ onLegendItemClick?: (item: StackedBarChartDataItem, index: number) => void; /** * Behavior to apply when items are selected * - "dim": Non-selected segments become semi-transparent (20% opacity) * - "hide": Non-selected segments are hidden from the bar chart * @default "dim" */ selectionBehavior?: "dim" | "hide"; /** * Chart mode - controls how segments are calculated * - "proportional": Segments fill entire bar (100%), proportional to their values * - "cumulative": Segments sized based on actual values relative to maxAmount * @default "proportional" */ mode?: "proportional" | "cumulative"; /** * Maximum amount for the bar (used only in "cumulative" mode) * If not provided, defaults to sum of all values (no remaining segment) * If provided and sum < maxAmount, shows gray "remaining" segment */ maxAmount?: number; /** * Label for the remaining/unknown segment in cumulative mode * @default "Remaining" */ remainingLabel?: string; /** * Unit to display with the remaining segment value in cumulative mode * If not provided, uses the unit from the first data item (if available) */ remainingUnit?: string; /** * Global unit to display with values in cumulative mode (e.g., "GB", "datasets", "K") * Individual data items can override this with their own unit property * Only shown when mode is "cumulative" */ unit?: string; /** * Options for the color generator */ colorGeneratorOptions?: DiscreteColorGeneratorOptions; } declare const StackedBarChart: (props: StackedBarChartProps) => JSX.Element; export { HeatmapChartProps, _default, _default as HeatmapChart, StackedBarChart }; export type { StackedBarChartProps, StackedBarChartDataItem };