diff --git a/docs/data/charts/heat-map/BasicHeatmap.js b/docs/data/charts/heat-map/BasicHeatmap.js new file mode 100644 index 0000000000000..2eccd7516a3ae --- /dev/null +++ b/docs/data/charts/heat-map/BasicHeatmap.js @@ -0,0 +1,72 @@ +import * as React from 'react'; +import '@mui/x-charts-pro/typeOverloads'; +import { ChartsAxis } from '@mui/x-charts/ChartsAxis'; +import { HeatmapContainer, HeatmapPlot } from '@mui/x-charts-pro/Heatmap'; + +export default function BasicHeatmap() { + return ( + + + + + ); +} diff --git a/docs/data/charts/heat-map/BasicHeatmap.tsx b/docs/data/charts/heat-map/BasicHeatmap.tsx new file mode 100644 index 0000000000000..867f16ae9392f --- /dev/null +++ b/docs/data/charts/heat-map/BasicHeatmap.tsx @@ -0,0 +1,78 @@ +import * as React from 'react'; +import '@mui/x-charts-pro/typeOverloads'; +import { ChartsAxis } from '@mui/x-charts/ChartsAxis'; +import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; +import { HeatmapContainer, HeatmapPlot } from '@mui/x-charts-pro/Heatmap'; + +export default function BasicHeatmap() { + return ( + + + + + + ); +} diff --git a/docs/data/charts/heat-map/heat-map.md b/docs/data/charts/heat-map/heat-map.md index 6d6413b064b8e..d81cc95e4ad4a 100644 --- a/docs/data/charts/heat-map/heat-map.md +++ b/docs/data/charts/heat-map/heat-map.md @@ -13,3 +13,5 @@ The Heatmap Chart component isn't available yet, but you can upvote [**this GitH Don't hesitate to leave a comment there to influence what gets built. Especially if you already have a use case for this component, or if you're facing a pain point with your current solution. ::: + +{{"demo": "BasicHeatmap.js"}} diff --git a/packages/x-charts-pro/src/Heatmap/HeatmapContainer.tsx b/packages/x-charts-pro/src/Heatmap/HeatmapContainer.tsx index 7d687d488499e..820b547239b4a 100644 --- a/packages/x-charts-pro/src/Heatmap/HeatmapContainer.tsx +++ b/packages/x-charts-pro/src/Heatmap/HeatmapContainer.tsx @@ -18,7 +18,7 @@ import { ZAxisContextProvider, } from '@mui/x-charts/internals'; import { AllSeriesType } from '@mui/x-charts/models'; -import { ZAxisContextProviderProps } from 'packages/x-charts/build'; +import { ZAxisContextProviderProps } from '@mui/x-charts/context'; export type HeatmapContainerProps = Omit< ChartsSurfaceProps & @@ -49,9 +49,14 @@ const yExtremumGetters = { const formatSeries: SeriesFormatterType<'heatmap'> = (series: AllSeriesType[]) => { // Group series by type const seriesGroups: { heatmap?: FormatterParams<'heatmap'> } = {}; + series.forEach((seriesData, seriesIndex: number) => { const { id = `auto-generated-id-${seriesIndex}`, type } = seriesData; + if (type !== 'heatmap') { + throw new Error('Heatmap does nto suport other series type that "heatmap"'); + } + if (seriesGroups[type] === undefined) { seriesGroups[type] = { series: {}, seriesOrder: [] }; } diff --git a/packages/x-charts-pro/src/Heatmap/HeatmapPlot.tsx b/packages/x-charts-pro/src/Heatmap/HeatmapPlot.tsx index f2e49f2e554d9..a0357869d1cc2 100644 --- a/packages/x-charts-pro/src/Heatmap/HeatmapPlot.tsx +++ b/packages/x-charts-pro/src/Heatmap/HeatmapPlot.tsx @@ -27,7 +27,7 @@ export function HeatmapPlot() { height={yScale.bandwidth()} x={xScale(xDomain[xIndex])} y={yScale(yDomain[yIndex])} - fill={colorScale(value)} + fill={colorScale(value) ?? undefined} /> ); })} diff --git a/packages/x-charts/src/ChartsTooltip/ChartsAxisTooltipContent.tsx b/packages/x-charts/src/ChartsTooltip/ChartsAxisTooltipContent.tsx index c65b9e1e17866..8f4ca252a020c 100644 --- a/packages/x-charts/src/ChartsTooltip/ChartsAxisTooltipContent.tsx +++ b/packages/x-charts/src/ChartsTooltip/ChartsAxisTooltipContent.tsx @@ -78,12 +78,12 @@ function ChartsAxisTooltipContent(props: { let getColor: (index: number) => string; switch (seriesToAdd.type) { - case 'scatter': + case 'line': + case 'bar': getColor = colorGetter( seriesToAdd, xAxis[seriesToAdd.xAxisKey ?? xAxisIds[0]], yAxis[seriesToAdd.yAxisKey ?? yAxisIds[0]], - zAxis[seriesToAdd.zAxisKey ?? zAxisIds[0]], ); break; default: @@ -91,6 +91,7 @@ function ChartsAxisTooltipContent(props: { seriesToAdd, xAxis[seriesToAdd.xAxisKey ?? xAxisIds[0]], yAxis[seriesToAdd.yAxisKey ?? yAxisIds[0]], + zAxis[seriesToAdd.zAxisKey ?? zAxisIds[0]], ); break; } diff --git a/packages/x-charts/src/ChartsTooltip/ChartsItemTooltipContent.tsx b/packages/x-charts/src/ChartsTooltip/ChartsItemTooltipContent.tsx index 2f7183a6fd938..7e9d32f9e742a 100644 --- a/packages/x-charts/src/ChartsTooltip/ChartsItemTooltipContent.tsx +++ b/packages/x-charts/src/ChartsTooltip/ChartsItemTooltipContent.tsx @@ -53,17 +53,18 @@ function ChartsItemTooltipContent(props: { const defaultYAxisId = yAxisIds[0]; const defaultZAxisId = zAxisIds[0]; + let getColor: (index: number) => string; switch (series.type) { case 'pie': getColor = colorGetter(series); break; - case 'scatter': + case 'line': + case 'bar': getColor = colorGetter( series, xAxis[series.xAxisKey ?? defaultXAxisId], yAxis[series.yAxisKey ?? defaultYAxisId], - zAxis[series.zAxisKey ?? defaultZAxisId], ); break; default: @@ -71,6 +72,7 @@ function ChartsItemTooltipContent(props: { series, xAxis[series.xAxisKey ?? defaultXAxisId], yAxis[series.yAxisKey ?? defaultYAxisId], + zAxis[series.zAxisKey ?? defaultZAxisId], ); break; } diff --git a/packages/x-charts/src/ChartsTooltip/DefaultChartsItemTooltipContent.tsx b/packages/x-charts/src/ChartsTooltip/DefaultChartsItemTooltipContent.tsx index 72bba158688b4..29fb6f74338b1 100644 --- a/packages/x-charts/src/ChartsTooltip/DefaultChartsItemTooltipContent.tsx +++ b/packages/x-charts/src/ChartsTooltip/DefaultChartsItemTooltipContent.tsx @@ -28,7 +28,7 @@ function DefaultChartsItemTooltipContent string; +export type ColorGetterType = ( + series: DefaultizedSeriesType, + xAxis?: AxisDefaultized, + yAxis?: AxisDefaultized, + zAxis?: ZAxisDefaultized, +) => string; + +function getColor(series: DefaultizedSeriesType<'pie'>): (dataIndex: number) => string; function getColor( - series: DefaultizedBarSeriesType | DefaultizedLineSeriesType, + series: DefaultizedSeriesType<'line' | 'bar'>, xAxis: AxisDefaultized, yAxis: AxisDefaultized, ): (dataIndex: number) => string; function getColor( - series: DefaultizedScatterSeriesType, + series: DefaultizedSeriesType<'scatter'>, xAxis: AxisDefaultized, yAxis: AxisDefaultized, zAxis?: ZAxisDefaultized, ): (dataIndex: number) => string; function getColor( - series: - | DefaultizedBarSeriesType - | DefaultizedLineSeriesType - | DefaultizedScatterSeriesType - | DefaultizedPieSeriesType, + series: DefaultizedSeriesType, xAxis?: AxisDefaultized, yAxis?: AxisDefaultized, zAxis?: ZAxisDefaultized, @@ -50,6 +48,20 @@ function getColor( return getPieColor(series); } + if (series.type === 'heatmap') { + const colorScale = zAxis?.colorScale; + + if (colorScale) { + return (dataIndex: number) => { + const value = series.data[dataIndex][2]; + if (value !== undefined) { + return colorScale(value) ?? ''; + } + return ''; + }; + } + } + throw Error( `MUI X Charts: getColor called with unexpected arguments for series with id "${series.id}"`, );