fun build()

in plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/assemble/GeomLayerBuilder.kt [177:256]


    fun build(
        data: DataFrame,
        scaleMap: Map<Aes<*>, Scale>,
        scaleMapppersNP: Map<Aes<*>, ScaleMapper<*>>,
    ): GeomLayer {
        val transformByAes: Map<Aes<*>, Transform> = scaleMap.keys.associateWith {
            scaleMap.getValue(it).transform
        }

        @Suppress("NAME_SHADOWING")
        var data = data
        if (myDataPreprocessor != null) {
            // Test and Demo
            data = myDataPreprocessor!!(data, transformByAes)
        }

        // make sure 'original' series are transformed
        data = DataProcessing.transformOriginals(data, myBindings, transformByAes)

        val replacementBindings = HashMap(
            // No 'origin' variables beyond this point.
            // Replace all 'origin' variables in bindings with 'transform' variables
            myBindings.associate {
                it.aes to if (it.variable.isOrigin) {
                    val transformVar = DataFrameUtil.transformVarFor(it.aes)
                    VarBinding(transformVar, it.aes)
                } else {
                    it
                }
            }
        )

        // add 'transform' variable for each 'stat' variable
        val bindingsToPut = ArrayList<VarBinding>()
        for (binding in replacementBindings.values) {
            val variable = binding.variable
            if (variable.isStat) {
                val aes = binding.aes
                val transform = transformByAes.getValue(aes)
                val transformVar = TransformVar.forAes(aes)
                data = DataFrameUtil.applyTransform(data, variable, transformVar, transform)
                bindingsToPut.add(VarBinding(transformVar, aes))
            }
        }

        // replace 'stat' vars with 'transform' vars in bindings
        for (binding in bindingsToPut) {
            replacementBindings[binding.aes] = binding
        }

        val groupingContext = if (handlesGroups()) {
            GroupingContext.create(data, explicitGroupingVarNames, myBindings, myPathIdVarName)
        } else {
            GroupingContext.singleGroup()
        }
        return MyGeomLayer(
            data,
            geomProvider,
            myGeomTheme,
            posProvider,
            groupingContext.groupMapper,
            replacementBindings,
            myConstantByAes,
            scaleMap,
            scaleMapppersNP,
            myLocatorLookupSpec,
            myContextualMappingProvider,
            myIsLegendDisabled,
            myCustomLegendOptions,
            isYOrientation = isYOrientation,
            isMarginal = isMarginal,
            marginalSide = marginalSide,
            marginalSize = marginalSize,
            fontFamilyRegistry = fontFamilyRegistry,
            colorByAes = colorByAes,
            fillByAes = fillByAes,
            annotationProvider = myAnnotationProvider,
            defaultFormatters = myDefaultFormatters,
        )
    }