in plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/PolarAxisUtil.kt [44:116]
fun breaksData(): PolarBreaksData {
check(scaleBreaks.transformedValues.size == scaleBreaks.labels.size) {
"Breaks and labels must have the same size"
}
val majorBreaks = breaksToClient(scaleBreaks.transformedValues)
.mapIndexed { i, clientTick ->
IndexedValue(i, Triple(scaleBreaks.labels[i], scaleBreaks.transformedValues[i], clientTick))
}
.let {
if (it.size < 2) return@let it
val firstBr = it.first()
val lastBr = it.last()
if (firstBr.coord.subtract(lastBr.coord).length() > 3.0) return@let it
val newFirstBr = IndexedValue(
index = firstBr.index,
value = Triple(
"${lastBr.label}/${firstBr.label}", // Merge first and last label
firstBr.domValue,
firstBr.coord
)
)
val newLastBr = IndexedValue(
index = lastBr.index,
value = Triple(
"", // Empty label to not duplicate the merged label
lastBr.domValue,
lastBr.coord
)
)
val cleaned = it.toMutableList()
cleaned[newFirstBr.index] = newFirstBr
cleaned[newLastBr.index] = newLastBr
cleaned
}
val majorBreaksData = majorBreaks.mapNotNull { (_, br) ->
val (label, domainTick, clientTick) = br
val clientLine = buildGridLine(domainTick) ?: return@mapNotNull null
Triple(label, clientTick, clientLine)
}
val minorBreaks = minorDomainBreaks(majorBreaks.map { it.value.second })
.let { minorDomainBreaks ->
breaksToClient(minorDomainBreaks)
.mapIndexed { i, clientBreak -> Pair(minorDomainBreaks[i], clientBreak) }
}
val minorBreaksData = minorBreaks.mapNotNull { (domainTick, clientTick) ->
val clientLine = buildGridLine(domainTick) ?: return@mapNotNull null
Pair(clientTick, clientLine)
}
val axisLine = when (!orientation.isHorizontal) {
true -> listOf(gridDomain.xRange().upperEnd).mapNotNull(::buildAngleGridLine).single()
false -> listOf(gridDomain.yRange().upperEnd).mapNotNull(::buildRadiusGridLine).single()
}
return PolarBreaksData(
majorBreaks = majorBreaksData.map { (_, tick, _) -> tick },
majorGrid = majorBreaksData.map { (_, _, gridLine) -> gridLine },
majorLabels = majorBreaksData.map { (label, _, _) -> label },
minorBreaks = minorBreaksData.map { (tick, _) -> tick },
minorGrid = minorBreaksData.map { (_, gridLine) -> gridLine },
axisLine = axisLine,
center = center,
startAngle = coord.startAngle,
)
}