in plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/front/PlotConfigFrontendUtil.kt [106:188]
fun createPlotGeomTiles(
config: PlotConfigFrontend,
sharedContinuousDomainX: DoubleSpan? = null,
sharedContinuousDomainY: DoubleSpan? = null,
): PlotGeomTiles {
// Scale "before facets".
val (mappersByAesNP, scaleByAesBeforeFacets) =
createMappersAndScalesBeforeFacets(config).let { (mappers, scales) ->
// Adjust domains of continuous scales when axis are shared between plots in a composite figure.
val scalesAdjusted: Map<Aes<*>, Scale> = scales.mapValues { (aes, scale) ->
if (aes == Aes.X && sharedContinuousDomainX != null) {
scale.with().continuousTransform(
Transforms.continuousWithLimits(
scale.transform as ContinuousTransform,
sharedContinuousDomainX.toPair()
)
).build()
} else if (aes == Aes.Y && sharedContinuousDomainY != null) {
scale.with().continuousTransform(
Transforms.continuousWithLimits(
scale.transform as ContinuousTransform,
sharedContinuousDomainY.toPair()
)
).build()
} else {
scale
}
}
// Take only non-positional mappers
Pair(
mappers.filterKeys { !Aes.isPositional(it) },
scalesAdjusted
)
}
// Coord provider
val statPreferredCoordProvider: CoordProvider? = config.layerConfigs.firstNotNullOfOrNull {
StatProto.preferredCoordinateSystem(it.statKind)
}
val geomPreferredCoordProvider: CoordProvider? = config.layerConfigs.firstNotNullOfOrNull {
it.geomProto.preferredCoordinateSystem(it)
}
val defaultCoordProvider =
statPreferredCoordProvider ?: geomPreferredCoordProvider ?: CoordProviders.cartesian()
val coordProvider = CoordConfig.createCoordProvider(
config[Option.Plot.COORD],
scaleByAesBeforeFacets.getValue(Aes.X).transform,
scaleByAesBeforeFacets.getValue(Aes.Y).transform,
defaultCoordProvider
).let { coordProvider ->
@Suppress("UNCHECKED_CAST")
config[SPEC_OVERRIDE]?.let { specOverride ->
val accessor = over(specOverride as Map<String, Any>)
val xlimOverride = accessor.getNumQPairDef(SpecOverride.COORD_XLIM_TRANSFORMED, Pair(null, null))
.let { Pair(it.first?.toDouble(), it.second?.toDouble()) }
val ylimOverride = accessor.getNumQPairDef(SpecOverride.COORD_YLIM_TRANSFORMED, Pair(null, null))
.let { Pair(it.first?.toDouble(), it.second?.toDouble()) }
coordProvider
.withXlimOverride(xlimOverride)
.withYlimOverride(ylimOverride)
} ?: coordProvider
}.let {
if (it.isPolar) {
(it as PolarCoordProvider).withHScaleContinuous(scaleByAesBeforeFacets.getValue(Aes.X).isContinuousDomain)
} else {
it
}
}
return PlotTilesConfig.createGeomTiles(
config.layerConfigs,
config.facets,
coordProvider,
scaleByAesBeforeFacets,
mappersByAesNP,
config.theme,
config.theme.fontFamilyRegistry,
)
}