plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/stat/Density2dStat.kt [17:75]: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bandWidthX: Double?, bandWidthY: Double?, bandWidthMethod: DensityStat.BandWidthMethod, // Used is `bandWidth` is not set. adjust: Double, kernel: DensityStat.Kernel, nX: Int, nY: Int, isContour: Boolean, binCount: Int, binWidth: Double ) : AbstractDensity2dStat( bandWidthX = bandWidthX, bandWidthY = bandWidthY, bandWidthMethod = bandWidthMethod, adjust = adjust, kernel = kernel, nX = nX, nY = nY, isContour = isContour, binCount = binCount, binWidth = binWidth, defaultMappings = DEF_MAPPING ) { override fun apply(data: DataFrame, statCtx: StatContext, messageConsumer: (s: String) -> Unit): DataFrame { if (!hasRequiredValues(data, Aes.X, Aes.Y)) { return withEmptyStatValues() } val xs = data.getNumeric(TransformVar.X) val ys = data.getNumeric(TransformVar.Y) val finiteIndices = xs.indicesOf(SeriesUtil::isFinite) intersect ys.indicesOf(SeriesUtil::isFinite) // if no data, return empty if (finiteIndices.isEmpty()) { return withEmptyStatValues() } val xVector = xs.slice(finiteIndices).requireNoNulls() val yVector = ys.slice(finiteIndices).requireNoNulls() val groupWeight = BinStatUtil.weightVector(data) .slice(finiteIndices) .map { SeriesUtil.finiteOrNull(it) ?: 0.0 } val xRange = statCtx.overallXRange() val yRange = statCtx.overallYRange() val (stepsX, stepsY, densityMatrix) = density2dGrid(xVector, yVector, groupWeight, xRange!!, yRange!!) val statX = ArrayList() val statY = ArrayList() val statDensity = ArrayList() for (row in 0 until nY) { for (col in 0 until nX) { statX.add(stepsX[col]) statY.add(stepsY[row]) statDensity.add(densityMatrix.getEntry(row, col) / SeriesUtil.sum(groupWeight)) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/stat/Density2dfStat.kt [17:75]: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bandWidthX: Double?, bandWidthY: Double?, bandWidthMethod: DensityStat.BandWidthMethod, // Used is `bandWidth` is not set. adjust: Double, kernel: DensityStat.Kernel, nX: Int, nY: Int, isContour: Boolean, binCount: Int, binWidth: Double ) : AbstractDensity2dStat( bandWidthX = bandWidthX, bandWidthY = bandWidthY, bandWidthMethod = bandWidthMethod, adjust = adjust, kernel = kernel, nX = nX, nY = nY, isContour = isContour, binCount = binCount, binWidth = binWidth, defaultMappings = DEF_MAPPING ) { override fun apply(data: DataFrame, statCtx: StatContext, messageConsumer: (s: String) -> Unit): DataFrame { if (!hasRequiredValues(data, Aes.X, Aes.Y)) { return withEmptyStatValues() } val xs = data.getNumeric(TransformVar.X) val ys = data.getNumeric(TransformVar.Y) val finiteIndices = xs.indicesOf(SeriesUtil::isFinite) intersect ys.indicesOf(SeriesUtil::isFinite) // if no data, return empty if (finiteIndices.isEmpty()) { return withEmptyStatValues() } val xVector = xs.slice(finiteIndices).requireNoNulls() val yVector = ys.slice(finiteIndices).requireNoNulls() val groupWeight = BinStatUtil.weightVector(data) .slice(finiteIndices) .map { SeriesUtil.finiteOrNull(it) ?: 0.0 } val xRange = statCtx.overallXRange() val yRange = statCtx.overallYRange() val (stepsX, stepsY, densityMatrix) = density2dGrid(xVector, yVector, groupWeight, xRange!!, yRange!!) val statX = ArrayList() val statY = ArrayList() val statDensity = ArrayList() for (row in 0 until nY) { for (col in 0 until nX) { statX.add(stepsX[col]) statY.add(stepsY[row]) statDensity.add(densityMatrix.getEntry(row, col) / SeriesUtil.sum(groupWeight)) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -