Skip to content

Commit

Permalink
Log10 transform: exclude 0 from applicable domain.
Browse files Browse the repository at this point in the history
  • Loading branch information
alshan committed Aug 11, 2021
1 parent 7853ed4 commit 13abf3a
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@ internal class Log10Transform : FunTransform(
override fun hasDomainLimits() = true

override fun isInDomain(v: Double?): Boolean {
return SeriesUtil.isFinite(v) && v!! >= 0.0
return SeriesUtil.isFinite(v) && v!! >= LOWER_LIM_DOMAIN
}

private fun isZero(v: Double?): Boolean {
return SeriesUtil.isFinite(v) && v!! >= 0.0 && v < LOWER_LIM_DOMAIN
}

override fun apply(v: Double?): Double? {
Expand All @@ -32,22 +36,28 @@ internal class Log10Transform : FunTransform(
override fun createApplicableDomain(middle: Double?): ClosedRange<Double> {
@Suppress("NAME_SHADOWING")
val middle = when {
isInDomain(middle) -> max(middle!!, 0.0)
isInDomain(middle) -> max(middle!!, LOWER_LIM_DOMAIN)
isZero(middle) -> LOWER_LIM_DOMAIN // Special case.
else -> 1.0
}

return ClosedRange(max(middle - 0.5, 0.0), middle + 0.5)
val lower = if (middle < 1) {
middle / 2
} else {
middle - 0.5
}
return ClosedRange(max(lower, LOWER_LIM_DOMAIN), middle + 0.5)
}

override fun toApplicableDomain(range: ClosedRange<Double>): ClosedRange<Double> {
val lower = max(range.lowerEnd, 0.0)
val lower = max(range.lowerEnd, LOWER_LIM_DOMAIN)
val upper = max(range.upperEnd, lower)
return ClosedRange(lower, upper)
}

companion object {
internal const val LOWER_LIM_TRANSFOTMED: Double = -Double.MAX_VALUE / 10
// internal const val LOWER_LIM_DOMAIN: Double = Double.MIN_VALUE * 10
internal const val LOWER_LIM_DOMAIN: Double = Double.MIN_VALUE * 10

/**
* Avoid transforming 0.0 -> -Infinity
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ internal class CreateApplicableDomainTest(
arrayOf(
Transforms.LOG10,
0.0,
ClosedRange(0.0, 0.5)
ClosedRange(Log10Transform.LOWER_LIM_DOMAIN, 0.5)
),
arrayOf(
Transforms.LOG10,
Expand All @@ -142,7 +142,7 @@ internal class CreateApplicableDomainTest(
arrayOf(
Transforms.LOG10,
0.3,
ClosedRange(0.0, 0.8)
ClosedRange(0.15, 0.8)
),
arrayOf(
Transforms.LOG10,
Expand All @@ -152,7 +152,7 @@ internal class CreateApplicableDomainTest(
arrayOf(
Transforms.LOG10,
10.0.pow(-20),
ClosedRange(0.0, 0.5)
ClosedRange(5.0E-21, 0.5)
),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,12 +115,12 @@ internal class EnsureApplicableDomainTest(
ClosedRange(0.0, 5.0)
),
arrayOf(
Transforms.LOG10,
Transforms.SQRT,
ClosedRange(0.0, 0.0),
ClosedRange(0.0, 0.5)
),
arrayOf(
Transforms.LOG10,
Transforms.SQRT,
ClosedRange(10.0, 10.0),
ClosedRange(9.5, 10.5)
),
Expand All @@ -137,27 +137,27 @@ internal class EnsureApplicableDomainTest(
arrayOf(
Transforms.LOG10,
ClosedRange(-5.0, -5.0),
ClosedRange(0.0, 0.5)
ClosedRange(Log10Transform.LOWER_LIM_DOMAIN, 0.5)
),
arrayOf(
Transforms.LOG10,
ClosedRange(-5.0, 0.0),
ClosedRange(0.0, 0.5)
ClosedRange(Log10Transform.LOWER_LIM_DOMAIN, 0.5)
),
arrayOf(
Transforms.LOG10,
ClosedRange(-5.0, 5.0),
ClosedRange(0.0, 5.0)
ClosedRange(Log10Transform.LOWER_LIM_DOMAIN, 5.0)
),
arrayOf(
Transforms.LOG10,
ClosedRange(0.0, 5.0),
ClosedRange(0.0, 5.0)
ClosedRange(Log10Transform.LOWER_LIM_DOMAIN, 5.0)
),
arrayOf(
Transforms.LOG10,
ClosedRange(0.0, 0.0),
ClosedRange(0.0, 0.5)
ClosedRange(Log10Transform.LOWER_LIM_DOMAIN, 0.5)
),
arrayOf(
Transforms.LOG10,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,6 @@ object DataProcessing {
/**
* Server-side only
*/

private fun applyStat(
data: DataFrame,
stat: Stat,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,29 @@ import jetbrains.datalore.plot.builder.layout.AxisLayoutInfo
import jetbrains.datalore.plot.builder.layout.axis.label.AxisLabelsLayout
import jetbrains.datalore.plot.builder.theme.AxisTheme

abstract class AxisLayouter protected constructor(val orientation: jetbrains.datalore.plot.builder.guide.Orientation, val domainRange: ClosedRange<Double>, val labelsLayout: AxisLabelsLayout) {
abstract class AxisLayouter(
val orientation: jetbrains.datalore.plot.builder.guide.Orientation,
private val domainRange: ClosedRange<Double>,
private val labelsLayout: AxisLabelsLayout
) {

fun doLayout(axisLength: Double, maxTickLabelsBounds: DoubleRectangle?): AxisLayoutInfo {
val labelsInfo = labelsLayout.doLayout(axisLength, toAxisMapper(axisLength), maxTickLabelsBounds)
val labelsBounds = labelsInfo.bounds

val builder = AxisLayoutInfo.Builder()
.axisBreaks(labelsInfo.breaks)
.axisLength(axisLength)
.orientation(orientation)
.axisDomain(domainRange)
.tickLabelsBoundsMax(maxTickLabelsBounds)
// todo: add 1 labels info object
.tickLabelSmallFont(labelsInfo.smallFont)
.tickLabelAdditionalOffsets(labelsInfo.labelAdditionalOffsets)
.tickLabelHorizontalAnchor(labelsInfo.labelHorizontalAnchor)
.tickLabelVerticalAnchor(labelsInfo.labelVerticalAnchor)
.tickLabelRotationAngle(labelsInfo.labelRotationAngle)
.tickLabelsBounds(labelsBounds)
.axisBreaks(labelsInfo.breaks)
.axisLength(axisLength)
.orientation(orientation)
.axisDomain(domainRange)
.tickLabelsBoundsMax(maxTickLabelsBounds)
// todo: add 1 labels info object
.tickLabelSmallFont(labelsInfo.smallFont)
.tickLabelAdditionalOffsets(labelsInfo.labelAdditionalOffsets)
.tickLabelHorizontalAnchor(labelsInfo.labelHorizontalAnchor)
.tickLabelVerticalAnchor(labelsInfo.labelVerticalAnchor)
.tickLabelRotationAngle(labelsInfo.labelRotationAngle)
.tickLabelsBounds(labelsBounds)

return builder.build()
}
Expand All @@ -42,15 +46,21 @@ abstract class AxisLayouter protected constructor(val orientation: jetbrains.dat
}

companion object {
fun create(orientation: jetbrains.datalore.plot.builder.guide.Orientation,
axisDomain: ClosedRange<Double>, breaksProvider: AxisBreaksProvider, theme: AxisTheme): AxisLayouter {
fun create(
orientation: jetbrains.datalore.plot.builder.guide.Orientation,
axisDomain: ClosedRange<Double>, breaksProvider: AxisBreaksProvider, theme: AxisTheme
): AxisLayouter {

if (orientation.isHorizontal) {
val labelsLayout: AxisLabelsLayout
if (breaksProvider.isFixedBreaks) {
labelsLayout = AxisLabelsLayout.horizontalFixedBreaks(orientation, axisDomain, breaksProvider.fixedBreaks, theme)
val labelsLayout: AxisLabelsLayout = if (breaksProvider.isFixedBreaks) {
AxisLabelsLayout.horizontalFixedBreaks(
orientation,
axisDomain,
breaksProvider.fixedBreaks,
theme
)
} else {
labelsLayout = AxisLabelsLayout.horizontalFlexBreaks(orientation, axisDomain, breaksProvider, theme)
AxisLabelsLayout.horizontalFlexBreaks(orientation, axisDomain, breaksProvider, theme)
}
return HorizontalAxisLayouter(
orientation,
Expand All @@ -60,11 +70,10 @@ abstract class AxisLayouter protected constructor(val orientation: jetbrains.dat
}

// vertical
val labelsLayout: AxisLabelsLayout
if (breaksProvider.isFixedBreaks) {
labelsLayout = AxisLabelsLayout.verticalFixedBreaks(orientation, axisDomain, breaksProvider.fixedBreaks, theme)
val labelsLayout: AxisLabelsLayout = if (breaksProvider.isFixedBreaks) {
AxisLabelsLayout.verticalFixedBreaks(orientation, axisDomain, breaksProvider.fixedBreaks, theme)
} else {
labelsLayout = AxisLabelsLayout.verticalFlexBreaks(orientation, axisDomain, breaksProvider, theme)
AxisLabelsLayout.verticalFlexBreaks(orientation, axisDomain, breaksProvider, theme)
}
return VerticalAxisLayouter(
orientation,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,14 @@ package jetbrains.datalore.plot.builder.layout.axis

import jetbrains.datalore.base.gcommon.collect.ClosedRange
import jetbrains.datalore.plot.base.coord.Coords
import jetbrains.datalore.plot.builder.guide.Orientation
import jetbrains.datalore.plot.builder.layout.axis.label.AxisLabelsLayout

class HorizontalAxisLayouter(orientation: jetbrains.datalore.plot.builder.guide.Orientation, domainRange: ClosedRange<Double>, labelsLayout: AxisLabelsLayout) : AxisLayouter(orientation, domainRange, labelsLayout) {
class HorizontalAxisLayouter(
orientation: Orientation,
domainRange: ClosedRange<Double>,
labelsLayout: AxisLabelsLayout
) : AxisLayouter(orientation, domainRange, labelsLayout) {

override fun toAxisMapper(axisLength: Double): (Double?) -> Double? {
val scaleMapper = toScaleMapper(axisLength)
Expand Down

0 comments on commit 13abf3a

Please sign in to comment.