From e962602a3bcdbd84161784f9517e81e2533a973b Mon Sep 17 00:00:00 2001 From: Rashid Yangazov <129742127+RYangazov@users.noreply.github.com> Date: Thu, 2 Nov 2023 11:36:57 +0100 Subject: [PATCH 1/6] Add random seed into position_jitter() --- .../letsPlot/core/plot/base/pos/JitterDodgePos.kt | 2 +- .../jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt | 7 ++++--- .../letsPlot/core/plot/base/pos/PositionAdjustments.kt | 4 ++-- .../letsPlot/core/plot/builder/assemble/PosProvider.kt | 4 ++-- .../kotlin/org/jetbrains/letsPlot/core/spec/GeomProto.kt | 1 + .../kotlin/org/jetbrains/letsPlot/core/spec/Option.kt | 2 ++ .../kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt | 3 ++- python-package/lets_plot/plot/pos.py | 9 ++++++--- 8 files changed, 20 insertions(+), 12 deletions(-) diff --git a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt index b067401a6c7..e9ed9d14638 100644 --- a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt +++ b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt @@ -17,7 +17,7 @@ class JitterDodgePos(aesthetics: Aesthetics, groupCount: Int, width: Double?, ji private val myDodgePosHelper: PositionAdjustment init { - myJitterPosHelper = JitterPos(jitterWidth, jitterHeight) + myJitterPosHelper = JitterPos(jitterWidth, jitterHeight, seed = null) myDodgePosHelper = DodgePos(aesthetics, groupCount, width) } diff --git a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt index 6b69f5a560a..12ca233c039 100644 --- a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt +++ b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt @@ -12,11 +12,12 @@ import org.jetbrains.letsPlot.core.plot.base.GeomContext import org.jetbrains.letsPlot.core.plot.base.PositionAdjustment import kotlin.random.Random -internal class JitterPos(width: Double?, height: Double?) : PositionAdjustment { +internal class JitterPos(width: Double?, height: Double?, seed: Long?) : PositionAdjustment { //uniform distribution private val myWidth: Double private val myHeight: Double + private val random: Random = seed?.let { Random(seed) } ?: Random.Default init { myWidth = width ?: DEF_JITTER_WIDTH @@ -24,8 +25,8 @@ internal class JitterPos(width: Double?, height: Double?) : PositionAdjustment { } override fun translate(v: DoubleVector, p: DataPointAesthetics, ctx: GeomContext): DoubleVector { - val x = (2 * Random.nextDouble() - 1) * myWidth * ctx.getResolution(Aes.X) - val y = (2 * Random.nextDouble() - 1) * myHeight * ctx.getResolution(Aes.Y) + val x = (2 * random.nextDouble() - 1) * myWidth * ctx.getResolution(Aes.X) + val y = (2 * random.nextDouble() - 1) * myHeight * ctx.getResolution(Aes.Y) return v.add(DoubleVector(x, y)) } diff --git a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/PositionAdjustments.kt b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/PositionAdjustments.kt index 9e60c1c8edd..50bd3dda24a 100644 --- a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/PositionAdjustments.kt +++ b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/PositionAdjustments.kt @@ -51,8 +51,8 @@ object PositionAdjustments { return FillPos(aesthetics, vjust, stackingMode) } - fun jitter(width: Double?, height: Double?): PositionAdjustment { - return JitterPos(width, height) + fun jitter(width: Double?, height: Double?, seed: Long?): PositionAdjustment { + return JitterPos(width, height, seed) } fun nudge(width: Double?, height: Double?): PositionAdjustment { diff --git a/plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/assemble/PosProvider.kt b/plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/assemble/PosProvider.kt index fbfadf6b9a6..e9d3ad33469 100644 --- a/plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/assemble/PosProvider.kt +++ b/plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/assemble/PosProvider.kt @@ -85,10 +85,10 @@ abstract class PosProvider { } } - fun jitter(width: Double?, height: Double?): PosProvider { + fun jitter(width: Double?, height: Double?, seed: Long?): PosProvider { return object : PosProvider() { override fun createPos(ctx: PosProviderContext): PositionAdjustment { - return PositionAdjustments.jitter(width, height) + return PositionAdjustments.jitter(width, height, seed) } override fun handlesGroups(): Boolean { diff --git a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/GeomProto.kt b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/GeomProto.kt index f5acef01016..6333fe04d07 100644 --- a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/GeomProto.kt +++ b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/GeomProto.kt @@ -113,6 +113,7 @@ class GeomProto(val geomKind: GeomKind) { Meta.NAME to PosProto.JITTER, Pos.Jitter.WIDTH to layerOptions.getDouble(Geom.Jitter.WIDTH), Pos.Jitter.HEIGHT to layerOptions.getDouble(Geom.Jitter.HEIGHT), + Pos.Jitter.SEED to layerOptions.getLong(Geom.Jitter.SEED) ) Y_DOT_PLOT -> if (layerOptions.hasOwn(Geom.YDotplot.STACKGROUPS) && diff --git a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/Option.kt b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/Option.kt index 915cd18abdd..4fdd34bbe0b 100644 --- a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/Option.kt +++ b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/Option.kt @@ -247,6 +247,7 @@ object Option { object Jitter { const val WIDTH = "width" const val HEIGHT = "height" + const val SEED = "seed" } object Step { @@ -467,6 +468,7 @@ object Option { object Jitter { const val WIDTH = "width" const val HEIGHT = "height" + const val SEED = "seed" } object Nudge { diff --git a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt index b532d0ed666..60d0e4c55ac 100644 --- a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt +++ b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt @@ -36,7 +36,8 @@ internal object PosProto { FILL -> configureFillPosition(opts) JITTER -> PosProvider.jitter( opts.getDouble(Pos.Jitter.WIDTH), - opts.getDouble(Pos.Jitter.HEIGHT) + opts.getDouble(Pos.Jitter.HEIGHT), + opts.getLong(Pos.Jitter.SEED) ) NUDGE -> PosProvider.nudge( diff --git a/python-package/lets_plot/plot/pos.py b/python-package/lets_plot/plot/pos.py index cc4f54d51cf..f4e48eef8ec 100644 --- a/python-package/lets_plot/plot/pos.py +++ b/python-package/lets_plot/plot/pos.py @@ -96,7 +96,7 @@ def position_dodgev(height=None): return _pos('dodgev', height=height) -def position_jitter(width=None, height=None): +def position_jitter(width=None, height=None, seed=None): """ Adjust position by assigning random noise to points. Better for discrete values. @@ -110,6 +110,9 @@ def position_jitter(width=None, height=None): Jittering height. The value of height is relative and typically ranges between 0 and 0.5. Values that are greater than 0.5 lead to overlapping of the points. + seed : int + A random seed to make the jitter reproducible. + If None (the default value), the seed is initialised with a random value. Returns ------- @@ -137,10 +140,10 @@ def position_jitter(width=None, height=None): ggplot({'x': x, 'y': y, 'c': c}, aes('x', 'y')) + \\ geom_point(aes(fill='c'), show_legend=False, \\ size=8, alpha=.5, shape=21, color='black', \\ - position=position_jitter(width=.2, height=.2)) + position=position_jitter(width=.2, height=.2, seed=42)) """ - return _pos('jitter', width=width, height=height) + return _pos('jitter', width=width, height=height, seed=seed) def position_nudge(x=None, y=None): From fa1cf4eef4207011c59cee53a90a286f7601f3d8 Mon Sep 17 00:00:00 2001 From: Rashid Yangazov <129742127+RYangazov@users.noreply.github.com> Date: Thu, 2 Nov 2023 14:02:50 +0100 Subject: [PATCH 2/6] Adding note in future_changes.md From 7ef76253de60020f9ab70e7c1affaa6a7d350fbd Mon Sep 17 00:00:00 2001 From: Rashid Yangazov <129742127+RYangazov@users.noreply.github.com> Date: Mon, 6 Nov 2023 17:41:37 +0100 Subject: [PATCH 3/6] Set null as default seed value --- future_changes.md | 2 +- .../org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt | 2 +- .../org/jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/future_changes.md b/future_changes.md index ccbe369f3a1..9a1006bf6e4 100644 --- a/future_changes.md +++ b/future_changes.md @@ -5,4 +5,4 @@ ### Changed ### Fixed - +- Jitter reproducibility in geom_jitter [[#911](https://github.com/JetBrains/lets-plot/issues/911)]. diff --git a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt index e9ed9d14638..b067401a6c7 100644 --- a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt +++ b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt @@ -17,7 +17,7 @@ class JitterDodgePos(aesthetics: Aesthetics, groupCount: Int, width: Double?, ji private val myDodgePosHelper: PositionAdjustment init { - myJitterPosHelper = JitterPos(jitterWidth, jitterHeight, seed = null) + myJitterPosHelper = JitterPos(jitterWidth, jitterHeight) myDodgePosHelper = DodgePos(aesthetics, groupCount, width) } diff --git a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt index 12ca233c039..35eb919dd09 100644 --- a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt +++ b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt @@ -12,7 +12,7 @@ import org.jetbrains.letsPlot.core.plot.base.GeomContext import org.jetbrains.letsPlot.core.plot.base.PositionAdjustment import kotlin.random.Random -internal class JitterPos(width: Double?, height: Double?, seed: Long?) : PositionAdjustment { +internal class JitterPos(width: Double?, height: Double?, seed: Long? = null) : PositionAdjustment { //uniform distribution private val myWidth: Double From 6c1b039570259b2aed7b8ac635d6185b9ed02108 Mon Sep 17 00:00:00 2001 From: Rashid Yangazov <129742127+RYangazov@users.noreply.github.com> Date: Tue, 7 Nov 2023 16:41:17 +0100 Subject: [PATCH 4/6] Support seed in jitterdodge. --- future_changes.md | 2 +- .../letsPlot/core/plot/base/pos/JitterDodgePos.kt | 11 +++++++++-- .../letsPlot/core/plot/base/pos/JitterPos.kt | 1 - .../core/plot/base/pos/PositionAdjustments.kt | 5 +++-- .../core/plot/builder/assemble/PosProvider.kt | 11 +++++++++-- .../kotlin/org/jetbrains/letsPlot/core/spec/Option.kt | 1 + .../org/jetbrains/letsPlot/core/spec/PosProto.kt | 3 ++- python-package/lets_plot/plot/pos.py | 10 +++++++--- 8 files changed, 32 insertions(+), 12 deletions(-) diff --git a/future_changes.md b/future_changes.md index 9a1006bf6e4..0602286d3d1 100644 --- a/future_changes.md +++ b/future_changes.md @@ -5,4 +5,4 @@ ### Changed ### Fixed -- Jitter reproducibility in geom_jitter [[#911](https://github.com/JetBrains/lets-plot/issues/911)]. +- Jitter reproducibility in geom_jitter, position_jitter, position_jitterdodge [[#911](https://github.com/JetBrains/lets-plot/issues/911)]. diff --git a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt index b067401a6c7..4d23f79d84a 100644 --- a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt +++ b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt @@ -11,13 +11,20 @@ import org.jetbrains.letsPlot.core.plot.base.DataPointAesthetics import org.jetbrains.letsPlot.core.plot.base.GeomContext import org.jetbrains.letsPlot.core.plot.base.PositionAdjustment -class JitterDodgePos(aesthetics: Aesthetics, groupCount: Int, width: Double?, jitterWidth: Double?, jitterHeight: Double?) : +class JitterDodgePos( + aesthetics: Aesthetics, + groupCount: Int, + width: Double?, + jitterWidth: Double?, + jitterHeight: Double?, + jitterSeed: Long? = null +) : PositionAdjustment { private val myJitterPosHelper: PositionAdjustment private val myDodgePosHelper: PositionAdjustment init { - myJitterPosHelper = JitterPos(jitterWidth, jitterHeight) + myJitterPosHelper = JitterPos(jitterWidth, jitterHeight, jitterSeed) myDodgePosHelper = DodgePos(aesthetics, groupCount, width) } diff --git a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt index 35eb919dd09..5cde049dea1 100644 --- a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt +++ b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterPos.kt @@ -35,7 +35,6 @@ internal class JitterPos(width: Double?, height: Double?, seed: Long? = null) : } companion object { - val DEF_JITTER_WIDTH = 0.4 val DEF_JITTER_HEIGHT = 0.4 } diff --git a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/PositionAdjustments.kt b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/PositionAdjustments.kt index 50bd3dda24a..c652d750950 100644 --- a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/PositionAdjustments.kt +++ b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/PositionAdjustments.kt @@ -64,9 +64,10 @@ object PositionAdjustments { groupCount: Int, width: Double?, jitterWidth: Double?, - jitterHeight: Double? + jitterHeight: Double?, + jitterSeed: Long? ): PositionAdjustment { - return JitterDodgePos(aesthetics, groupCount, width, jitterWidth, jitterHeight) + return JitterDodgePos(aesthetics, groupCount, width, jitterWidth, jitterHeight, jitterSeed) } enum class Meta(private val handlesGroups: Boolean) { diff --git a/plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/assemble/PosProvider.kt b/plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/assemble/PosProvider.kt index e9d3ad33469..a48e6277021 100644 --- a/plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/assemble/PosProvider.kt +++ b/plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/assemble/PosProvider.kt @@ -115,12 +115,19 @@ abstract class PosProvider { } */ - fun jitterDodge(width: Double?, jitterWidth: Double?, jitterHeight: Double?): PosProvider { + fun jitterDodge(width: Double?, jitterWidth: Double?, jitterHeight: Double?, jitterSeed: Long?): PosProvider { return object : PosProvider() { override fun createPos(ctx: PosProviderContext): PositionAdjustment { val aesthetics = ctx.aesthetics val groupCount = ctx.groupCount - return PositionAdjustments.jitterDodge(aesthetics, groupCount, width, jitterWidth, jitterHeight) + return PositionAdjustments.jitterDodge( + aesthetics, + groupCount, + width, + jitterWidth, + jitterHeight, + jitterSeed + ) } override fun handlesGroups(): Boolean { diff --git a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/Option.kt b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/Option.kt index 4fdd34bbe0b..b97e08cd1a1 100644 --- a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/Option.kt +++ b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/Option.kt @@ -480,6 +480,7 @@ object Option { const val DODGE_WIDTH = "dodge_width" const val JITTER_WIDTH = "jitter_width" const val JITTER_HEIGHT = "jitter_height" + const val JITTER_SEED = "jitter_seed" } object Stack { diff --git a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt index 60d0e4c55ac..b6c6109e62a 100644 --- a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt +++ b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt @@ -48,7 +48,8 @@ internal object PosProto { JITTER_DODGE -> PosProvider.jitterDodge( opts.getDouble(Pos.JitterDodge.DODGE_WIDTH), opts.getDouble(Pos.JitterDodge.JITTER_WIDTH), - opts.getDouble(Pos.JitterDodge.JITTER_HEIGHT) + opts.getDouble(Pos.JitterDodge.JITTER_HEIGHT), + opts.getLong(Pos.JitterDodge.JITTER_SEED) ) else -> throw IllegalArgumentException("Unknown position adjustments name: '$posName'") diff --git a/python-package/lets_plot/plot/pos.py b/python-package/lets_plot/plot/pos.py index f4e48eef8ec..43ac46340c9 100644 --- a/python-package/lets_plot/plot/pos.py +++ b/python-package/lets_plot/plot/pos.py @@ -188,7 +188,7 @@ def position_nudge(x=None, y=None): return _pos('nudge', x=x, y=y) -def position_jitterdodge(dodge_width=None, jitter_width=None, jitter_height=None): +def position_jitterdodge(dodge_width=None, jitter_width=None, jitter_height=None, jitter_seed=None): """ This is primarily used for aligning points generated through `geom_point()` with dodged boxplots (e.g., a `geom_boxplot()` with a fill aesthetic supplied). @@ -207,6 +207,9 @@ def position_jitterdodge(dodge_width=None, jitter_width=None, jitter_height=None Jittering height. The value of `jitter_height` is relative and typically ranges between 0 and 0.5. Values that are greater than 0.5 lead to overlapping of the points. + jitter_seed : int + A random seed to make the jitter reproducible. + If None (the default value), the seed is initialised with a random value. Returns ------- @@ -235,10 +238,11 @@ def position_jitterdodge(dodge_width=None, jitter_width=None, jitter_height=None stat='boxplot') + \\ geom_point(aes(x='c', y='x', color='c'), \\ size=4, shape=21, fill='white', - position=position_jitterdodge()) + position=position_jitterdodge(jitter_seed=42)) """ - return _pos('jitterdodge', dodge_width=dodge_width, jitter_width=jitter_width, jitter_height=jitter_height) + return _pos('jitterdodge', dodge_width=dodge_width, jitter_width=jitter_width, jitter_height=jitter_height, + jitter_seed=jitter_seed) def position_stack(vjust=None, mode=None): From 9b330c29f7044dbb189e319dcce44d8bdbae6b59 Mon Sep 17 00:00:00 2001 From: Rashid Yangazov <129742127+RYangazov@users.noreply.github.com> Date: Tue, 7 Nov 2023 20:47:08 +0100 Subject: [PATCH 5/6] Documented seed for geom_jitter() function --- python-package/lets_plot/plot/geom.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/python-package/lets_plot/plot/geom.py b/python-package/lets_plot/plot/geom.py index aac078b024e..db77002bb88 100644 --- a/python-package/lets_plot/plot/geom.py +++ b/python-package/lets_plot/plot/geom.py @@ -4593,9 +4593,9 @@ def geom_density2df(mapping=None, *, data=None, stat=None, position=None, show_l def geom_jitter(mapping=None, *, data=None, stat=None, position=None, show_legend=None, sampling=None, tooltips=None, - width=None, - height=None, + width=None, height=None, color_by=None, fill_by=None, + seed=None, **other_args): """ Display jittered points, especially for discrete plots or dense plots. @@ -4637,6 +4637,9 @@ def geom_jitter(mapping=None, *, data=None, stat=None, position=None, show_legen Define the color aesthetic for the geometry. fill_by : {'fill', 'color', 'paint_a', 'paint_b', 'paint_c'}, default='fill' Define the fill aesthetic for the geometry. + seed : int + A random seed to make the jitter reproducible. + If None (the default value), the seed is initialised with a random value. other_args Other arguments passed on to the layer. These are often aesthetics settings used to set an aesthetic to a fixed value, @@ -4697,6 +4700,7 @@ def geom_jitter(mapping=None, *, data=None, stat=None, position=None, show_legen ggplot({'x': x, 'y': y}, aes(x='x', y='y')) + \\ geom_jitter(aes(color='x', size='y'), \\ sampling=sampling_random(n=600, seed=60), \\ + seed=37, + \\ show_legend=False, width=.25) + \\ scale_color_grey(start=.75, end=0) + \\ scale_size(range=[1, 3]) @@ -4712,6 +4716,7 @@ def geom_jitter(mapping=None, *, data=None, stat=None, position=None, show_legen tooltips=tooltips, width=width, height=height, color_by=color_by, fill_by=fill_by, + seed=seed, **other_args) From b610d2e847d9edaf9f1247b3224a4924f3fa712a Mon Sep 17 00:00:00 2001 From: Rashid Yangazov <129742127+RYangazov@users.noreply.github.com> Date: Wed, 8 Nov 2023 18:43:21 +0100 Subject: [PATCH 6/6] Changing parameter name to align with the name in ggplot2. --- .../letsPlot/core/plot/base/pos/JitterDodgePos.kt | 4 ++-- .../letsPlot/core/plot/base/pos/PositionAdjustments.kt | 4 ++-- .../letsPlot/core/plot/builder/assemble/PosProvider.kt | 4 ++-- .../kotlin/org/jetbrains/letsPlot/core/spec/Option.kt | 2 +- .../kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt | 2 +- python-package/lets_plot/plot/pos.py | 8 ++++---- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt index 4d23f79d84a..8747776088a 100644 --- a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt +++ b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/JitterDodgePos.kt @@ -17,14 +17,14 @@ class JitterDodgePos( width: Double?, jitterWidth: Double?, jitterHeight: Double?, - jitterSeed: Long? = null + seed: Long? = null ) : PositionAdjustment { private val myJitterPosHelper: PositionAdjustment private val myDodgePosHelper: PositionAdjustment init { - myJitterPosHelper = JitterPos(jitterWidth, jitterHeight, jitterSeed) + myJitterPosHelper = JitterPos(jitterWidth, jitterHeight, seed) myDodgePosHelper = DodgePos(aesthetics, groupCount, width) } diff --git a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/PositionAdjustments.kt b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/PositionAdjustments.kt index c652d750950..9f17878b5b4 100644 --- a/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/PositionAdjustments.kt +++ b/plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/pos/PositionAdjustments.kt @@ -65,9 +65,9 @@ object PositionAdjustments { width: Double?, jitterWidth: Double?, jitterHeight: Double?, - jitterSeed: Long? + seed: Long? ): PositionAdjustment { - return JitterDodgePos(aesthetics, groupCount, width, jitterWidth, jitterHeight, jitterSeed) + return JitterDodgePos(aesthetics, groupCount, width, jitterWidth, jitterHeight, seed) } enum class Meta(private val handlesGroups: Boolean) { diff --git a/plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/assemble/PosProvider.kt b/plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/assemble/PosProvider.kt index a48e6277021..47c1992e9be 100644 --- a/plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/assemble/PosProvider.kt +++ b/plot-builder/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/builder/assemble/PosProvider.kt @@ -115,7 +115,7 @@ abstract class PosProvider { } */ - fun jitterDodge(width: Double?, jitterWidth: Double?, jitterHeight: Double?, jitterSeed: Long?): PosProvider { + fun jitterDodge(width: Double?, jitterWidth: Double?, jitterHeight: Double?, seed: Long?): PosProvider { return object : PosProvider() { override fun createPos(ctx: PosProviderContext): PositionAdjustment { val aesthetics = ctx.aesthetics @@ -126,7 +126,7 @@ abstract class PosProvider { width, jitterWidth, jitterHeight, - jitterSeed + seed ) } diff --git a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/Option.kt b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/Option.kt index b97e08cd1a1..67e3fc557fb 100644 --- a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/Option.kt +++ b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/Option.kt @@ -480,7 +480,7 @@ object Option { const val DODGE_WIDTH = "dodge_width" const val JITTER_WIDTH = "jitter_width" const val JITTER_HEIGHT = "jitter_height" - const val JITTER_SEED = "jitter_seed" + const val SEED = "seed" } object Stack { diff --git a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt index b6c6109e62a..cb1360386d0 100644 --- a/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt +++ b/plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/PosProto.kt @@ -49,7 +49,7 @@ internal object PosProto { opts.getDouble(Pos.JitterDodge.DODGE_WIDTH), opts.getDouble(Pos.JitterDodge.JITTER_WIDTH), opts.getDouble(Pos.JitterDodge.JITTER_HEIGHT), - opts.getLong(Pos.JitterDodge.JITTER_SEED) + opts.getLong(Pos.JitterDodge.SEED) ) else -> throw IllegalArgumentException("Unknown position adjustments name: '$posName'") diff --git a/python-package/lets_plot/plot/pos.py b/python-package/lets_plot/plot/pos.py index 43ac46340c9..233293f9225 100644 --- a/python-package/lets_plot/plot/pos.py +++ b/python-package/lets_plot/plot/pos.py @@ -188,7 +188,7 @@ def position_nudge(x=None, y=None): return _pos('nudge', x=x, y=y) -def position_jitterdodge(dodge_width=None, jitter_width=None, jitter_height=None, jitter_seed=None): +def position_jitterdodge(dodge_width=None, jitter_width=None, jitter_height=None, seed=None): """ This is primarily used for aligning points generated through `geom_point()` with dodged boxplots (e.g., a `geom_boxplot()` with a fill aesthetic supplied). @@ -207,7 +207,7 @@ def position_jitterdodge(dodge_width=None, jitter_width=None, jitter_height=None Jittering height. The value of `jitter_height` is relative and typically ranges between 0 and 0.5. Values that are greater than 0.5 lead to overlapping of the points. - jitter_seed : int + seed : int A random seed to make the jitter reproducible. If None (the default value), the seed is initialised with a random value. @@ -238,11 +238,11 @@ def position_jitterdodge(dodge_width=None, jitter_width=None, jitter_height=None stat='boxplot') + \\ geom_point(aes(x='c', y='x', color='c'), \\ size=4, shape=21, fill='white', - position=position_jitterdodge(jitter_seed=42)) + position=position_jitterdodge(seed=42)) """ return _pos('jitterdodge', dodge_width=dodge_width, jitter_width=jitter_width, jitter_height=jitter_height, - jitter_seed=jitter_seed) + seed=seed) def position_stack(vjust=None, mode=None):