ggplot2-python 4.0.2.9000__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. ggplot2_py/__init__.py +852 -0
  2. ggplot2_py/_compat.py +475 -0
  3. ggplot2_py/_plugins.py +129 -0
  4. ggplot2_py/_utils.py +544 -0
  5. ggplot2_py/aes.py +586 -0
  6. ggplot2_py/annotation.py +540 -0
  7. ggplot2_py/coord.py +2108 -0
  8. ggplot2_py/coords/__init__.py +49 -0
  9. ggplot2_py/datasets.py +265 -0
  10. ggplot2_py/draw_key.py +454 -0
  11. ggplot2_py/facet.py +1456 -0
  12. ggplot2_py/fortify.py +95 -0
  13. ggplot2_py/geom.py +4516 -0
  14. ggplot2_py/geoms/__init__.py +12 -0
  15. ggplot2_py/ggproto.py +279 -0
  16. ggplot2_py/guide.py +2925 -0
  17. ggplot2_py/guide_axis.py +615 -0
  18. ggplot2_py/guide_colourbar.py +657 -0
  19. ggplot2_py/guide_legend.py +1061 -0
  20. ggplot2_py/guides/__init__.py +8 -0
  21. ggplot2_py/labeller.py +296 -0
  22. ggplot2_py/labels.py +309 -0
  23. ggplot2_py/layer.py +954 -0
  24. ggplot2_py/layout.py +754 -0
  25. ggplot2_py/limits.py +314 -0
  26. ggplot2_py/plot.py +1401 -0
  27. ggplot2_py/plot_render.py +866 -0
  28. ggplot2_py/position.py +1269 -0
  29. ggplot2_py/protocols.py +171 -0
  30. ggplot2_py/py.typed +0 -0
  31. ggplot2_py/qplot.py +233 -0
  32. ggplot2_py/resources/diamonds.csv +53941 -0
  33. ggplot2_py/resources/economics.csv +575 -0
  34. ggplot2_py/resources/economics_long.csv +2871 -0
  35. ggplot2_py/resources/faithfuld.csv +5626 -0
  36. ggplot2_py/resources/luv_colours.csv +658 -0
  37. ggplot2_py/resources/midwest.csv +438 -0
  38. ggplot2_py/resources/mpg.csv +235 -0
  39. ggplot2_py/resources/msleep.csv +84 -0
  40. ggplot2_py/resources/presidential.csv +13 -0
  41. ggplot2_py/resources/seals.csv +1156 -0
  42. ggplot2_py/resources/txhousing.csv +8603 -0
  43. ggplot2_py/save.py +316 -0
  44. ggplot2_py/scale.py +2727 -0
  45. ggplot2_py/scales/__init__.py +4252 -0
  46. ggplot2_py/stat.py +6071 -0
  47. ggplot2_py/stats/__init__.py +9 -0
  48. ggplot2_py/theme.py +490 -0
  49. ggplot2_py/theme_defaults.py +1350 -0
  50. ggplot2_py/theme_elements.py +2052 -0
  51. ggplot2_python-4.0.2.9000.dist-info/METADATA +179 -0
  52. ggplot2_python-4.0.2.9000.dist-info/RECORD +54 -0
  53. ggplot2_python-4.0.2.9000.dist-info/WHEEL +4 -0
  54. ggplot2_python-4.0.2.9000.dist-info/licenses/LICENSE +3 -0
@@ -0,0 +1,4252 @@
1
+ """
2
+ Scale constructor functions for ggplot2.
3
+
4
+ This module provides all ``scale_*`` factory functions that users call.
5
+ Each creates and returns a :class:`~ggplot2_py.scale.Scale` object configured
6
+ for the requested aesthetic, palette, and parameters.
7
+
8
+ Examples
9
+ --------
10
+ >>> from ggplot2_py.scales import scale_x_continuous, scale_colour_hue
11
+ >>> sc = scale_x_continuous(limits=[0, 10])
12
+ >>> sc = scale_colour_hue(l=65, c=100)
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ from typing import Any, Callable, List, Optional, Sequence, Union
18
+
19
+ import numpy as np
20
+
21
+ from scales import (
22
+ ContinuousRange,
23
+ DiscreteRange,
24
+ abs_area,
25
+ as_transform,
26
+ censor,
27
+ muted,
28
+ oob_censor,
29
+ oob_squish,
30
+ pal_area,
31
+ pal_brewer,
32
+ pal_div_gradient,
33
+ pal_gradient_n,
34
+ pal_grey,
35
+ pal_hue,
36
+ pal_identity,
37
+ pal_linetype,
38
+ pal_manual,
39
+ pal_rescale,
40
+ pal_seq_gradient,
41
+ pal_shape,
42
+ pal_viridis,
43
+ rescale,
44
+ rescale_max,
45
+ rescale_mid,
46
+ squish,
47
+ transform_date,
48
+ transform_identity,
49
+ transform_log10,
50
+ transform_reverse,
51
+ transform_sqrt,
52
+ transform_time,
53
+ )
54
+
55
+ from ggplot2_py._compat import (
56
+ Waiver,
57
+ cli_abort,
58
+ cli_warn,
59
+ deprecate_warn,
60
+ is_waiver,
61
+ waiver,
62
+ )
63
+ from ggplot2_py.scale import (
64
+ AxisSecondary,
65
+ ScaleBinned,
66
+ ScaleBinnedPosition,
67
+ ScaleContinuous,
68
+ ScaleContinuousDate,
69
+ ScaleContinuousDatetime,
70
+ ScaleContinuousIdentity,
71
+ ScaleContinuousPosition,
72
+ ScaleDiscrete,
73
+ ScaleDiscreteIdentity,
74
+ ScaleDiscretePosition,
75
+ _X_AESTHETICS,
76
+ _Y_AESTHETICS,
77
+ _set_sec_axis,
78
+ binned_scale,
79
+ continuous_scale,
80
+ derive,
81
+ discrete_scale,
82
+ dup_axis,
83
+ expansion,
84
+ find_scale,
85
+ is_sec_axis,
86
+ scale_type,
87
+ sec_axis,
88
+ )
89
+
90
+ __all__: List[str] = [
91
+ # Position continuous
92
+ "scale_x_continuous",
93
+ "scale_y_continuous",
94
+ "scale_x_log10",
95
+ "scale_y_log10",
96
+ "scale_x_sqrt",
97
+ "scale_y_sqrt",
98
+ "scale_x_reverse",
99
+ "scale_y_reverse",
100
+ # Position discrete
101
+ "scale_x_discrete",
102
+ "scale_y_discrete",
103
+ # Position binned
104
+ "scale_x_binned",
105
+ "scale_y_binned",
106
+ # Position date/datetime
107
+ "scale_x_date",
108
+ "scale_y_date",
109
+ "scale_x_datetime",
110
+ "scale_y_datetime",
111
+ "scale_x_time",
112
+ "scale_y_time",
113
+ # Colour/fill continuous
114
+ "scale_colour_continuous",
115
+ "scale_fill_continuous",
116
+ "scale_colour_gradient",
117
+ "scale_fill_gradient",
118
+ "scale_colour_gradient2",
119
+ "scale_fill_gradient2",
120
+ "scale_colour_gradientn",
121
+ "scale_fill_gradientn",
122
+ # Colour/fill discrete
123
+ "scale_colour_discrete",
124
+ "scale_fill_discrete",
125
+ "scale_colour_hue",
126
+ "scale_fill_hue",
127
+ "scale_colour_brewer",
128
+ "scale_fill_brewer",
129
+ "scale_colour_grey",
130
+ "scale_fill_grey",
131
+ # Colour/fill viridis
132
+ "scale_colour_viridis_c",
133
+ "scale_fill_viridis_c",
134
+ "scale_colour_viridis_d",
135
+ "scale_fill_viridis_d",
136
+ "scale_colour_viridis_b",
137
+ "scale_fill_viridis_b",
138
+ # Colour/fill distiller/fermenter
139
+ "scale_colour_distiller",
140
+ "scale_fill_distiller",
141
+ "scale_colour_fermenter",
142
+ "scale_fill_fermenter",
143
+ # Colour/fill binned / steps
144
+ "scale_colour_binned",
145
+ "scale_fill_binned",
146
+ "scale_colour_steps",
147
+ "scale_fill_steps",
148
+ "scale_colour_steps2",
149
+ "scale_fill_steps2",
150
+ "scale_colour_stepsn",
151
+ "scale_fill_stepsn",
152
+ # Colour/fill identity / manual
153
+ "scale_colour_identity",
154
+ "scale_fill_identity",
155
+ "scale_colour_manual",
156
+ "scale_fill_manual",
157
+ # Colour/fill date/datetime/ordinal
158
+ "scale_colour_date",
159
+ "scale_fill_date",
160
+ "scale_colour_datetime",
161
+ "scale_fill_datetime",
162
+ "scale_colour_ordinal",
163
+ "scale_fill_ordinal",
164
+ # American spelling aliases
165
+ "scale_color_continuous",
166
+ "scale_color_discrete",
167
+ "scale_color_gradient",
168
+ "scale_color_gradient2",
169
+ "scale_color_gradientn",
170
+ "scale_color_hue",
171
+ "scale_color_brewer",
172
+ "scale_color_distiller",
173
+ "scale_color_fermenter",
174
+ "scale_color_grey",
175
+ "scale_color_viridis_c",
176
+ "scale_color_viridis_d",
177
+ "scale_color_viridis_b",
178
+ "scale_color_binned",
179
+ "scale_color_steps",
180
+ "scale_color_steps2",
181
+ "scale_color_stepsn",
182
+ "scale_color_identity",
183
+ "scale_color_manual",
184
+ "scale_color_date",
185
+ "scale_color_datetime",
186
+ "scale_color_ordinal",
187
+ # Alpha
188
+ "scale_alpha",
189
+ "scale_alpha_continuous",
190
+ "scale_alpha_discrete",
191
+ "scale_alpha_binned",
192
+ "scale_alpha_identity",
193
+ "scale_alpha_manual",
194
+ "scale_alpha_ordinal",
195
+ "scale_alpha_date",
196
+ "scale_alpha_datetime",
197
+ # Size
198
+ "scale_size",
199
+ "scale_size_continuous",
200
+ "scale_size_discrete",
201
+ "scale_size_binned",
202
+ "scale_size_area",
203
+ "scale_size_binned_area",
204
+ "scale_size_identity",
205
+ "scale_size_manual",
206
+ "scale_size_ordinal",
207
+ "scale_size_date",
208
+ "scale_size_datetime",
209
+ "scale_radius",
210
+ # Shape
211
+ "scale_shape",
212
+ "scale_shape_discrete",
213
+ "scale_shape_binned",
214
+ "scale_shape_continuous",
215
+ "scale_shape_identity",
216
+ "scale_shape_manual",
217
+ "scale_shape_ordinal",
218
+ # Linetype
219
+ "scale_linetype",
220
+ "scale_linetype_discrete",
221
+ "scale_linetype_ordinal",
222
+ "scale_linetype_continuous",
223
+ "scale_linetype_binned",
224
+ "scale_linetype_identity",
225
+ "scale_linetype_manual",
226
+ # Linewidth
227
+ "scale_linewidth",
228
+ "scale_linewidth_continuous",
229
+ "scale_linewidth_discrete",
230
+ "scale_linewidth_binned",
231
+ "scale_linewidth_identity",
232
+ "scale_linewidth_manual",
233
+ "scale_linewidth_ordinal",
234
+ "scale_linewidth_date",
235
+ "scale_linewidth_datetime",
236
+ "scale_stroke",
237
+ "scale_stroke_continuous",
238
+ "scale_stroke_discrete",
239
+ "scale_stroke_binned",
240
+ "scale_stroke_identity",
241
+ "scale_stroke_manual",
242
+ "scale_stroke_ordinal",
243
+ # Generic identity / manual
244
+ "scale_continuous_identity",
245
+ "scale_discrete_identity",
246
+ "scale_discrete_manual",
247
+ # Helpers re-exported
248
+ "scale_type",
249
+ "find_scale",
250
+ "expansion",
251
+ "sec_axis",
252
+ "dup_axis",
253
+ "derive",
254
+ "continuous_scale",
255
+ "discrete_scale",
256
+ "binned_scale",
257
+ ]
258
+
259
+
260
+ # =========================================================================
261
+ # Internal helpers
262
+ # =========================================================================
263
+
264
+ def _identity(x: Any) -> Any:
265
+ """Identity function used as default palette for position scales."""
266
+ return x
267
+
268
+
269
+ def _seq_len(n: int) -> List[int]:
270
+ """Return ``list(range(1, n+1))``."""
271
+ return list(range(1, n + 1))
272
+
273
+
274
+ def _mid_rescaler(
275
+ mid: float = 0,
276
+ transform: Union[str, Any] = "identity",
277
+ ) -> Callable:
278
+ """Return a rescaler centred on *mid*.
279
+
280
+ Parameters
281
+ ----------
282
+ mid : float
283
+ Midpoint in data space.
284
+ transform : str or Transform
285
+ Transformation object.
286
+
287
+ Returns
288
+ -------
289
+ callable
290
+ """
291
+ if isinstance(transform, str):
292
+ transform = as_transform(transform)
293
+ trans_mid = float(transform.transform(np.array([mid]))[0])
294
+
295
+ def _rescaler(x: Any, _from: Any = None, **kwargs: Any) -> Any:
296
+ if _from is None:
297
+ x_arr = np.asarray(x, dtype=float)
298
+ _from = np.array([np.nanmin(x_arr), np.nanmax(x_arr)])
299
+ return rescale_mid(x, to=np.array([0.0, 1.0]), from_range=_from, mid=trans_mid)
300
+
301
+ return _rescaler
302
+
303
+
304
+ def _manual_scale(
305
+ aesthetic: Union[str, List[str]],
306
+ values: Any = None,
307
+ breaks: Any = None,
308
+ *,
309
+ name: Any = None,
310
+ na_value: Any = np.nan,
311
+ **kwargs: Any,
312
+ ) -> ScaleDiscrete:
313
+ """Internal helper for manual scales.
314
+
315
+ Parameters
316
+ ----------
317
+ aesthetic : str or list of str
318
+ Aesthetics.
319
+ values : dict or list
320
+ Manual values.
321
+ breaks : any
322
+ Break specification.
323
+ name : any, optional
324
+ Scale title.
325
+ na_value : any
326
+ Missing-data value.
327
+ **kwargs
328
+ Extra arguments passed to ``discrete_scale``.
329
+
330
+ Returns
331
+ -------
332
+ ScaleDiscrete
333
+ """
334
+ if name is None:
335
+ name = waiver()
336
+ if breaks is None:
337
+ breaks = waiver()
338
+
339
+ limits = kwargs.pop("limits", None)
340
+
341
+ if values is None:
342
+ values = []
343
+
344
+ if isinstance(values, dict):
345
+ if limits is None:
346
+ _values_dict = values
347
+
348
+ def _limits_func(x: Any) -> Any:
349
+ keys = list(_values_dict.keys())
350
+ x_list = list(x) if not isinstance(x, list) else x
351
+ shared = [v for v in x_list if v in keys or str(v) in keys]
352
+ if not shared:
353
+ shared = [v for v in x_list if v is not None and not (isinstance(v, float) and np.isnan(v))]
354
+ return shared if shared else x_list
355
+
356
+ limits = _limits_func
357
+
358
+ # Order values by breaks if values is a plain list
359
+ if (
360
+ isinstance(values, (list, np.ndarray))
361
+ and not isinstance(values, dict)
362
+ and not is_waiver(breaks)
363
+ and breaks is not None
364
+ and not callable(breaks)
365
+ ):
366
+ values_list = list(values)
367
+ breaks_list = list(breaks)
368
+ named_values = {}
369
+ for i, b in enumerate(breaks_list):
370
+ if i < len(values_list):
371
+ named_values[b] = values_list[i]
372
+ values = named_values
373
+
374
+ if isinstance(values, dict):
375
+ _vals = values
376
+
377
+ def pal(n: int) -> list:
378
+ return list(_vals.values())[:n] if len(_vals) >= n else list(_vals.values())
379
+ else:
380
+ _vals_list = list(values)
381
+
382
+ def pal(n: int) -> list:
383
+ if n > len(_vals_list):
384
+ cli_abort(
385
+ f"Insufficient values in manual scale. {n} needed but only {len(_vals_list)} provided."
386
+ )
387
+ return _vals_list[:n]
388
+
389
+ return discrete_scale(
390
+ aesthetic,
391
+ palette=pal,
392
+ name=name,
393
+ breaks=breaks,
394
+ limits=limits,
395
+ na_value=na_value,
396
+ **kwargs,
397
+ )
398
+
399
+
400
+ # =========================================================================
401
+ # Position continuous scales
402
+ # =========================================================================
403
+
404
+ def scale_x_continuous(
405
+ name: Any = None,
406
+ *,
407
+ breaks: Any = None,
408
+ minor_breaks: Any = None,
409
+ n_breaks: Optional[int] = None,
410
+ labels: Any = None,
411
+ limits: Optional[Any] = None,
412
+ expand: Any = None,
413
+ oob: Optional[Callable] = None,
414
+ na_value: float = np.nan,
415
+ transform: Union[str, Any] = "identity",
416
+ trans: Optional[Any] = None,
417
+ guide: Any = None,
418
+ position: str = "bottom",
419
+ sec_axis: Any = None,
420
+ ) -> ScaleContinuousPosition:
421
+ """Continuous scale for the x position aesthetic.
422
+
423
+ Parameters
424
+ ----------
425
+ name : str or Waiver, optional
426
+ Scale title.
427
+ breaks : array-like, callable, or None
428
+ Break specification.
429
+ minor_breaks : array-like, callable, or None
430
+ Minor break specification.
431
+ n_breaks : int, optional
432
+ Desired number of breaks.
433
+ labels : array-like, callable, or None
434
+ Label specification.
435
+ limits : array-like or None
436
+ Scale limits.
437
+ expand : array-like or Waiver, optional
438
+ Expansion.
439
+ oob : callable, optional
440
+ Out-of-bounds handler.
441
+ na_value : float
442
+ Value for missing data.
443
+ transform : str or Transform
444
+ Transformation.
445
+ trans : str or Transform, optional
446
+ Deprecated alias for *transform*.
447
+ guide : any, optional
448
+ Guide specification.
449
+ position : str
450
+ Axis position.
451
+ sec_axis : AxisSecondary or Waiver, optional
452
+ Secondary axis specification.
453
+
454
+ Returns
455
+ -------
456
+ ScaleContinuousPosition
457
+ """
458
+ if guide is None:
459
+ guide = waiver()
460
+ if oob is None:
461
+ oob = censor
462
+ if sec_axis is None:
463
+ sec_axis_obj = waiver()
464
+ else:
465
+ sec_axis_obj = sec_axis
466
+
467
+ sc = continuous_scale(
468
+ _X_AESTHETICS,
469
+ palette=_identity,
470
+ name=name,
471
+ breaks=breaks,
472
+ n_breaks=n_breaks,
473
+ minor_breaks=minor_breaks,
474
+ labels=labels,
475
+ limits=limits,
476
+ expand=expand,
477
+ oob=oob,
478
+ na_value=na_value,
479
+ transform=transform,
480
+ trans=trans,
481
+ guide=guide,
482
+ position=position,
483
+ super_class=ScaleContinuousPosition,
484
+ )
485
+ return _set_sec_axis(sec_axis_obj, sc)
486
+
487
+
488
+ def scale_y_continuous(
489
+ name: Any = None,
490
+ *,
491
+ breaks: Any = None,
492
+ minor_breaks: Any = None,
493
+ n_breaks: Optional[int] = None,
494
+ labels: Any = None,
495
+ limits: Optional[Any] = None,
496
+ expand: Any = None,
497
+ oob: Optional[Callable] = None,
498
+ na_value: float = np.nan,
499
+ transform: Union[str, Any] = "identity",
500
+ trans: Optional[Any] = None,
501
+ guide: Any = None,
502
+ position: str = "left",
503
+ sec_axis: Any = None,
504
+ ) -> ScaleContinuousPosition:
505
+ """Continuous scale for the y position aesthetic.
506
+
507
+ Parameters
508
+ ----------
509
+ name : str or Waiver, optional
510
+ Scale title.
511
+ breaks, minor_breaks, n_breaks, labels, limits, expand, oob, na_value,
512
+ transform, trans, guide, position, sec_axis
513
+ See :func:`scale_x_continuous`.
514
+
515
+ Returns
516
+ -------
517
+ ScaleContinuousPosition
518
+ """
519
+ if guide is None:
520
+ guide = waiver()
521
+ if oob is None:
522
+ oob = censor
523
+ if sec_axis is None:
524
+ sec_axis_obj = waiver()
525
+ else:
526
+ sec_axis_obj = sec_axis
527
+
528
+ sc = continuous_scale(
529
+ _Y_AESTHETICS,
530
+ palette=_identity,
531
+ name=name,
532
+ breaks=breaks,
533
+ n_breaks=n_breaks,
534
+ minor_breaks=minor_breaks,
535
+ labels=labels,
536
+ limits=limits,
537
+ expand=expand,
538
+ oob=oob,
539
+ na_value=na_value,
540
+ transform=transform,
541
+ trans=trans,
542
+ guide=guide,
543
+ position=position,
544
+ super_class=ScaleContinuousPosition,
545
+ )
546
+ return _set_sec_axis(sec_axis_obj, sc)
547
+
548
+
549
+ def scale_x_log10(**kwargs: Any) -> ScaleContinuousPosition:
550
+ """Log10-transformed continuous x scale.
551
+
552
+ Parameters
553
+ ----------
554
+ **kwargs
555
+ Passed to :func:`scale_x_continuous`.
556
+
557
+ Returns
558
+ -------
559
+ ScaleContinuousPosition
560
+ """
561
+ kwargs.setdefault("transform", transform_log10())
562
+ return scale_x_continuous(**kwargs)
563
+
564
+
565
+ def scale_y_log10(**kwargs: Any) -> ScaleContinuousPosition:
566
+ """Log10-transformed continuous y scale.
567
+
568
+ Parameters
569
+ ----------
570
+ **kwargs
571
+ Passed to :func:`scale_y_continuous`.
572
+
573
+ Returns
574
+ -------
575
+ ScaleContinuousPosition
576
+ """
577
+ kwargs.setdefault("transform", transform_log10())
578
+ return scale_y_continuous(**kwargs)
579
+
580
+
581
+ def scale_x_sqrt(**kwargs: Any) -> ScaleContinuousPosition:
582
+ """Square-root-transformed continuous x scale.
583
+
584
+ Parameters
585
+ ----------
586
+ **kwargs
587
+ Passed to :func:`scale_x_continuous`.
588
+
589
+ Returns
590
+ -------
591
+ ScaleContinuousPosition
592
+ """
593
+ kwargs.setdefault("transform", transform_sqrt())
594
+ return scale_x_continuous(**kwargs)
595
+
596
+
597
+ def scale_y_sqrt(**kwargs: Any) -> ScaleContinuousPosition:
598
+ """Square-root-transformed continuous y scale.
599
+
600
+ Parameters
601
+ ----------
602
+ **kwargs
603
+ Passed to :func:`scale_y_continuous`.
604
+
605
+ Returns
606
+ -------
607
+ ScaleContinuousPosition
608
+ """
609
+ kwargs.setdefault("transform", transform_sqrt())
610
+ return scale_y_continuous(**kwargs)
611
+
612
+
613
+ def scale_x_reverse(**kwargs: Any) -> ScaleContinuousPosition:
614
+ """Reverse-transformed continuous x scale.
615
+
616
+ Parameters
617
+ ----------
618
+ **kwargs
619
+ Passed to :func:`scale_x_continuous`.
620
+
621
+ Returns
622
+ -------
623
+ ScaleContinuousPosition
624
+ """
625
+ kwargs.setdefault("transform", transform_reverse())
626
+ return scale_x_continuous(**kwargs)
627
+
628
+
629
+ def scale_y_reverse(**kwargs: Any) -> ScaleContinuousPosition:
630
+ """Reverse-transformed continuous y scale.
631
+
632
+ Parameters
633
+ ----------
634
+ **kwargs
635
+ Passed to :func:`scale_y_continuous`.
636
+
637
+ Returns
638
+ -------
639
+ ScaleContinuousPosition
640
+ """
641
+ kwargs.setdefault("transform", transform_reverse())
642
+ return scale_y_continuous(**kwargs)
643
+
644
+
645
+ # =========================================================================
646
+ # Position discrete scales
647
+ # =========================================================================
648
+
649
+ def scale_x_discrete(
650
+ name: Any = None,
651
+ *,
652
+ palette: Optional[Callable] = None,
653
+ expand: Any = None,
654
+ guide: Any = None,
655
+ position: str = "bottom",
656
+ sec_axis: Any = None,
657
+ continuous_limits: Optional[Any] = None,
658
+ **kwargs: Any,
659
+ ) -> ScaleDiscretePosition:
660
+ """Discrete scale for the x position aesthetic.
661
+
662
+ Parameters
663
+ ----------
664
+ name : str or Waiver, optional
665
+ Scale title.
666
+ palette : callable, optional
667
+ Palette function.
668
+ expand : array-like or Waiver, optional
669
+ Expansion.
670
+ guide : any, optional
671
+ Guide specification.
672
+ position : str
673
+ Axis position.
674
+ sec_axis : AxisSecondary or Waiver, optional
675
+ Secondary axis specification.
676
+ continuous_limits : array-like, optional
677
+ Display range for continuous data on a discrete scale.
678
+ **kwargs
679
+ Extra arguments passed to ``discrete_scale``.
680
+
681
+ Returns
682
+ -------
683
+ ScaleDiscretePosition
684
+ """
685
+ if palette is None:
686
+ palette = _seq_len
687
+ if guide is None:
688
+ guide = waiver()
689
+ if sec_axis is None:
690
+ sec_axis_obj = waiver()
691
+ else:
692
+ sec_axis_obj = sec_axis
693
+
694
+ sc = discrete_scale(
695
+ _X_AESTHETICS,
696
+ palette=palette,
697
+ name=name,
698
+ expand=expand,
699
+ guide=guide,
700
+ position=position,
701
+ super_class=ScaleDiscretePosition,
702
+ **kwargs,
703
+ )
704
+ sc.range_c = ContinuousRange()
705
+ sc.continuous_limits = continuous_limits
706
+ return _set_sec_axis(sec_axis_obj, sc)
707
+
708
+
709
+ def scale_y_discrete(
710
+ name: Any = None,
711
+ *,
712
+ palette: Optional[Callable] = None,
713
+ expand: Any = None,
714
+ guide: Any = None,
715
+ position: str = "left",
716
+ sec_axis: Any = None,
717
+ continuous_limits: Optional[Any] = None,
718
+ **kwargs: Any,
719
+ ) -> ScaleDiscretePosition:
720
+ """Discrete scale for the y position aesthetic.
721
+
722
+ Parameters
723
+ ----------
724
+ name : str or Waiver, optional
725
+ Scale title.
726
+ palette, expand, guide, position, sec_axis, continuous_limits
727
+ See :func:`scale_x_discrete`.
728
+ **kwargs
729
+ Extra arguments passed to ``discrete_scale``.
730
+
731
+ Returns
732
+ -------
733
+ ScaleDiscretePosition
734
+ """
735
+ if palette is None:
736
+ palette = _seq_len
737
+ if guide is None:
738
+ guide = waiver()
739
+ if sec_axis is None:
740
+ sec_axis_obj = waiver()
741
+ else:
742
+ sec_axis_obj = sec_axis
743
+
744
+ sc = discrete_scale(
745
+ _Y_AESTHETICS,
746
+ palette=palette,
747
+ name=name,
748
+ expand=expand,
749
+ guide=guide,
750
+ position=position,
751
+ super_class=ScaleDiscretePosition,
752
+ **kwargs,
753
+ )
754
+ sc.range_c = ContinuousRange()
755
+ sc.continuous_limits = continuous_limits
756
+ return _set_sec_axis(sec_axis_obj, sc)
757
+
758
+
759
+ # =========================================================================
760
+ # Position binned scales
761
+ # =========================================================================
762
+
763
+ def scale_x_binned(
764
+ name: Any = None,
765
+ *,
766
+ n_breaks: int = 10,
767
+ nice_breaks: bool = True,
768
+ breaks: Any = None,
769
+ labels: Any = None,
770
+ limits: Optional[Any] = None,
771
+ expand: Any = None,
772
+ oob: Optional[Callable] = None,
773
+ na_value: float = np.nan,
774
+ right: bool = True,
775
+ show_limits: bool = False,
776
+ transform: Union[str, Any] = "identity",
777
+ trans: Optional[Any] = None,
778
+ guide: Any = None,
779
+ position: str = "bottom",
780
+ ) -> ScaleBinnedPosition:
781
+ """Binned scale for the x position aesthetic.
782
+
783
+ Parameters
784
+ ----------
785
+ name : str or Waiver, optional
786
+ Scale title.
787
+ n_breaks : int
788
+ Number of breaks.
789
+ nice_breaks : bool
790
+ Whether to use nice breaks.
791
+ breaks, labels, limits, expand, oob, na_value, right, show_limits,
792
+ transform, trans, guide, position
793
+ See :func:`binned_scale`.
794
+
795
+ Returns
796
+ -------
797
+ ScaleBinnedPosition
798
+ """
799
+ if guide is None:
800
+ guide = waiver()
801
+ if oob is None:
802
+ oob = squish
803
+ return binned_scale(
804
+ _X_AESTHETICS,
805
+ palette=_identity,
806
+ name=name,
807
+ breaks=breaks,
808
+ labels=labels,
809
+ limits=limits,
810
+ expand=expand,
811
+ oob=oob,
812
+ na_value=na_value,
813
+ n_breaks=n_breaks,
814
+ nice_breaks=nice_breaks,
815
+ right=right,
816
+ transform=transform,
817
+ trans=trans,
818
+ show_limits=show_limits,
819
+ guide=guide,
820
+ position=position,
821
+ super_class=ScaleBinnedPosition,
822
+ )
823
+
824
+
825
+ def scale_y_binned(
826
+ name: Any = None,
827
+ *,
828
+ n_breaks: int = 10,
829
+ nice_breaks: bool = True,
830
+ breaks: Any = None,
831
+ labels: Any = None,
832
+ limits: Optional[Any] = None,
833
+ expand: Any = None,
834
+ oob: Optional[Callable] = None,
835
+ na_value: float = np.nan,
836
+ right: bool = True,
837
+ show_limits: bool = False,
838
+ transform: Union[str, Any] = "identity",
839
+ trans: Optional[Any] = None,
840
+ guide: Any = None,
841
+ position: str = "left",
842
+ ) -> ScaleBinnedPosition:
843
+ """Binned scale for the y position aesthetic.
844
+
845
+ Parameters
846
+ ----------
847
+ name : str or Waiver, optional
848
+ Scale title.
849
+ n_breaks, nice_breaks, breaks, labels, limits, expand, oob, na_value,
850
+ right, show_limits, transform, trans, guide, position
851
+ See :func:`scale_x_binned`.
852
+
853
+ Returns
854
+ -------
855
+ ScaleBinnedPosition
856
+ """
857
+ if guide is None:
858
+ guide = waiver()
859
+ if oob is None:
860
+ oob = squish
861
+ return binned_scale(
862
+ _Y_AESTHETICS,
863
+ palette=_identity,
864
+ name=name,
865
+ breaks=breaks,
866
+ labels=labels,
867
+ limits=limits,
868
+ expand=expand,
869
+ oob=oob,
870
+ na_value=na_value,
871
+ n_breaks=n_breaks,
872
+ nice_breaks=nice_breaks,
873
+ right=right,
874
+ transform=transform,
875
+ trans=trans,
876
+ show_limits=show_limits,
877
+ guide=guide,
878
+ position=position,
879
+ super_class=ScaleBinnedPosition,
880
+ )
881
+
882
+
883
+ # =========================================================================
884
+ # Position date/datetime/time scales
885
+ # =========================================================================
886
+
887
+ def scale_x_date(
888
+ name: Any = None,
889
+ *,
890
+ breaks: Any = None,
891
+ date_breaks: Optional[str] = None,
892
+ labels: Any = None,
893
+ date_labels: Optional[str] = None,
894
+ minor_breaks: Any = None,
895
+ date_minor_breaks: Optional[str] = None,
896
+ limits: Optional[Any] = None,
897
+ expand: Any = None,
898
+ oob: Optional[Callable] = None,
899
+ guide: Any = None,
900
+ position: str = "bottom",
901
+ sec_axis: Any = None,
902
+ ) -> ScaleContinuousPosition:
903
+ """Date scale for the x position aesthetic.
904
+
905
+ Parameters
906
+ ----------
907
+ name : str or Waiver, optional
908
+ Scale title.
909
+ breaks, date_breaks, labels, date_labels, minor_breaks,
910
+ date_minor_breaks, limits, expand, oob, guide, position, sec_axis
911
+ Standard scale parameters.
912
+
913
+ Returns
914
+ -------
915
+ ScaleContinuousPosition
916
+ """
917
+ if oob is None:
918
+ oob = censor
919
+ return scale_x_continuous(
920
+ name=name,
921
+ breaks=breaks,
922
+ labels=labels,
923
+ minor_breaks=minor_breaks,
924
+ limits=limits,
925
+ expand=expand,
926
+ oob=oob,
927
+ guide=guide,
928
+ position=position,
929
+ sec_axis=sec_axis,
930
+ transform=transform_date(),
931
+ )
932
+
933
+
934
+ def scale_y_date(
935
+ name: Any = None,
936
+ *,
937
+ breaks: Any = None,
938
+ labels: Any = None,
939
+ minor_breaks: Any = None,
940
+ limits: Optional[Any] = None,
941
+ expand: Any = None,
942
+ oob: Optional[Callable] = None,
943
+ guide: Any = None,
944
+ position: str = "left",
945
+ sec_axis: Any = None,
946
+ ) -> ScaleContinuousPosition:
947
+ """Date scale for the y position aesthetic.
948
+
949
+ Parameters
950
+ ----------
951
+ name, breaks, labels, minor_breaks, limits, expand, oob, guide,
952
+ position, sec_axis
953
+ Standard scale parameters.
954
+
955
+ Returns
956
+ -------
957
+ ScaleContinuousPosition
958
+ """
959
+ if oob is None:
960
+ oob = censor
961
+ return scale_y_continuous(
962
+ name=name,
963
+ breaks=breaks,
964
+ labels=labels,
965
+ minor_breaks=minor_breaks,
966
+ limits=limits,
967
+ expand=expand,
968
+ oob=oob,
969
+ guide=guide,
970
+ position=position,
971
+ sec_axis=sec_axis,
972
+ transform=transform_date(),
973
+ )
974
+
975
+
976
+ def scale_x_datetime(
977
+ name: Any = None,
978
+ *,
979
+ breaks: Any = None,
980
+ date_breaks: Optional[str] = None,
981
+ labels: Any = None,
982
+ date_labels: Optional[str] = None,
983
+ minor_breaks: Any = None,
984
+ limits: Optional[Any] = None,
985
+ expand: Any = None,
986
+ oob: Optional[Callable] = None,
987
+ guide: Any = None,
988
+ position: str = "bottom",
989
+ sec_axis: Any = None,
990
+ ) -> ScaleContinuousPosition:
991
+ """Datetime scale for the x position aesthetic.
992
+
993
+ Parameters
994
+ ----------
995
+ name, breaks, date_breaks, labels, date_labels, minor_breaks,
996
+ limits, expand, oob, guide, position, sec_axis
997
+ Standard scale parameters.
998
+
999
+ Returns
1000
+ -------
1001
+ ScaleContinuousPosition
1002
+ """
1003
+ if oob is None:
1004
+ oob = censor
1005
+ return scale_x_continuous(
1006
+ name=name,
1007
+ breaks=breaks,
1008
+ labels=labels,
1009
+ minor_breaks=minor_breaks,
1010
+ limits=limits,
1011
+ expand=expand,
1012
+ oob=oob,
1013
+ guide=guide,
1014
+ position=position,
1015
+ sec_axis=sec_axis,
1016
+ transform=transform_time(),
1017
+ )
1018
+
1019
+
1020
+ def scale_y_datetime(
1021
+ name: Any = None,
1022
+ *,
1023
+ breaks: Any = None,
1024
+ labels: Any = None,
1025
+ minor_breaks: Any = None,
1026
+ limits: Optional[Any] = None,
1027
+ expand: Any = None,
1028
+ oob: Optional[Callable] = None,
1029
+ guide: Any = None,
1030
+ position: str = "left",
1031
+ sec_axis: Any = None,
1032
+ ) -> ScaleContinuousPosition:
1033
+ """Datetime scale for the y position aesthetic.
1034
+
1035
+ Parameters
1036
+ ----------
1037
+ name, breaks, labels, minor_breaks, limits, expand, oob, guide,
1038
+ position, sec_axis
1039
+ Standard scale parameters.
1040
+
1041
+ Returns
1042
+ -------
1043
+ ScaleContinuousPosition
1044
+ """
1045
+ if oob is None:
1046
+ oob = censor
1047
+ return scale_y_continuous(
1048
+ name=name,
1049
+ breaks=breaks,
1050
+ labels=labels,
1051
+ minor_breaks=minor_breaks,
1052
+ limits=limits,
1053
+ expand=expand,
1054
+ oob=oob,
1055
+ guide=guide,
1056
+ position=position,
1057
+ sec_axis=sec_axis,
1058
+ transform=transform_time(),
1059
+ )
1060
+
1061
+
1062
+ # Aliases
1063
+ scale_x_time = scale_x_datetime
1064
+ scale_y_time = scale_y_datetime
1065
+
1066
+
1067
+ # =========================================================================
1068
+ # Colour / fill continuous (gradient) scales
1069
+ # =========================================================================
1070
+
1071
+ def scale_colour_continuous(
1072
+ name: Any = None,
1073
+ *,
1074
+ palette: Optional[Any] = None,
1075
+ aesthetics: Union[str, List[str]] = "colour",
1076
+ guide: str = "colourbar",
1077
+ na_value: str = "grey50",
1078
+ **kwargs: Any,
1079
+ ) -> ScaleContinuous:
1080
+ """Default continuous colour scale.
1081
+
1082
+ Parameters
1083
+ ----------
1084
+ name : str or Waiver, optional
1085
+ Scale title.
1086
+ palette : callable or list of str, optional
1087
+ Palette specification.
1088
+ aesthetics : str or list of str
1089
+ Aesthetic names.
1090
+ guide : str
1091
+ Guide type.
1092
+ na_value : str
1093
+ Colour for missing values.
1094
+ **kwargs
1095
+ Passed to :func:`continuous_scale`.
1096
+
1097
+ Returns
1098
+ -------
1099
+ ScaleContinuous
1100
+ """
1101
+ pal = palette
1102
+ if pal is not None and not callable(pal):
1103
+ if isinstance(pal, (list, tuple)):
1104
+ pal = pal_gradient_n(pal)
1105
+ return continuous_scale(
1106
+ aesthetics,
1107
+ palette=pal,
1108
+ name=name,
1109
+ guide=guide,
1110
+ na_value=na_value,
1111
+ fallback_palette=pal_seq_gradient("#132B43", "#56B1F7"),
1112
+ **kwargs,
1113
+ )
1114
+
1115
+
1116
+ def scale_fill_continuous(
1117
+ name: Any = None,
1118
+ *,
1119
+ palette: Optional[Any] = None,
1120
+ aesthetics: Union[str, List[str]] = "fill",
1121
+ guide: str = "colourbar",
1122
+ na_value: str = "grey50",
1123
+ **kwargs: Any,
1124
+ ) -> ScaleContinuous:
1125
+ """Default continuous fill scale.
1126
+
1127
+ Parameters
1128
+ ----------
1129
+ name, palette, aesthetics, guide, na_value
1130
+ See :func:`scale_colour_continuous`.
1131
+ **kwargs
1132
+ Passed to :func:`continuous_scale`.
1133
+
1134
+ Returns
1135
+ -------
1136
+ ScaleContinuous
1137
+ """
1138
+ pal = palette
1139
+ if pal is not None and not callable(pal):
1140
+ if isinstance(pal, (list, tuple)):
1141
+ pal = pal_gradient_n(pal)
1142
+ return continuous_scale(
1143
+ aesthetics,
1144
+ palette=pal,
1145
+ name=name,
1146
+ guide=guide,
1147
+ na_value=na_value,
1148
+ fallback_palette=pal_seq_gradient("#132B43", "#56B1F7"),
1149
+ **kwargs,
1150
+ )
1151
+
1152
+
1153
+ def scale_colour_gradient(
1154
+ name: Any = None,
1155
+ *,
1156
+ low: str = "#132B43",
1157
+ high: str = "#56B1F7",
1158
+ space: str = "Lab",
1159
+ na_value: str = "grey50",
1160
+ guide: str = "colourbar",
1161
+ aesthetics: Union[str, List[str]] = "colour",
1162
+ **kwargs: Any,
1163
+ ) -> ScaleContinuous:
1164
+ """Two-colour gradient colour scale.
1165
+
1166
+ Parameters
1167
+ ----------
1168
+ name : str or Waiver, optional
1169
+ Scale title.
1170
+ low : str
1171
+ Colour for the low end.
1172
+ high : str
1173
+ Colour for the high end.
1174
+ space : str
1175
+ Colour interpolation space.
1176
+ na_value : str
1177
+ Colour for missing values.
1178
+ guide : str
1179
+ Guide type.
1180
+ aesthetics : str or list of str
1181
+ Aesthetic names.
1182
+ **kwargs
1183
+ Passed to :func:`continuous_scale`.
1184
+
1185
+ Returns
1186
+ -------
1187
+ ScaleContinuous
1188
+ """
1189
+ return continuous_scale(
1190
+ aesthetics,
1191
+ palette=pal_seq_gradient(low, high, space),
1192
+ name=name,
1193
+ na_value=na_value,
1194
+ guide=guide,
1195
+ **kwargs,
1196
+ )
1197
+
1198
+
1199
+ def scale_fill_gradient(
1200
+ name: Any = None,
1201
+ *,
1202
+ low: str = "#132B43",
1203
+ high: str = "#56B1F7",
1204
+ space: str = "Lab",
1205
+ na_value: str = "grey50",
1206
+ guide: str = "colourbar",
1207
+ aesthetics: Union[str, List[str]] = "fill",
1208
+ **kwargs: Any,
1209
+ ) -> ScaleContinuous:
1210
+ """Two-colour gradient fill scale.
1211
+
1212
+ Parameters
1213
+ ----------
1214
+ name, low, high, space, na_value, guide, aesthetics
1215
+ See :func:`scale_colour_gradient`.
1216
+ **kwargs
1217
+ Passed to :func:`continuous_scale`.
1218
+
1219
+ Returns
1220
+ -------
1221
+ ScaleContinuous
1222
+ """
1223
+ return continuous_scale(
1224
+ aesthetics,
1225
+ palette=pal_seq_gradient(low, high, space),
1226
+ name=name,
1227
+ na_value=na_value,
1228
+ guide=guide,
1229
+ **kwargs,
1230
+ )
1231
+
1232
+
1233
+ def scale_colour_gradient2(
1234
+ name: Any = None,
1235
+ *,
1236
+ low: Optional[str] = None,
1237
+ mid: str = "white",
1238
+ high: Optional[str] = None,
1239
+ midpoint: float = 0,
1240
+ space: str = "Lab",
1241
+ na_value: str = "grey50",
1242
+ transform: Union[str, Any] = "identity",
1243
+ guide: str = "colourbar",
1244
+ aesthetics: Union[str, List[str]] = "colour",
1245
+ **kwargs: Any,
1246
+ ) -> ScaleContinuous:
1247
+ """Diverging colour gradient scale.
1248
+
1249
+ Parameters
1250
+ ----------
1251
+ name : str or Waiver, optional
1252
+ Scale title.
1253
+ low : str, optional
1254
+ Colour for the low end (default: muted red).
1255
+ mid : str
1256
+ Colour for the midpoint.
1257
+ high : str, optional
1258
+ Colour for the high end (default: muted blue).
1259
+ midpoint : float
1260
+ Data value at the midpoint.
1261
+ space : str
1262
+ Colour interpolation space.
1263
+ na_value : str
1264
+ Colour for missing values.
1265
+ transform : str or Transform
1266
+ Transformation.
1267
+ guide : str
1268
+ Guide type.
1269
+ aesthetics : str or list of str
1270
+ Aesthetic names.
1271
+ **kwargs
1272
+ Passed to :func:`continuous_scale`.
1273
+
1274
+ Returns
1275
+ -------
1276
+ ScaleContinuous
1277
+ """
1278
+ if low is None:
1279
+ low = muted("red")
1280
+ if high is None:
1281
+ high = muted("blue")
1282
+ return continuous_scale(
1283
+ aesthetics,
1284
+ palette=pal_div_gradient(low, mid, high, space),
1285
+ name=name,
1286
+ na_value=na_value,
1287
+ transform=transform,
1288
+ guide=guide,
1289
+ rescaler=_mid_rescaler(mid=midpoint, transform=transform),
1290
+ **kwargs,
1291
+ )
1292
+
1293
+
1294
+ def scale_fill_gradient2(
1295
+ name: Any = None,
1296
+ *,
1297
+ low: Optional[str] = None,
1298
+ mid: str = "white",
1299
+ high: Optional[str] = None,
1300
+ midpoint: float = 0,
1301
+ space: str = "Lab",
1302
+ na_value: str = "grey50",
1303
+ transform: Union[str, Any] = "identity",
1304
+ guide: str = "colourbar",
1305
+ aesthetics: Union[str, List[str]] = "fill",
1306
+ **kwargs: Any,
1307
+ ) -> ScaleContinuous:
1308
+ """Diverging fill gradient scale.
1309
+
1310
+ Parameters
1311
+ ----------
1312
+ name, low, mid, high, midpoint, space, na_value, transform, guide, aesthetics
1313
+ See :func:`scale_colour_gradient2`.
1314
+ **kwargs
1315
+ Passed to :func:`continuous_scale`.
1316
+
1317
+ Returns
1318
+ -------
1319
+ ScaleContinuous
1320
+ """
1321
+ if low is None:
1322
+ low = muted("red")
1323
+ if high is None:
1324
+ high = muted("blue")
1325
+ return continuous_scale(
1326
+ aesthetics,
1327
+ palette=pal_div_gradient(low, mid, high, space),
1328
+ name=name,
1329
+ na_value=na_value,
1330
+ transform=transform,
1331
+ guide=guide,
1332
+ rescaler=_mid_rescaler(mid=midpoint, transform=transform),
1333
+ **kwargs,
1334
+ )
1335
+
1336
+
1337
+ def scale_colour_gradientn(
1338
+ name: Any = None,
1339
+ *,
1340
+ colours: Optional[Sequence[str]] = None,
1341
+ colors: Optional[Sequence[str]] = None,
1342
+ values: Optional[Sequence[float]] = None,
1343
+ space: str = "Lab",
1344
+ na_value: str = "grey50",
1345
+ guide: str = "colourbar",
1346
+ aesthetics: Union[str, List[str]] = "colour",
1347
+ **kwargs: Any,
1348
+ ) -> ScaleContinuous:
1349
+ """N-colour gradient colour scale.
1350
+
1351
+ Parameters
1352
+ ----------
1353
+ name : str or Waiver, optional
1354
+ Scale title.
1355
+ colours : list of str, optional
1356
+ Colour values.
1357
+ colors : list of str, optional
1358
+ Alias for *colours*.
1359
+ values : list of float, optional
1360
+ Positions of colours.
1361
+ space : str
1362
+ Colour interpolation space.
1363
+ na_value : str
1364
+ Colour for missing values.
1365
+ guide : str
1366
+ Guide type.
1367
+ aesthetics : str or list of str
1368
+ Aesthetic names.
1369
+ **kwargs
1370
+ Passed to :func:`continuous_scale`.
1371
+
1372
+ Returns
1373
+ -------
1374
+ ScaleContinuous
1375
+ """
1376
+ cols = colours if colours is not None else colors
1377
+ if cols is None:
1378
+ cli_abort("Must provide either 'colours' or 'colors'.")
1379
+ return continuous_scale(
1380
+ aesthetics,
1381
+ palette=pal_gradient_n(cols, values, space),
1382
+ name=name,
1383
+ na_value=na_value,
1384
+ guide=guide,
1385
+ **kwargs,
1386
+ )
1387
+
1388
+
1389
+ def scale_fill_gradientn(
1390
+ name: Any = None,
1391
+ *,
1392
+ colours: Optional[Sequence[str]] = None,
1393
+ colors: Optional[Sequence[str]] = None,
1394
+ values: Optional[Sequence[float]] = None,
1395
+ space: str = "Lab",
1396
+ na_value: str = "grey50",
1397
+ guide: str = "colourbar",
1398
+ aesthetics: Union[str, List[str]] = "fill",
1399
+ **kwargs: Any,
1400
+ ) -> ScaleContinuous:
1401
+ """N-colour gradient fill scale.
1402
+
1403
+ Parameters
1404
+ ----------
1405
+ name, colours, colors, values, space, na_value, guide, aesthetics
1406
+ See :func:`scale_colour_gradientn`.
1407
+ **kwargs
1408
+ Passed to :func:`continuous_scale`.
1409
+
1410
+ Returns
1411
+ -------
1412
+ ScaleContinuous
1413
+ """
1414
+ cols = colours if colours is not None else colors
1415
+ if cols is None:
1416
+ cli_abort("Must provide either 'colours' or 'colors'.")
1417
+ return continuous_scale(
1418
+ aesthetics,
1419
+ palette=pal_gradient_n(cols, values, space),
1420
+ name=name,
1421
+ na_value=na_value,
1422
+ guide=guide,
1423
+ **kwargs,
1424
+ )
1425
+
1426
+
1427
+ # =========================================================================
1428
+ # Colour / fill discrete scales
1429
+ # =========================================================================
1430
+
1431
+ def scale_colour_discrete(
1432
+ name: Any = None,
1433
+ *,
1434
+ palette: Optional[Any] = None,
1435
+ aesthetics: Union[str, List[str]] = "colour",
1436
+ na_value: str = "grey50",
1437
+ **kwargs: Any,
1438
+ ) -> ScaleDiscrete:
1439
+ """Default discrete colour scale.
1440
+
1441
+ Parameters
1442
+ ----------
1443
+ name : str or Waiver, optional
1444
+ Scale title.
1445
+ palette : callable, optional
1446
+ Palette function.
1447
+ aesthetics : str or list of str
1448
+ Aesthetic names.
1449
+ na_value : str
1450
+ Colour for missing values.
1451
+ **kwargs
1452
+ Passed to :func:`discrete_scale`.
1453
+
1454
+ Returns
1455
+ -------
1456
+ ScaleDiscrete
1457
+ """
1458
+ return discrete_scale(
1459
+ aesthetics,
1460
+ palette=palette,
1461
+ name=name,
1462
+ na_value=na_value,
1463
+ fallback_palette=pal_hue(),
1464
+ **kwargs,
1465
+ )
1466
+
1467
+
1468
+ def scale_fill_discrete(
1469
+ name: Any = None,
1470
+ *,
1471
+ palette: Optional[Any] = None,
1472
+ aesthetics: Union[str, List[str]] = "fill",
1473
+ na_value: str = "grey50",
1474
+ **kwargs: Any,
1475
+ ) -> ScaleDiscrete:
1476
+ """Default discrete fill scale.
1477
+
1478
+ Parameters
1479
+ ----------
1480
+ name, palette, aesthetics, na_value
1481
+ See :func:`scale_colour_discrete`.
1482
+ **kwargs
1483
+ Passed to :func:`discrete_scale`.
1484
+
1485
+ Returns
1486
+ -------
1487
+ ScaleDiscrete
1488
+ """
1489
+ return discrete_scale(
1490
+ aesthetics,
1491
+ palette=palette,
1492
+ name=name,
1493
+ na_value=na_value,
1494
+ fallback_palette=pal_hue(),
1495
+ **kwargs,
1496
+ )
1497
+
1498
+
1499
+ def scale_colour_hue(
1500
+ name: Any = None,
1501
+ *,
1502
+ h: Sequence[float] = (15, 375),
1503
+ c: float = 100,
1504
+ l: float = 65,
1505
+ h_start: float = 0,
1506
+ direction: int = 1,
1507
+ na_value: str = "grey50",
1508
+ aesthetics: Union[str, List[str]] = "colour",
1509
+ **kwargs: Any,
1510
+ ) -> ScaleDiscrete:
1511
+ """Evenly spaced hue colour scale for discrete data.
1512
+
1513
+ Parameters
1514
+ ----------
1515
+ name : str or Waiver, optional
1516
+ Scale title.
1517
+ h : tuple of float
1518
+ Range of hues (0--360).
1519
+ c : float
1520
+ Chroma.
1521
+ l : float
1522
+ Luminance.
1523
+ h_start : float
1524
+ Hue offset.
1525
+ direction : int
1526
+ Direction of hue traverse (1 or -1).
1527
+ na_value : str
1528
+ Colour for missing values.
1529
+ aesthetics : str or list of str
1530
+ Aesthetic names.
1531
+ **kwargs
1532
+ Passed to :func:`discrete_scale`.
1533
+
1534
+ Returns
1535
+ -------
1536
+ ScaleDiscrete
1537
+ """
1538
+ return discrete_scale(
1539
+ aesthetics,
1540
+ palette=pal_hue(h, c, l, h_start, direction),
1541
+ name=name,
1542
+ na_value=na_value,
1543
+ **kwargs,
1544
+ )
1545
+
1546
+
1547
+ def scale_fill_hue(
1548
+ name: Any = None,
1549
+ *,
1550
+ h: Sequence[float] = (15, 375),
1551
+ c: float = 100,
1552
+ l: float = 65,
1553
+ h_start: float = 0,
1554
+ direction: int = 1,
1555
+ na_value: str = "grey50",
1556
+ aesthetics: Union[str, List[str]] = "fill",
1557
+ **kwargs: Any,
1558
+ ) -> ScaleDiscrete:
1559
+ """Evenly spaced hue fill scale for discrete data.
1560
+
1561
+ Parameters
1562
+ ----------
1563
+ name, h, c, l, h_start, direction, na_value, aesthetics
1564
+ See :func:`scale_colour_hue`.
1565
+ **kwargs
1566
+ Passed to :func:`discrete_scale`.
1567
+
1568
+ Returns
1569
+ -------
1570
+ ScaleDiscrete
1571
+ """
1572
+ return discrete_scale(
1573
+ aesthetics,
1574
+ palette=pal_hue(h, c, l, h_start, direction),
1575
+ name=name,
1576
+ na_value=na_value,
1577
+ **kwargs,
1578
+ )
1579
+
1580
+
1581
+ # =========================================================================
1582
+ # Brewer scales
1583
+ # =========================================================================
1584
+
1585
+ def scale_colour_brewer(
1586
+ name: Any = None,
1587
+ *,
1588
+ type: str = "seq",
1589
+ palette: Union[int, str] = 1,
1590
+ direction: int = 1,
1591
+ aesthetics: Union[str, List[str]] = "colour",
1592
+ **kwargs: Any,
1593
+ ) -> ScaleDiscrete:
1594
+ """ColorBrewer discrete colour scale.
1595
+
1596
+ Parameters
1597
+ ----------
1598
+ name : str or Waiver, optional
1599
+ Scale title.
1600
+ type : str
1601
+ Palette type (``'seq'``, ``'div'``, ``'qual'``).
1602
+ palette : int or str
1603
+ Palette name or index.
1604
+ direction : int
1605
+ Colour order direction.
1606
+ aesthetics : str or list of str
1607
+ Aesthetic names.
1608
+ **kwargs
1609
+ Passed to :func:`discrete_scale`.
1610
+
1611
+ Returns
1612
+ -------
1613
+ ScaleDiscrete
1614
+ """
1615
+ return discrete_scale(
1616
+ aesthetics,
1617
+ palette=pal_brewer(type, palette, direction),
1618
+ name=name,
1619
+ **kwargs,
1620
+ )
1621
+
1622
+
1623
+ def scale_fill_brewer(
1624
+ name: Any = None,
1625
+ *,
1626
+ type: str = "seq",
1627
+ palette: Union[int, str] = 1,
1628
+ direction: int = 1,
1629
+ aesthetics: Union[str, List[str]] = "fill",
1630
+ **kwargs: Any,
1631
+ ) -> ScaleDiscrete:
1632
+ """ColorBrewer discrete fill scale.
1633
+
1634
+ Parameters
1635
+ ----------
1636
+ name, type, palette, direction, aesthetics
1637
+ See :func:`scale_colour_brewer`.
1638
+ **kwargs
1639
+ Passed to :func:`discrete_scale`.
1640
+
1641
+ Returns
1642
+ -------
1643
+ ScaleDiscrete
1644
+ """
1645
+ return discrete_scale(
1646
+ aesthetics,
1647
+ palette=pal_brewer(type, palette, direction),
1648
+ name=name,
1649
+ **kwargs,
1650
+ )
1651
+
1652
+
1653
+ def scale_colour_distiller(
1654
+ name: Any = None,
1655
+ *,
1656
+ type: str = "seq",
1657
+ palette: Union[int, str] = 1,
1658
+ direction: int = -1,
1659
+ values: Optional[Sequence[float]] = None,
1660
+ space: str = "Lab",
1661
+ na_value: str = "grey50",
1662
+ guide: str = "colourbar",
1663
+ aesthetics: Union[str, List[str]] = "colour",
1664
+ **kwargs: Any,
1665
+ ) -> ScaleContinuous:
1666
+ """Continuous colour scale interpolated from a Brewer palette.
1667
+
1668
+ Parameters
1669
+ ----------
1670
+ name : str or Waiver, optional
1671
+ Scale title.
1672
+ type : str
1673
+ Palette type.
1674
+ palette : int or str
1675
+ Palette name or index.
1676
+ direction : int
1677
+ Colour order direction.
1678
+ values : list of float, optional
1679
+ Positions for colours.
1680
+ space : str
1681
+ Interpolation space.
1682
+ na_value : str
1683
+ Colour for missing values.
1684
+ guide : str
1685
+ Guide type.
1686
+ aesthetics : str or list of str
1687
+ Aesthetic names.
1688
+ **kwargs
1689
+ Passed to :func:`continuous_scale`.
1690
+
1691
+ Returns
1692
+ -------
1693
+ ScaleContinuous
1694
+ """
1695
+ return continuous_scale(
1696
+ aesthetics,
1697
+ palette=pal_gradient_n(pal_brewer(type, palette, direction)(7), values, space),
1698
+ name=name,
1699
+ na_value=na_value,
1700
+ guide=guide,
1701
+ **kwargs,
1702
+ )
1703
+
1704
+
1705
+ def scale_fill_distiller(
1706
+ name: Any = None,
1707
+ *,
1708
+ type: str = "seq",
1709
+ palette: Union[int, str] = 1,
1710
+ direction: int = -1,
1711
+ values: Optional[Sequence[float]] = None,
1712
+ space: str = "Lab",
1713
+ na_value: str = "grey50",
1714
+ guide: str = "colourbar",
1715
+ aesthetics: Union[str, List[str]] = "fill",
1716
+ **kwargs: Any,
1717
+ ) -> ScaleContinuous:
1718
+ """Continuous fill scale interpolated from a Brewer palette.
1719
+
1720
+ Parameters
1721
+ ----------
1722
+ name, type, palette, direction, values, space, na_value, guide, aesthetics
1723
+ See :func:`scale_colour_distiller`.
1724
+ **kwargs
1725
+ Passed to :func:`continuous_scale`.
1726
+
1727
+ Returns
1728
+ -------
1729
+ ScaleContinuous
1730
+ """
1731
+ return continuous_scale(
1732
+ aesthetics,
1733
+ palette=pal_gradient_n(pal_brewer(type, palette, direction)(7), values, space),
1734
+ name=name,
1735
+ na_value=na_value,
1736
+ guide=guide,
1737
+ **kwargs,
1738
+ )
1739
+
1740
+
1741
+ def scale_colour_fermenter(
1742
+ name: Any = None,
1743
+ *,
1744
+ type: str = "seq",
1745
+ palette: Union[int, str] = 1,
1746
+ direction: int = -1,
1747
+ na_value: str = "grey50",
1748
+ guide: str = "coloursteps",
1749
+ aesthetics: Union[str, List[str]] = "colour",
1750
+ **kwargs: Any,
1751
+ ) -> ScaleBinned:
1752
+ """Binned colour scale from a Brewer palette.
1753
+
1754
+ Parameters
1755
+ ----------
1756
+ name : str or Waiver, optional
1757
+ Scale title.
1758
+ type : str
1759
+ Palette type.
1760
+ palette : int or str
1761
+ Palette name or index.
1762
+ direction : int
1763
+ Colour order direction.
1764
+ na_value : str
1765
+ Colour for missing values.
1766
+ guide : str
1767
+ Guide type.
1768
+ aesthetics : str or list of str
1769
+ Aesthetic names.
1770
+ **kwargs
1771
+ Passed to :func:`binned_scale`.
1772
+
1773
+ Returns
1774
+ -------
1775
+ ScaleBinned
1776
+ """
1777
+ return binned_scale(
1778
+ aesthetics,
1779
+ palette=pal_brewer(type, palette, direction),
1780
+ name=name,
1781
+ na_value=na_value,
1782
+ guide=guide,
1783
+ **kwargs,
1784
+ )
1785
+
1786
+
1787
+ def scale_fill_fermenter(
1788
+ name: Any = None,
1789
+ *,
1790
+ type: str = "seq",
1791
+ palette: Union[int, str] = 1,
1792
+ direction: int = -1,
1793
+ na_value: str = "grey50",
1794
+ guide: str = "coloursteps",
1795
+ aesthetics: Union[str, List[str]] = "fill",
1796
+ **kwargs: Any,
1797
+ ) -> ScaleBinned:
1798
+ """Binned fill scale from a Brewer palette.
1799
+
1800
+ Parameters
1801
+ ----------
1802
+ name, type, palette, direction, na_value, guide, aesthetics
1803
+ See :func:`scale_colour_fermenter`.
1804
+ **kwargs
1805
+ Passed to :func:`binned_scale`.
1806
+
1807
+ Returns
1808
+ -------
1809
+ ScaleBinned
1810
+ """
1811
+ return binned_scale(
1812
+ aesthetics,
1813
+ palette=pal_brewer(type, palette, direction),
1814
+ name=name,
1815
+ na_value=na_value,
1816
+ guide=guide,
1817
+ **kwargs,
1818
+ )
1819
+
1820
+
1821
+ # =========================================================================
1822
+ # Grey scales
1823
+ # =========================================================================
1824
+
1825
+ def scale_colour_grey(
1826
+ name: Any = None,
1827
+ *,
1828
+ start: float = 0.2,
1829
+ end: float = 0.8,
1830
+ na_value: str = "red",
1831
+ aesthetics: Union[str, List[str]] = "colour",
1832
+ **kwargs: Any,
1833
+ ) -> ScaleDiscrete:
1834
+ """Sequential grey discrete colour scale.
1835
+
1836
+ Parameters
1837
+ ----------
1838
+ name : str or Waiver, optional
1839
+ Scale title.
1840
+ start : float
1841
+ Grey level for the lightest colour.
1842
+ end : float
1843
+ Grey level for the darkest colour.
1844
+ na_value : str
1845
+ Colour for missing values.
1846
+ aesthetics : str or list of str
1847
+ Aesthetic names.
1848
+ **kwargs
1849
+ Passed to :func:`discrete_scale`.
1850
+
1851
+ Returns
1852
+ -------
1853
+ ScaleDiscrete
1854
+ """
1855
+ return discrete_scale(
1856
+ aesthetics,
1857
+ palette=pal_grey(start, end),
1858
+ name=name,
1859
+ na_value=na_value,
1860
+ **kwargs,
1861
+ )
1862
+
1863
+
1864
+ def scale_fill_grey(
1865
+ name: Any = None,
1866
+ *,
1867
+ start: float = 0.2,
1868
+ end: float = 0.8,
1869
+ na_value: str = "red",
1870
+ aesthetics: Union[str, List[str]] = "fill",
1871
+ **kwargs: Any,
1872
+ ) -> ScaleDiscrete:
1873
+ """Sequential grey discrete fill scale.
1874
+
1875
+ Parameters
1876
+ ----------
1877
+ name, start, end, na_value, aesthetics
1878
+ See :func:`scale_colour_grey`.
1879
+ **kwargs
1880
+ Passed to :func:`discrete_scale`.
1881
+
1882
+ Returns
1883
+ -------
1884
+ ScaleDiscrete
1885
+ """
1886
+ return discrete_scale(
1887
+ aesthetics,
1888
+ palette=pal_grey(start, end),
1889
+ name=name,
1890
+ na_value=na_value,
1891
+ **kwargs,
1892
+ )
1893
+
1894
+
1895
+ # =========================================================================
1896
+ # Viridis scales
1897
+ # =========================================================================
1898
+
1899
+ def scale_colour_viridis_d(
1900
+ name: Any = None,
1901
+ *,
1902
+ alpha: float = 1,
1903
+ begin: float = 0,
1904
+ end: float = 1,
1905
+ direction: int = 1,
1906
+ option: str = "D",
1907
+ aesthetics: Union[str, List[str]] = "colour",
1908
+ **kwargs: Any,
1909
+ ) -> ScaleDiscrete:
1910
+ """Viridis discrete colour scale.
1911
+
1912
+ Parameters
1913
+ ----------
1914
+ name : str or Waiver, optional
1915
+ Scale title.
1916
+ alpha : float
1917
+ Alpha transparency.
1918
+ begin, end : float
1919
+ Range within the colour map (0--1).
1920
+ direction : int
1921
+ Colour order direction.
1922
+ option : str
1923
+ Colour map variant.
1924
+ aesthetics : str or list of str
1925
+ Aesthetic names.
1926
+ **kwargs
1927
+ Passed to :func:`discrete_scale`.
1928
+
1929
+ Returns
1930
+ -------
1931
+ ScaleDiscrete
1932
+ """
1933
+ return discrete_scale(
1934
+ aesthetics,
1935
+ palette=pal_viridis(alpha, begin, end, direction, option),
1936
+ name=name,
1937
+ **kwargs,
1938
+ )
1939
+
1940
+
1941
+ def scale_fill_viridis_d(
1942
+ name: Any = None,
1943
+ *,
1944
+ alpha: float = 1,
1945
+ begin: float = 0,
1946
+ end: float = 1,
1947
+ direction: int = 1,
1948
+ option: str = "D",
1949
+ aesthetics: Union[str, List[str]] = "fill",
1950
+ **kwargs: Any,
1951
+ ) -> ScaleDiscrete:
1952
+ """Viridis discrete fill scale.
1953
+
1954
+ Parameters
1955
+ ----------
1956
+ name, alpha, begin, end, direction, option, aesthetics
1957
+ See :func:`scale_colour_viridis_d`.
1958
+ **kwargs
1959
+ Passed to :func:`discrete_scale`.
1960
+
1961
+ Returns
1962
+ -------
1963
+ ScaleDiscrete
1964
+ """
1965
+ return discrete_scale(
1966
+ aesthetics,
1967
+ palette=pal_viridis(alpha, begin, end, direction, option),
1968
+ name=name,
1969
+ **kwargs,
1970
+ )
1971
+
1972
+
1973
+ def scale_colour_viridis_c(
1974
+ name: Any = None,
1975
+ *,
1976
+ alpha: float = 1,
1977
+ begin: float = 0,
1978
+ end: float = 1,
1979
+ direction: int = 1,
1980
+ option: str = "D",
1981
+ values: Optional[Sequence[float]] = None,
1982
+ space: str = "Lab",
1983
+ na_value: str = "grey50",
1984
+ guide: str = "colourbar",
1985
+ aesthetics: Union[str, List[str]] = "colour",
1986
+ **kwargs: Any,
1987
+ ) -> ScaleContinuous:
1988
+ """Viridis continuous colour scale.
1989
+
1990
+ Parameters
1991
+ ----------
1992
+ name : str or Waiver, optional
1993
+ Scale title.
1994
+ alpha, begin, end, direction, option
1995
+ Viridis palette parameters.
1996
+ values : list of float, optional
1997
+ Positions for colours.
1998
+ space : str
1999
+ Interpolation space.
2000
+ na_value : str
2001
+ Colour for missing values.
2002
+ guide : str
2003
+ Guide type.
2004
+ aesthetics : str or list of str
2005
+ Aesthetic names.
2006
+ **kwargs
2007
+ Passed to :func:`continuous_scale`.
2008
+
2009
+ Returns
2010
+ -------
2011
+ ScaleContinuous
2012
+ """
2013
+ return continuous_scale(
2014
+ aesthetics,
2015
+ palette=pal_gradient_n(
2016
+ pal_viridis(alpha, begin, end, direction, option)(6),
2017
+ values,
2018
+ space,
2019
+ ),
2020
+ name=name,
2021
+ na_value=na_value,
2022
+ guide=guide,
2023
+ **kwargs,
2024
+ )
2025
+
2026
+
2027
+ def scale_fill_viridis_c(
2028
+ name: Any = None,
2029
+ *,
2030
+ alpha: float = 1,
2031
+ begin: float = 0,
2032
+ end: float = 1,
2033
+ direction: int = 1,
2034
+ option: str = "D",
2035
+ values: Optional[Sequence[float]] = None,
2036
+ space: str = "Lab",
2037
+ na_value: str = "grey50",
2038
+ guide: str = "colourbar",
2039
+ aesthetics: Union[str, List[str]] = "fill",
2040
+ **kwargs: Any,
2041
+ ) -> ScaleContinuous:
2042
+ """Viridis continuous fill scale.
2043
+
2044
+ Parameters
2045
+ ----------
2046
+ name, alpha, begin, end, direction, option, values, space, na_value,
2047
+ guide, aesthetics
2048
+ See :func:`scale_colour_viridis_c`.
2049
+ **kwargs
2050
+ Passed to :func:`continuous_scale`.
2051
+
2052
+ Returns
2053
+ -------
2054
+ ScaleContinuous
2055
+ """
2056
+ return continuous_scale(
2057
+ aesthetics,
2058
+ palette=pal_gradient_n(
2059
+ pal_viridis(alpha, begin, end, direction, option)(6),
2060
+ values,
2061
+ space,
2062
+ ),
2063
+ name=name,
2064
+ na_value=na_value,
2065
+ guide=guide,
2066
+ **kwargs,
2067
+ )
2068
+
2069
+
2070
+ def scale_colour_viridis_b(
2071
+ name: Any = None,
2072
+ *,
2073
+ alpha: float = 1,
2074
+ begin: float = 0,
2075
+ end: float = 1,
2076
+ direction: int = 1,
2077
+ option: str = "D",
2078
+ values: Optional[Sequence[float]] = None,
2079
+ space: str = "Lab",
2080
+ na_value: str = "grey50",
2081
+ guide: str = "coloursteps",
2082
+ aesthetics: Union[str, List[str]] = "colour",
2083
+ **kwargs: Any,
2084
+ ) -> ScaleBinned:
2085
+ """Viridis binned colour scale.
2086
+
2087
+ Parameters
2088
+ ----------
2089
+ name, alpha, begin, end, direction, option, values, space, na_value,
2090
+ guide, aesthetics
2091
+ See :func:`scale_colour_viridis_c`.
2092
+ **kwargs
2093
+ Passed to :func:`binned_scale`.
2094
+
2095
+ Returns
2096
+ -------
2097
+ ScaleBinned
2098
+ """
2099
+ return binned_scale(
2100
+ aesthetics,
2101
+ palette=pal_viridis(alpha, begin, end, direction, option),
2102
+ name=name,
2103
+ na_value=na_value,
2104
+ guide=guide,
2105
+ **kwargs,
2106
+ )
2107
+
2108
+
2109
+ def scale_fill_viridis_b(
2110
+ name: Any = None,
2111
+ *,
2112
+ alpha: float = 1,
2113
+ begin: float = 0,
2114
+ end: float = 1,
2115
+ direction: int = 1,
2116
+ option: str = "D",
2117
+ values: Optional[Sequence[float]] = None,
2118
+ space: str = "Lab",
2119
+ na_value: str = "grey50",
2120
+ guide: str = "coloursteps",
2121
+ aesthetics: Union[str, List[str]] = "fill",
2122
+ **kwargs: Any,
2123
+ ) -> ScaleBinned:
2124
+ """Viridis binned fill scale.
2125
+
2126
+ Parameters
2127
+ ----------
2128
+ name, alpha, begin, end, direction, option, values, space, na_value,
2129
+ guide, aesthetics
2130
+ See :func:`scale_colour_viridis_b`.
2131
+ **kwargs
2132
+ Passed to :func:`binned_scale`.
2133
+
2134
+ Returns
2135
+ -------
2136
+ ScaleBinned
2137
+ """
2138
+ return binned_scale(
2139
+ aesthetics,
2140
+ palette=pal_viridis(alpha, begin, end, direction, option),
2141
+ name=name,
2142
+ na_value=na_value,
2143
+ guide=guide,
2144
+ **kwargs,
2145
+ )
2146
+
2147
+
2148
+ # =========================================================================
2149
+ # Colour / fill binned (steps) scales
2150
+ # =========================================================================
2151
+
2152
+ def scale_colour_binned(
2153
+ name: Any = None,
2154
+ *,
2155
+ palette: Optional[Any] = None,
2156
+ aesthetics: Union[str, List[str]] = "colour",
2157
+ guide: str = "coloursteps",
2158
+ na_value: str = "grey50",
2159
+ **kwargs: Any,
2160
+ ) -> ScaleBinned:
2161
+ """Default binned colour scale.
2162
+
2163
+ Parameters
2164
+ ----------
2165
+ name : str or Waiver, optional
2166
+ Scale title.
2167
+ palette : callable or list of str, optional
2168
+ Palette specification.
2169
+ aesthetics : str or list of str
2170
+ Aesthetic names.
2171
+ guide : str
2172
+ Guide type.
2173
+ na_value : str
2174
+ Colour for missing values.
2175
+ **kwargs
2176
+ Passed to :func:`binned_scale`.
2177
+
2178
+ Returns
2179
+ -------
2180
+ ScaleBinned
2181
+ """
2182
+ return binned_scale(
2183
+ aesthetics,
2184
+ palette=palette,
2185
+ name=name,
2186
+ guide=guide,
2187
+ na_value=na_value,
2188
+ fallback_palette=pal_seq_gradient("#132B43", "#56B1F7"),
2189
+ **kwargs,
2190
+ )
2191
+
2192
+
2193
+ def scale_fill_binned(
2194
+ name: Any = None,
2195
+ *,
2196
+ palette: Optional[Any] = None,
2197
+ aesthetics: Union[str, List[str]] = "fill",
2198
+ guide: str = "coloursteps",
2199
+ na_value: str = "grey50",
2200
+ **kwargs: Any,
2201
+ ) -> ScaleBinned:
2202
+ """Default binned fill scale.
2203
+
2204
+ Parameters
2205
+ ----------
2206
+ name, palette, aesthetics, guide, na_value
2207
+ See :func:`scale_colour_binned`.
2208
+ **kwargs
2209
+ Passed to :func:`binned_scale`.
2210
+
2211
+ Returns
2212
+ -------
2213
+ ScaleBinned
2214
+ """
2215
+ return binned_scale(
2216
+ aesthetics,
2217
+ palette=palette,
2218
+ name=name,
2219
+ guide=guide,
2220
+ na_value=na_value,
2221
+ fallback_palette=pal_seq_gradient("#132B43", "#56B1F7"),
2222
+ **kwargs,
2223
+ )
2224
+
2225
+
2226
+ def scale_colour_steps(
2227
+ name: Any = None,
2228
+ *,
2229
+ low: str = "#132B43",
2230
+ high: str = "#56B1F7",
2231
+ space: str = "Lab",
2232
+ na_value: str = "grey50",
2233
+ guide: str = "coloursteps",
2234
+ aesthetics: Union[str, List[str]] = "colour",
2235
+ **kwargs: Any,
2236
+ ) -> ScaleBinned:
2237
+ """Binned two-colour gradient colour scale.
2238
+
2239
+ Parameters
2240
+ ----------
2241
+ name : str or Waiver, optional
2242
+ Scale title.
2243
+ low, high : str
2244
+ Gradient endpoint colours.
2245
+ space : str
2246
+ Interpolation space.
2247
+ na_value : str
2248
+ Colour for missing values.
2249
+ guide : str
2250
+ Guide type.
2251
+ aesthetics : str or list of str
2252
+ Aesthetic names.
2253
+ **kwargs
2254
+ Passed to :func:`binned_scale`.
2255
+
2256
+ Returns
2257
+ -------
2258
+ ScaleBinned
2259
+ """
2260
+ return binned_scale(
2261
+ aesthetics,
2262
+ palette=pal_seq_gradient(low, high, space),
2263
+ name=name,
2264
+ na_value=na_value,
2265
+ guide=guide,
2266
+ **kwargs,
2267
+ )
2268
+
2269
+
2270
+ def scale_fill_steps(
2271
+ name: Any = None,
2272
+ *,
2273
+ low: str = "#132B43",
2274
+ high: str = "#56B1F7",
2275
+ space: str = "Lab",
2276
+ na_value: str = "grey50",
2277
+ guide: str = "coloursteps",
2278
+ aesthetics: Union[str, List[str]] = "fill",
2279
+ **kwargs: Any,
2280
+ ) -> ScaleBinned:
2281
+ """Binned two-colour gradient fill scale.
2282
+
2283
+ Parameters
2284
+ ----------
2285
+ name, low, high, space, na_value, guide, aesthetics
2286
+ See :func:`scale_colour_steps`.
2287
+ **kwargs
2288
+ Passed to :func:`binned_scale`.
2289
+
2290
+ Returns
2291
+ -------
2292
+ ScaleBinned
2293
+ """
2294
+ return binned_scale(
2295
+ aesthetics,
2296
+ palette=pal_seq_gradient(low, high, space),
2297
+ name=name,
2298
+ na_value=na_value,
2299
+ guide=guide,
2300
+ **kwargs,
2301
+ )
2302
+
2303
+
2304
+ def scale_colour_steps2(
2305
+ name: Any = None,
2306
+ *,
2307
+ low: Optional[str] = None,
2308
+ mid: str = "white",
2309
+ high: Optional[str] = None,
2310
+ midpoint: float = 0,
2311
+ space: str = "Lab",
2312
+ na_value: str = "grey50",
2313
+ transform: Union[str, Any] = "identity",
2314
+ guide: str = "coloursteps",
2315
+ aesthetics: Union[str, List[str]] = "colour",
2316
+ **kwargs: Any,
2317
+ ) -> ScaleBinned:
2318
+ """Diverging binned colour gradient scale.
2319
+
2320
+ Parameters
2321
+ ----------
2322
+ name, low, mid, high, midpoint, space, na_value, transform, guide, aesthetics
2323
+ See :func:`scale_colour_gradient2` for parameter descriptions.
2324
+ **kwargs
2325
+ Passed to :func:`binned_scale`.
2326
+
2327
+ Returns
2328
+ -------
2329
+ ScaleBinned
2330
+ """
2331
+ if low is None:
2332
+ low = muted("red")
2333
+ if high is None:
2334
+ high = muted("blue")
2335
+ return binned_scale(
2336
+ aesthetics,
2337
+ palette=pal_div_gradient(low, mid, high, space),
2338
+ name=name,
2339
+ na_value=na_value,
2340
+ transform=transform,
2341
+ guide=guide,
2342
+ rescaler=_mid_rescaler(mid=midpoint, transform=transform),
2343
+ **kwargs,
2344
+ )
2345
+
2346
+
2347
+ def scale_fill_steps2(
2348
+ name: Any = None,
2349
+ *,
2350
+ low: Optional[str] = None,
2351
+ mid: str = "white",
2352
+ high: Optional[str] = None,
2353
+ midpoint: float = 0,
2354
+ space: str = "Lab",
2355
+ na_value: str = "grey50",
2356
+ transform: Union[str, Any] = "identity",
2357
+ guide: str = "coloursteps",
2358
+ aesthetics: Union[str, List[str]] = "fill",
2359
+ **kwargs: Any,
2360
+ ) -> ScaleBinned:
2361
+ """Diverging binned fill gradient scale.
2362
+
2363
+ Parameters
2364
+ ----------
2365
+ name, low, mid, high, midpoint, space, na_value, transform, guide, aesthetics
2366
+ See :func:`scale_colour_steps2`.
2367
+ **kwargs
2368
+ Passed to :func:`binned_scale`.
2369
+
2370
+ Returns
2371
+ -------
2372
+ ScaleBinned
2373
+ """
2374
+ if low is None:
2375
+ low = muted("red")
2376
+ if high is None:
2377
+ high = muted("blue")
2378
+ return binned_scale(
2379
+ aesthetics,
2380
+ palette=pal_div_gradient(low, mid, high, space),
2381
+ name=name,
2382
+ na_value=na_value,
2383
+ transform=transform,
2384
+ guide=guide,
2385
+ rescaler=_mid_rescaler(mid=midpoint, transform=transform),
2386
+ **kwargs,
2387
+ )
2388
+
2389
+
2390
+ def scale_colour_stepsn(
2391
+ name: Any = None,
2392
+ *,
2393
+ colours: Optional[Sequence[str]] = None,
2394
+ colors: Optional[Sequence[str]] = None,
2395
+ values: Optional[Sequence[float]] = None,
2396
+ space: str = "Lab",
2397
+ na_value: str = "grey50",
2398
+ guide: str = "coloursteps",
2399
+ aesthetics: Union[str, List[str]] = "colour",
2400
+ **kwargs: Any,
2401
+ ) -> ScaleBinned:
2402
+ """N-colour binned gradient colour scale.
2403
+
2404
+ Parameters
2405
+ ----------
2406
+ name, colours, colors, values, space, na_value, guide, aesthetics
2407
+ See :func:`scale_colour_gradientn`.
2408
+ **kwargs
2409
+ Passed to :func:`binned_scale`.
2410
+
2411
+ Returns
2412
+ -------
2413
+ ScaleBinned
2414
+ """
2415
+ cols = colours if colours is not None else colors
2416
+ if cols is None:
2417
+ cli_abort("Must provide either 'colours' or 'colors'.")
2418
+ return binned_scale(
2419
+ aesthetics,
2420
+ palette=pal_gradient_n(cols, values, space),
2421
+ name=name,
2422
+ na_value=na_value,
2423
+ guide=guide,
2424
+ **kwargs,
2425
+ )
2426
+
2427
+
2428
+ def scale_fill_stepsn(
2429
+ name: Any = None,
2430
+ *,
2431
+ colours: Optional[Sequence[str]] = None,
2432
+ colors: Optional[Sequence[str]] = None,
2433
+ values: Optional[Sequence[float]] = None,
2434
+ space: str = "Lab",
2435
+ na_value: str = "grey50",
2436
+ guide: str = "coloursteps",
2437
+ aesthetics: Union[str, List[str]] = "fill",
2438
+ **kwargs: Any,
2439
+ ) -> ScaleBinned:
2440
+ """N-colour binned gradient fill scale.
2441
+
2442
+ Parameters
2443
+ ----------
2444
+ name, colours, colors, values, space, na_value, guide, aesthetics
2445
+ See :func:`scale_colour_stepsn`.
2446
+ **kwargs
2447
+ Passed to :func:`binned_scale`.
2448
+
2449
+ Returns
2450
+ -------
2451
+ ScaleBinned
2452
+ """
2453
+ cols = colours if colours is not None else colors
2454
+ if cols is None:
2455
+ cli_abort("Must provide either 'colours' or 'colors'.")
2456
+ return binned_scale(
2457
+ aesthetics,
2458
+ palette=pal_gradient_n(cols, values, space),
2459
+ name=name,
2460
+ na_value=na_value,
2461
+ guide=guide,
2462
+ **kwargs,
2463
+ )
2464
+
2465
+
2466
+ # =========================================================================
2467
+ # Identity scales
2468
+ # =========================================================================
2469
+
2470
+ def scale_colour_identity(
2471
+ name: Any = None,
2472
+ *,
2473
+ guide: str = "none",
2474
+ aesthetics: Union[str, List[str]] = "colour",
2475
+ **kwargs: Any,
2476
+ ) -> ScaleDiscreteIdentity:
2477
+ """Identity colour scale -- data values used as colours directly.
2478
+
2479
+ Parameters
2480
+ ----------
2481
+ name : str or Waiver, optional
2482
+ Scale title.
2483
+ guide : str
2484
+ Guide type.
2485
+ aesthetics : str or list of str
2486
+ Aesthetic names.
2487
+ **kwargs
2488
+ Passed to :func:`discrete_scale`.
2489
+
2490
+ Returns
2491
+ -------
2492
+ ScaleDiscreteIdentity
2493
+ """
2494
+ return discrete_scale(
2495
+ aesthetics,
2496
+ palette=pal_identity(),
2497
+ name=name,
2498
+ guide=guide,
2499
+ super_class=ScaleDiscreteIdentity,
2500
+ **kwargs,
2501
+ )
2502
+
2503
+
2504
+ def scale_fill_identity(
2505
+ name: Any = None,
2506
+ *,
2507
+ guide: str = "none",
2508
+ aesthetics: Union[str, List[str]] = "fill",
2509
+ **kwargs: Any,
2510
+ ) -> ScaleDiscreteIdentity:
2511
+ """Identity fill scale.
2512
+
2513
+ Parameters
2514
+ ----------
2515
+ name, guide, aesthetics
2516
+ See :func:`scale_colour_identity`.
2517
+ **kwargs
2518
+ Passed to :func:`discrete_scale`.
2519
+
2520
+ Returns
2521
+ -------
2522
+ ScaleDiscreteIdentity
2523
+ """
2524
+ return discrete_scale(
2525
+ aesthetics,
2526
+ palette=pal_identity(),
2527
+ name=name,
2528
+ guide=guide,
2529
+ super_class=ScaleDiscreteIdentity,
2530
+ **kwargs,
2531
+ )
2532
+
2533
+
2534
+ def scale_continuous_identity(
2535
+ aesthetics: Union[str, List[str]],
2536
+ name: Any = None,
2537
+ *,
2538
+ guide: str = "none",
2539
+ **kwargs: Any,
2540
+ ) -> ScaleContinuousIdentity:
2541
+ """Generic continuous identity scale.
2542
+
2543
+ Parameters
2544
+ ----------
2545
+ aesthetics : str or list of str
2546
+ Aesthetic names.
2547
+ name : str or Waiver, optional
2548
+ Scale title.
2549
+ guide : str
2550
+ Guide type.
2551
+ **kwargs
2552
+ Passed to :func:`continuous_scale`.
2553
+
2554
+ Returns
2555
+ -------
2556
+ ScaleContinuousIdentity
2557
+ """
2558
+ return continuous_scale(
2559
+ aesthetics,
2560
+ palette=pal_identity(),
2561
+ name=name,
2562
+ guide=guide,
2563
+ super_class=ScaleContinuousIdentity,
2564
+ **kwargs,
2565
+ )
2566
+
2567
+
2568
+ def scale_discrete_identity(
2569
+ aesthetics: Union[str, List[str]],
2570
+ name: Any = None,
2571
+ *,
2572
+ guide: str = "none",
2573
+ **kwargs: Any,
2574
+ ) -> ScaleDiscreteIdentity:
2575
+ """Generic discrete identity scale.
2576
+
2577
+ Parameters
2578
+ ----------
2579
+ aesthetics : str or list of str
2580
+ Aesthetic names.
2581
+ name : str or Waiver, optional
2582
+ Scale title.
2583
+ guide : str
2584
+ Guide type.
2585
+ **kwargs
2586
+ Passed to :func:`discrete_scale`.
2587
+
2588
+ Returns
2589
+ -------
2590
+ ScaleDiscreteIdentity
2591
+ """
2592
+ return discrete_scale(
2593
+ aesthetics,
2594
+ palette=pal_identity(),
2595
+ name=name,
2596
+ guide=guide,
2597
+ super_class=ScaleDiscreteIdentity,
2598
+ **kwargs,
2599
+ )
2600
+
2601
+
2602
+ # =========================================================================
2603
+ # Manual scales
2604
+ # =========================================================================
2605
+
2606
+ def scale_colour_manual(
2607
+ *,
2608
+ values: Any,
2609
+ aesthetics: Union[str, List[str]] = "colour",
2610
+ breaks: Any = None,
2611
+ na_value: str = "grey50",
2612
+ **kwargs: Any,
2613
+ ) -> ScaleDiscrete:
2614
+ """Manual colour scale.
2615
+
2616
+ Parameters
2617
+ ----------
2618
+ values : dict or list
2619
+ Mapping from data values to colours.
2620
+ aesthetics : str or list of str
2621
+ Aesthetic names.
2622
+ breaks : any, optional
2623
+ Break specification.
2624
+ na_value : str
2625
+ Colour for missing values.
2626
+ **kwargs
2627
+ Passed to ``_manual_scale``.
2628
+
2629
+ Returns
2630
+ -------
2631
+ ScaleDiscrete
2632
+ """
2633
+ if breaks is None:
2634
+ breaks = waiver()
2635
+ return _manual_scale(aesthetics, values, breaks, na_value=na_value, **kwargs)
2636
+
2637
+
2638
+ def scale_fill_manual(
2639
+ *,
2640
+ values: Any,
2641
+ aesthetics: Union[str, List[str]] = "fill",
2642
+ breaks: Any = None,
2643
+ na_value: str = "grey50",
2644
+ **kwargs: Any,
2645
+ ) -> ScaleDiscrete:
2646
+ """Manual fill scale.
2647
+
2648
+ Parameters
2649
+ ----------
2650
+ values, aesthetics, breaks, na_value
2651
+ See :func:`scale_colour_manual`.
2652
+ **kwargs
2653
+ Passed to ``_manual_scale``.
2654
+
2655
+ Returns
2656
+ -------
2657
+ ScaleDiscrete
2658
+ """
2659
+ if breaks is None:
2660
+ breaks = waiver()
2661
+ return _manual_scale(aesthetics, values, breaks, na_value=na_value, **kwargs)
2662
+
2663
+
2664
+ def scale_discrete_manual(
2665
+ aesthetics: Union[str, List[str]],
2666
+ *,
2667
+ values: Any,
2668
+ breaks: Any = None,
2669
+ **kwargs: Any,
2670
+ ) -> ScaleDiscrete:
2671
+ """Generic discrete manual scale.
2672
+
2673
+ Parameters
2674
+ ----------
2675
+ aesthetics : str or list of str
2676
+ Aesthetic names.
2677
+ values : dict or list
2678
+ Manual values.
2679
+ breaks : any, optional
2680
+ Break specification.
2681
+ **kwargs
2682
+ Passed to ``_manual_scale``.
2683
+
2684
+ Returns
2685
+ -------
2686
+ ScaleDiscrete
2687
+ """
2688
+ if breaks is None:
2689
+ breaks = waiver()
2690
+ return _manual_scale(aesthetics, values, breaks, **kwargs)
2691
+
2692
+
2693
+ # =========================================================================
2694
+ # Colour/fill date, datetime, ordinal
2695
+ # =========================================================================
2696
+
2697
+ def scale_colour_date(
2698
+ name: Any = None,
2699
+ *,
2700
+ aesthetics: Union[str, List[str]] = "colour",
2701
+ **kwargs: Any,
2702
+ ) -> ScaleContinuous:
2703
+ """Date colour scale.
2704
+
2705
+ Parameters
2706
+ ----------
2707
+ name : str or Waiver, optional
2708
+ Scale title.
2709
+ aesthetics : str or list of str
2710
+ Aesthetic names.
2711
+ **kwargs
2712
+ Passed to :func:`continuous_scale`.
2713
+
2714
+ Returns
2715
+ -------
2716
+ ScaleContinuous
2717
+ """
2718
+ return continuous_scale(
2719
+ aesthetics,
2720
+ name=name,
2721
+ transform=transform_date(),
2722
+ fallback_palette=pal_seq_gradient("#132B43", "#56B1F7"),
2723
+ **kwargs,
2724
+ )
2725
+
2726
+
2727
+ def scale_fill_date(
2728
+ name: Any = None,
2729
+ *,
2730
+ aesthetics: Union[str, List[str]] = "fill",
2731
+ **kwargs: Any,
2732
+ ) -> ScaleContinuous:
2733
+ """Date fill scale.
2734
+
2735
+ Parameters
2736
+ ----------
2737
+ name, aesthetics
2738
+ See :func:`scale_colour_date`.
2739
+ **kwargs
2740
+ Passed to :func:`continuous_scale`.
2741
+
2742
+ Returns
2743
+ -------
2744
+ ScaleContinuous
2745
+ """
2746
+ return continuous_scale(
2747
+ aesthetics,
2748
+ name=name,
2749
+ transform=transform_date(),
2750
+ fallback_palette=pal_seq_gradient("#132B43", "#56B1F7"),
2751
+ **kwargs,
2752
+ )
2753
+
2754
+
2755
+ def scale_colour_datetime(
2756
+ name: Any = None,
2757
+ *,
2758
+ aesthetics: Union[str, List[str]] = "colour",
2759
+ **kwargs: Any,
2760
+ ) -> ScaleContinuous:
2761
+ """Datetime colour scale.
2762
+
2763
+ Parameters
2764
+ ----------
2765
+ name : str or Waiver, optional
2766
+ Scale title.
2767
+ aesthetics : str or list of str
2768
+ Aesthetic names.
2769
+ **kwargs
2770
+ Passed to :func:`continuous_scale`.
2771
+
2772
+ Returns
2773
+ -------
2774
+ ScaleContinuous
2775
+ """
2776
+ return continuous_scale(
2777
+ aesthetics,
2778
+ name=name,
2779
+ transform=transform_time(),
2780
+ fallback_palette=pal_seq_gradient("#132B43", "#56B1F7"),
2781
+ **kwargs,
2782
+ )
2783
+
2784
+
2785
+ def scale_fill_datetime(
2786
+ name: Any = None,
2787
+ *,
2788
+ aesthetics: Union[str, List[str]] = "fill",
2789
+ **kwargs: Any,
2790
+ ) -> ScaleContinuous:
2791
+ """Datetime fill scale.
2792
+
2793
+ Parameters
2794
+ ----------
2795
+ name, aesthetics
2796
+ See :func:`scale_colour_datetime`.
2797
+ **kwargs
2798
+ Passed to :func:`continuous_scale`.
2799
+
2800
+ Returns
2801
+ -------
2802
+ ScaleContinuous
2803
+ """
2804
+ return continuous_scale(
2805
+ aesthetics,
2806
+ name=name,
2807
+ transform=transform_time(),
2808
+ fallback_palette=pal_seq_gradient("#132B43", "#56B1F7"),
2809
+ **kwargs,
2810
+ )
2811
+
2812
+
2813
+ def scale_colour_ordinal(
2814
+ name: Any = None,
2815
+ *,
2816
+ aesthetics: Union[str, List[str]] = "colour",
2817
+ **kwargs: Any,
2818
+ ) -> ScaleDiscrete:
2819
+ """Ordinal colour scale (viridis palette).
2820
+
2821
+ Parameters
2822
+ ----------
2823
+ name : str or Waiver, optional
2824
+ Scale title.
2825
+ aesthetics : str or list of str
2826
+ Aesthetic names.
2827
+ **kwargs
2828
+ Passed to :func:`discrete_scale`.
2829
+
2830
+ Returns
2831
+ -------
2832
+ ScaleDiscrete
2833
+ """
2834
+ return discrete_scale(
2835
+ aesthetics,
2836
+ palette=pal_viridis(),
2837
+ name=name,
2838
+ **kwargs,
2839
+ )
2840
+
2841
+
2842
+ def scale_fill_ordinal(
2843
+ name: Any = None,
2844
+ *,
2845
+ aesthetics: Union[str, List[str]] = "fill",
2846
+ **kwargs: Any,
2847
+ ) -> ScaleDiscrete:
2848
+ """Ordinal fill scale (viridis palette).
2849
+
2850
+ Parameters
2851
+ ----------
2852
+ name, aesthetics
2853
+ See :func:`scale_colour_ordinal`.
2854
+ **kwargs
2855
+ Passed to :func:`discrete_scale`.
2856
+
2857
+ Returns
2858
+ -------
2859
+ ScaleDiscrete
2860
+ """
2861
+ return discrete_scale(
2862
+ aesthetics,
2863
+ palette=pal_viridis(),
2864
+ name=name,
2865
+ **kwargs,
2866
+ )
2867
+
2868
+
2869
+ # =========================================================================
2870
+ # Alpha scales
2871
+ # =========================================================================
2872
+
2873
+ def scale_alpha(
2874
+ name: Any = None,
2875
+ *,
2876
+ range: Optional[Sequence[float]] = None,
2877
+ aesthetics: Union[str, List[str]] = "alpha",
2878
+ **kwargs: Any,
2879
+ ) -> ScaleContinuous:
2880
+ """Alpha transparency continuous scale.
2881
+
2882
+ Parameters
2883
+ ----------
2884
+ name : str or Waiver, optional
2885
+ Scale title.
2886
+ range : tuple of float, optional
2887
+ Output alpha range (default ``(0.1, 1)``).
2888
+ aesthetics : str or list of str
2889
+ Aesthetic names.
2890
+ **kwargs
2891
+ Passed to :func:`continuous_scale`.
2892
+
2893
+ Returns
2894
+ -------
2895
+ ScaleContinuous
2896
+ """
2897
+ palette = pal_rescale(range) if range is not None else None
2898
+ return continuous_scale(
2899
+ aesthetics,
2900
+ palette=palette,
2901
+ name=name,
2902
+ fallback_palette=pal_rescale((0.1, 1)),
2903
+ **kwargs,
2904
+ )
2905
+
2906
+
2907
+ scale_alpha_continuous = scale_alpha
2908
+
2909
+
2910
+ def scale_alpha_binned(
2911
+ name: Any = None,
2912
+ *,
2913
+ range: Optional[Sequence[float]] = None,
2914
+ aesthetics: Union[str, List[str]] = "alpha",
2915
+ **kwargs: Any,
2916
+ ) -> ScaleBinned:
2917
+ """Alpha transparency binned scale.
2918
+
2919
+ Parameters
2920
+ ----------
2921
+ name : str or Waiver, optional
2922
+ Scale title.
2923
+ range : tuple of float, optional
2924
+ Output alpha range.
2925
+ aesthetics : str or list of str
2926
+ Aesthetic names.
2927
+ **kwargs
2928
+ Passed to :func:`binned_scale`.
2929
+
2930
+ Returns
2931
+ -------
2932
+ ScaleBinned
2933
+ """
2934
+ palette = pal_rescale(range) if range is not None else None
2935
+ return binned_scale(
2936
+ aesthetics,
2937
+ palette=palette,
2938
+ name=name,
2939
+ fallback_palette=pal_rescale((0.1, 1)),
2940
+ **kwargs,
2941
+ )
2942
+
2943
+
2944
+ def scale_alpha_discrete(
2945
+ name: Any = None,
2946
+ *,
2947
+ range: Optional[Sequence[float]] = None,
2948
+ aesthetics: Union[str, List[str]] = "alpha",
2949
+ **kwargs: Any,
2950
+ ) -> ScaleDiscrete:
2951
+ """Alpha transparency discrete scale.
2952
+
2953
+ Parameters
2954
+ ----------
2955
+ name : str or Waiver, optional
2956
+ Scale title.
2957
+ range : tuple of float, optional
2958
+ Output alpha range.
2959
+ aesthetics : str or list of str
2960
+ Aesthetic names.
2961
+ **kwargs
2962
+ Passed to :func:`scale_alpha_ordinal`.
2963
+
2964
+ Returns
2965
+ -------
2966
+ ScaleDiscrete
2967
+ """
2968
+ cli_warn("Using alpha for a discrete variable is not advised.")
2969
+ return scale_alpha_ordinal(name=name, range=range, aesthetics=aesthetics, **kwargs)
2970
+
2971
+
2972
+ def scale_alpha_ordinal(
2973
+ name: Any = None,
2974
+ *,
2975
+ range: Optional[Sequence[float]] = None,
2976
+ aesthetics: Union[str, List[str]] = "alpha",
2977
+ **kwargs: Any,
2978
+ ) -> ScaleDiscrete:
2979
+ """Alpha transparency ordinal scale.
2980
+
2981
+ Parameters
2982
+ ----------
2983
+ name : str or Waiver, optional
2984
+ Scale title.
2985
+ range : tuple of float, optional
2986
+ Output alpha range.
2987
+ aesthetics : str or list of str
2988
+ Aesthetic names.
2989
+ **kwargs
2990
+ Passed to :func:`discrete_scale`.
2991
+
2992
+ Returns
2993
+ -------
2994
+ ScaleDiscrete
2995
+ """
2996
+ if range is not None:
2997
+ _r = range
2998
+
2999
+ def palette(n: int) -> List[float]:
3000
+ return list(np.linspace(_r[0], _r[1], n))
3001
+ else:
3002
+ palette = None
3003
+ return discrete_scale(
3004
+ aesthetics,
3005
+ palette=palette,
3006
+ name=name,
3007
+ fallback_palette=lambda n: list(np.linspace(0.1, 1, n)),
3008
+ **kwargs,
3009
+ )
3010
+
3011
+
3012
+ def scale_alpha_identity(
3013
+ name: Any = None,
3014
+ *,
3015
+ guide: str = "none",
3016
+ aesthetics: Union[str, List[str]] = "alpha",
3017
+ **kwargs: Any,
3018
+ ) -> ScaleContinuousIdentity:
3019
+ """Alpha identity scale.
3020
+
3021
+ Parameters
3022
+ ----------
3023
+ name : str or Waiver, optional
3024
+ Scale title.
3025
+ guide : str
3026
+ Guide type.
3027
+ aesthetics : str or list of str
3028
+ Aesthetic names.
3029
+ **kwargs
3030
+ Passed to :func:`continuous_scale`.
3031
+
3032
+ Returns
3033
+ -------
3034
+ ScaleContinuousIdentity
3035
+ """
3036
+ return continuous_scale(
3037
+ aesthetics,
3038
+ palette=pal_identity(),
3039
+ name=name,
3040
+ guide=guide,
3041
+ super_class=ScaleContinuousIdentity,
3042
+ **kwargs,
3043
+ )
3044
+
3045
+
3046
+ def scale_alpha_manual(
3047
+ *,
3048
+ values: Any,
3049
+ breaks: Any = None,
3050
+ na_value: Any = np.nan,
3051
+ aesthetics: Union[str, List[str]] = "alpha",
3052
+ **kwargs: Any,
3053
+ ) -> ScaleDiscrete:
3054
+ """Alpha manual scale.
3055
+
3056
+ Parameters
3057
+ ----------
3058
+ values : dict or list
3059
+ Manual alpha values.
3060
+ breaks : any, optional
3061
+ Break specification.
3062
+ na_value : any
3063
+ Value for missing data.
3064
+ aesthetics : str or list of str
3065
+ Aesthetic names.
3066
+ **kwargs
3067
+ Passed to ``_manual_scale``.
3068
+
3069
+ Returns
3070
+ -------
3071
+ ScaleDiscrete
3072
+ """
3073
+ if breaks is None:
3074
+ breaks = waiver()
3075
+ return _manual_scale(aesthetics, values, breaks, na_value=na_value, **kwargs)
3076
+
3077
+
3078
+ def scale_alpha_date(
3079
+ name: Any = None,
3080
+ *,
3081
+ range: Optional[Sequence[float]] = None,
3082
+ aesthetics: Union[str, List[str]] = "alpha",
3083
+ **kwargs: Any,
3084
+ ) -> ScaleContinuous:
3085
+ """Alpha date scale.
3086
+
3087
+ Parameters
3088
+ ----------
3089
+ name, range, aesthetics
3090
+ See :func:`scale_alpha`.
3091
+ **kwargs
3092
+ Passed to :func:`continuous_scale`.
3093
+
3094
+ Returns
3095
+ -------
3096
+ ScaleContinuous
3097
+ """
3098
+ palette = pal_rescale(range) if range is not None else None
3099
+ return continuous_scale(
3100
+ aesthetics,
3101
+ palette=palette,
3102
+ name=name,
3103
+ transform=transform_date(),
3104
+ fallback_palette=pal_rescale((0.1, 1)),
3105
+ **kwargs,
3106
+ )
3107
+
3108
+
3109
+ def scale_alpha_datetime(
3110
+ name: Any = None,
3111
+ *,
3112
+ range: Optional[Sequence[float]] = None,
3113
+ aesthetics: Union[str, List[str]] = "alpha",
3114
+ **kwargs: Any,
3115
+ ) -> ScaleContinuous:
3116
+ """Alpha datetime scale.
3117
+
3118
+ Parameters
3119
+ ----------
3120
+ name, range, aesthetics
3121
+ See :func:`scale_alpha`.
3122
+ **kwargs
3123
+ Passed to :func:`continuous_scale`.
3124
+
3125
+ Returns
3126
+ -------
3127
+ ScaleContinuous
3128
+ """
3129
+ palette = pal_rescale(range) if range is not None else None
3130
+ return continuous_scale(
3131
+ aesthetics,
3132
+ palette=palette,
3133
+ name=name,
3134
+ transform=transform_time(),
3135
+ fallback_palette=pal_rescale((0.1, 1)),
3136
+ **kwargs,
3137
+ )
3138
+
3139
+
3140
+ # =========================================================================
3141
+ # Size scales
3142
+ # =========================================================================
3143
+
3144
+ def scale_size_continuous(
3145
+ name: Any = None,
3146
+ *,
3147
+ breaks: Any = None,
3148
+ labels: Any = None,
3149
+ limits: Optional[Any] = None,
3150
+ range: Optional[Sequence[float]] = None,
3151
+ transform: Union[str, Any] = "identity",
3152
+ trans: Optional[Any] = None,
3153
+ guide: str = "legend",
3154
+ aesthetics: Union[str, List[str]] = "size",
3155
+ ) -> ScaleContinuous:
3156
+ """Continuous size scale (area-based).
3157
+
3158
+ Parameters
3159
+ ----------
3160
+ name : str or Waiver, optional
3161
+ Scale title.
3162
+ breaks, labels, limits
3163
+ Standard break/label/limit parameters.
3164
+ range : tuple of float, optional
3165
+ Size range.
3166
+ transform : str or Transform
3167
+ Transformation.
3168
+ trans : str or Transform, optional
3169
+ Deprecated alias.
3170
+ guide : str
3171
+ Guide type.
3172
+ aesthetics : str or list of str
3173
+ Aesthetic names.
3174
+
3175
+ Returns
3176
+ -------
3177
+ ScaleContinuous
3178
+ """
3179
+ palette = pal_area(range) if range is not None else None
3180
+ return continuous_scale(
3181
+ aesthetics,
3182
+ palette=palette,
3183
+ name=name,
3184
+ breaks=breaks,
3185
+ labels=labels,
3186
+ limits=limits,
3187
+ transform=transform,
3188
+ trans=trans,
3189
+ guide=guide,
3190
+ fallback_palette=pal_area(),
3191
+ )
3192
+
3193
+
3194
+ scale_size = scale_size_continuous
3195
+
3196
+
3197
+ def scale_radius(
3198
+ name: Any = None,
3199
+ *,
3200
+ breaks: Any = None,
3201
+ labels: Any = None,
3202
+ limits: Optional[Any] = None,
3203
+ range: Sequence[float] = (1, 6),
3204
+ transform: Union[str, Any] = "identity",
3205
+ trans: Optional[Any] = None,
3206
+ guide: str = "legend",
3207
+ aesthetics: Union[str, List[str]] = "size",
3208
+ ) -> ScaleContinuous:
3209
+ """Radius-based size scale.
3210
+
3211
+ Parameters
3212
+ ----------
3213
+ name : str or Waiver, optional
3214
+ Scale title.
3215
+ breaks, labels, limits
3216
+ Standard parameters.
3217
+ range : tuple of float
3218
+ Radius range.
3219
+ transform, trans, guide, aesthetics
3220
+ Standard parameters.
3221
+
3222
+ Returns
3223
+ -------
3224
+ ScaleContinuous
3225
+ """
3226
+ return continuous_scale(
3227
+ aesthetics,
3228
+ palette=pal_rescale(range),
3229
+ name=name,
3230
+ breaks=breaks,
3231
+ labels=labels,
3232
+ limits=limits,
3233
+ transform=transform,
3234
+ trans=trans,
3235
+ guide=guide,
3236
+ )
3237
+
3238
+
3239
+ def scale_size_binned(
3240
+ name: Any = None,
3241
+ *,
3242
+ breaks: Any = None,
3243
+ labels: Any = None,
3244
+ limits: Optional[Any] = None,
3245
+ range: Optional[Sequence[float]] = None,
3246
+ n_breaks: Optional[int] = None,
3247
+ nice_breaks: bool = True,
3248
+ transform: Union[str, Any] = "identity",
3249
+ trans: Optional[Any] = None,
3250
+ guide: str = "bins",
3251
+ aesthetics: Union[str, List[str]] = "size",
3252
+ ) -> ScaleBinned:
3253
+ """Binned size scale.
3254
+
3255
+ Parameters
3256
+ ----------
3257
+ name, breaks, labels, limits, range, n_breaks, nice_breaks,
3258
+ transform, trans, guide, aesthetics
3259
+ Standard scale parameters.
3260
+
3261
+ Returns
3262
+ -------
3263
+ ScaleBinned
3264
+ """
3265
+ palette = pal_area(range) if range is not None else None
3266
+ return binned_scale(
3267
+ aesthetics,
3268
+ palette=palette,
3269
+ name=name,
3270
+ breaks=breaks,
3271
+ labels=labels,
3272
+ limits=limits,
3273
+ transform=transform,
3274
+ trans=trans,
3275
+ n_breaks=n_breaks,
3276
+ nice_breaks=nice_breaks,
3277
+ guide=guide,
3278
+ fallback_palette=pal_area(),
3279
+ )
3280
+
3281
+
3282
+ def scale_size_discrete(
3283
+ name: Any = None,
3284
+ **kwargs: Any,
3285
+ ) -> ScaleDiscrete:
3286
+ """Discrete size scale (not recommended).
3287
+
3288
+ Parameters
3289
+ ----------
3290
+ name : str or Waiver, optional
3291
+ Scale title.
3292
+ **kwargs
3293
+ Passed to :func:`scale_size_ordinal`.
3294
+
3295
+ Returns
3296
+ -------
3297
+ ScaleDiscrete
3298
+ """
3299
+ cli_warn("Using size for a discrete variable is not advised.")
3300
+ return scale_size_ordinal(name=name, **kwargs)
3301
+
3302
+
3303
+ def scale_size_ordinal(
3304
+ name: Any = None,
3305
+ *,
3306
+ range: Optional[Sequence[float]] = None,
3307
+ aesthetics: Union[str, List[str]] = "size",
3308
+ **kwargs: Any,
3309
+ ) -> ScaleDiscrete:
3310
+ """Ordinal size scale.
3311
+
3312
+ Parameters
3313
+ ----------
3314
+ name : str or Waiver, optional
3315
+ Scale title.
3316
+ range : tuple of float, optional
3317
+ Size range.
3318
+ aesthetics : str or list of str
3319
+ Aesthetic names.
3320
+ **kwargs
3321
+ Passed to :func:`discrete_scale`.
3322
+
3323
+ Returns
3324
+ -------
3325
+ ScaleDiscrete
3326
+ """
3327
+ if range is not None:
3328
+ _r = range
3329
+
3330
+ def palette(n: int) -> List[float]:
3331
+ return list(np.sqrt(np.linspace(_r[0] ** 2, _r[1] ** 2, n)))
3332
+ else:
3333
+ palette = None
3334
+ return discrete_scale(
3335
+ aesthetics,
3336
+ palette=palette,
3337
+ name=name,
3338
+ fallback_palette=lambda n: list(np.sqrt(np.linspace(4, 36, n))),
3339
+ **kwargs,
3340
+ )
3341
+
3342
+
3343
+ def scale_size_area(
3344
+ name: Any = None,
3345
+ *,
3346
+ max_size: float = 6,
3347
+ aesthetics: Union[str, List[str]] = "size",
3348
+ **kwargs: Any,
3349
+ ) -> ScaleContinuous:
3350
+ """Size scale where 0 maps to size 0.
3351
+
3352
+ Parameters
3353
+ ----------
3354
+ name : str or Waiver, optional
3355
+ Scale title.
3356
+ max_size : float
3357
+ Maximum point size.
3358
+ aesthetics : str or list of str
3359
+ Aesthetic names.
3360
+ **kwargs
3361
+ Passed to :func:`continuous_scale`.
3362
+
3363
+ Returns
3364
+ -------
3365
+ ScaleContinuous
3366
+ """
3367
+ return continuous_scale(
3368
+ aesthetics,
3369
+ palette=abs_area(max_size),
3370
+ name=name,
3371
+ rescaler=rescale_max,
3372
+ **kwargs,
3373
+ )
3374
+
3375
+
3376
+ def scale_size_binned_area(
3377
+ name: Any = None,
3378
+ *,
3379
+ max_size: float = 6,
3380
+ aesthetics: Union[str, List[str]] = "size",
3381
+ **kwargs: Any,
3382
+ ) -> ScaleBinned:
3383
+ """Binned size scale where 0 maps to size 0.
3384
+
3385
+ Parameters
3386
+ ----------
3387
+ name : str or Waiver, optional
3388
+ Scale title.
3389
+ max_size : float
3390
+ Maximum point size.
3391
+ aesthetics : str or list of str
3392
+ Aesthetic names.
3393
+ **kwargs
3394
+ Passed to :func:`binned_scale`.
3395
+
3396
+ Returns
3397
+ -------
3398
+ ScaleBinned
3399
+ """
3400
+ return binned_scale(
3401
+ aesthetics,
3402
+ palette=abs_area(max_size),
3403
+ name=name,
3404
+ rescaler=rescale_max,
3405
+ **kwargs,
3406
+ )
3407
+
3408
+
3409
+ def scale_size_identity(
3410
+ name: Any = None,
3411
+ *,
3412
+ guide: str = "none",
3413
+ aesthetics: Union[str, List[str]] = "size",
3414
+ **kwargs: Any,
3415
+ ) -> ScaleContinuousIdentity:
3416
+ """Size identity scale.
3417
+
3418
+ Parameters
3419
+ ----------
3420
+ name, guide, aesthetics
3421
+ Standard parameters.
3422
+ **kwargs
3423
+ Passed to :func:`continuous_scale`.
3424
+
3425
+ Returns
3426
+ -------
3427
+ ScaleContinuousIdentity
3428
+ """
3429
+ return continuous_scale(
3430
+ aesthetics,
3431
+ palette=pal_identity(),
3432
+ name=name,
3433
+ guide=guide,
3434
+ super_class=ScaleContinuousIdentity,
3435
+ **kwargs,
3436
+ )
3437
+
3438
+
3439
+ def scale_size_manual(
3440
+ *,
3441
+ values: Any,
3442
+ breaks: Any = None,
3443
+ na_value: Any = np.nan,
3444
+ aesthetics: Union[str, List[str]] = "size",
3445
+ **kwargs: Any,
3446
+ ) -> ScaleDiscrete:
3447
+ """Size manual scale.
3448
+
3449
+ Parameters
3450
+ ----------
3451
+ values, breaks, na_value, aesthetics
3452
+ Standard parameters.
3453
+ **kwargs
3454
+ Passed to ``_manual_scale``.
3455
+
3456
+ Returns
3457
+ -------
3458
+ ScaleDiscrete
3459
+ """
3460
+ if breaks is None:
3461
+ breaks = waiver()
3462
+ return _manual_scale(aesthetics, values, breaks, na_value=na_value, **kwargs)
3463
+
3464
+
3465
+ def scale_size_date(
3466
+ name: Any = None,
3467
+ *,
3468
+ range: Optional[Sequence[float]] = None,
3469
+ aesthetics: Union[str, List[str]] = "size",
3470
+ **kwargs: Any,
3471
+ ) -> ScaleContinuous:
3472
+ """Size date scale.
3473
+
3474
+ Parameters
3475
+ ----------
3476
+ name, range, aesthetics
3477
+ Standard parameters.
3478
+ **kwargs
3479
+ Passed to :func:`continuous_scale`.
3480
+
3481
+ Returns
3482
+ -------
3483
+ ScaleContinuous
3484
+ """
3485
+ palette = pal_area(range) if range is not None else None
3486
+ return continuous_scale(
3487
+ aesthetics,
3488
+ palette=palette,
3489
+ name=name,
3490
+ transform=transform_date(),
3491
+ fallback_palette=pal_area(),
3492
+ **kwargs,
3493
+ )
3494
+
3495
+
3496
+ def scale_size_datetime(
3497
+ name: Any = None,
3498
+ *,
3499
+ range: Optional[Sequence[float]] = None,
3500
+ aesthetics: Union[str, List[str]] = "size",
3501
+ **kwargs: Any,
3502
+ ) -> ScaleContinuous:
3503
+ """Size datetime scale.
3504
+
3505
+ Parameters
3506
+ ----------
3507
+ name, range, aesthetics
3508
+ Standard parameters.
3509
+ **kwargs
3510
+ Passed to :func:`continuous_scale`.
3511
+
3512
+ Returns
3513
+ -------
3514
+ ScaleContinuous
3515
+ """
3516
+ palette = pal_area(range) if range is not None else None
3517
+ return continuous_scale(
3518
+ aesthetics,
3519
+ palette=palette,
3520
+ name=name,
3521
+ transform=transform_time(),
3522
+ fallback_palette=pal_area(),
3523
+ **kwargs,
3524
+ )
3525
+
3526
+
3527
+ # =========================================================================
3528
+ # Shape scales
3529
+ # =========================================================================
3530
+
3531
+ def scale_shape(
3532
+ name: Any = None,
3533
+ *,
3534
+ solid: Optional[bool] = None,
3535
+ aesthetics: Union[str, List[str]] = "shape",
3536
+ **kwargs: Any,
3537
+ ) -> ScaleDiscrete:
3538
+ """Discrete shape scale.
3539
+
3540
+ Parameters
3541
+ ----------
3542
+ name : str or Waiver, optional
3543
+ Scale title.
3544
+ solid : bool, optional
3545
+ Whether shapes are solid (default) or hollow.
3546
+ aesthetics : str or list of str
3547
+ Aesthetic names.
3548
+ **kwargs
3549
+ Passed to :func:`discrete_scale`.
3550
+
3551
+ Returns
3552
+ -------
3553
+ ScaleDiscrete
3554
+ """
3555
+ palette = pal_shape(solid) if solid is not None else None
3556
+ return discrete_scale(
3557
+ aesthetics,
3558
+ palette=palette,
3559
+ name=name,
3560
+ fallback_palette=pal_shape(),
3561
+ **kwargs,
3562
+ )
3563
+
3564
+
3565
+ scale_shape_discrete = scale_shape
3566
+
3567
+
3568
+ def scale_shape_binned(
3569
+ name: Any = None,
3570
+ *,
3571
+ solid: bool = True,
3572
+ aesthetics: Union[str, List[str]] = "shape",
3573
+ **kwargs: Any,
3574
+ ) -> ScaleBinned:
3575
+ """Binned shape scale.
3576
+
3577
+ Parameters
3578
+ ----------
3579
+ name : str or Waiver, optional
3580
+ Scale title.
3581
+ solid : bool
3582
+ Whether shapes are solid.
3583
+ aesthetics : str or list of str
3584
+ Aesthetic names.
3585
+ **kwargs
3586
+ Passed to :func:`binned_scale`.
3587
+
3588
+ Returns
3589
+ -------
3590
+ ScaleBinned
3591
+ """
3592
+ return binned_scale(
3593
+ aesthetics,
3594
+ palette=pal_shape(solid),
3595
+ name=name,
3596
+ **kwargs,
3597
+ )
3598
+
3599
+
3600
+ def scale_shape_continuous(**kwargs: Any) -> None:
3601
+ """Raise an error -- continuous data cannot be mapped to shape.
3602
+
3603
+ Raises
3604
+ ------
3605
+ ValueError
3606
+ """
3607
+ cli_abort(
3608
+ "A continuous variable cannot be mapped to the shape aesthetic. "
3609
+ "Choose a different aesthetic or use scale_shape_binned()."
3610
+ )
3611
+
3612
+
3613
+ def scale_shape_identity(
3614
+ name: Any = None,
3615
+ *,
3616
+ guide: str = "none",
3617
+ aesthetics: Union[str, List[str]] = "shape",
3618
+ **kwargs: Any,
3619
+ ) -> ScaleContinuousIdentity:
3620
+ """Shape identity scale.
3621
+
3622
+ Parameters
3623
+ ----------
3624
+ name, guide, aesthetics
3625
+ Standard parameters.
3626
+ **kwargs
3627
+ Passed to :func:`continuous_scale`.
3628
+
3629
+ Returns
3630
+ -------
3631
+ ScaleContinuousIdentity
3632
+ """
3633
+ return continuous_scale(
3634
+ aesthetics,
3635
+ palette=pal_identity(),
3636
+ name=name,
3637
+ guide=guide,
3638
+ super_class=ScaleContinuousIdentity,
3639
+ **kwargs,
3640
+ )
3641
+
3642
+
3643
+ def scale_shape_manual(
3644
+ *,
3645
+ values: Any,
3646
+ breaks: Any = None,
3647
+ na_value: Any = np.nan,
3648
+ aesthetics: Union[str, List[str]] = "shape",
3649
+ **kwargs: Any,
3650
+ ) -> ScaleDiscrete:
3651
+ """Shape manual scale.
3652
+
3653
+ Parameters
3654
+ ----------
3655
+ values, breaks, na_value, aesthetics
3656
+ Standard parameters.
3657
+ **kwargs
3658
+ Passed to ``_manual_scale``.
3659
+
3660
+ Returns
3661
+ -------
3662
+ ScaleDiscrete
3663
+ """
3664
+ if breaks is None:
3665
+ breaks = waiver()
3666
+ return _manual_scale(aesthetics, values, breaks, na_value=na_value, **kwargs)
3667
+
3668
+
3669
+ def scale_shape_ordinal(
3670
+ name: Any = None,
3671
+ **kwargs: Any,
3672
+ ) -> ScaleDiscrete:
3673
+ """Ordinal shape scale (not recommended).
3674
+
3675
+ Parameters
3676
+ ----------
3677
+ name : str or Waiver, optional
3678
+ Scale title.
3679
+ **kwargs
3680
+ Passed to :func:`scale_shape`.
3681
+
3682
+ Returns
3683
+ -------
3684
+ ScaleDiscrete
3685
+ """
3686
+ cli_warn("Using shapes for an ordinal variable is not advised.")
3687
+ return scale_shape(name=name, **kwargs)
3688
+
3689
+
3690
+ # =========================================================================
3691
+ # Linetype scales
3692
+ # =========================================================================
3693
+
3694
+ def scale_linetype(
3695
+ name: Any = None,
3696
+ *,
3697
+ aesthetics: Union[str, List[str]] = "linetype",
3698
+ **kwargs: Any,
3699
+ ) -> ScaleDiscrete:
3700
+ """Discrete linetype scale.
3701
+
3702
+ Parameters
3703
+ ----------
3704
+ name : str or Waiver, optional
3705
+ Scale title.
3706
+ aesthetics : str or list of str
3707
+ Aesthetic names.
3708
+ **kwargs
3709
+ Passed to :func:`discrete_scale`.
3710
+
3711
+ Returns
3712
+ -------
3713
+ ScaleDiscrete
3714
+ """
3715
+ return discrete_scale(
3716
+ aesthetics,
3717
+ palette=None,
3718
+ name=name,
3719
+ fallback_palette=pal_linetype(),
3720
+ **kwargs,
3721
+ )
3722
+
3723
+
3724
+ scale_linetype_discrete = scale_linetype
3725
+ scale_linetype_ordinal = scale_linetype
3726
+
3727
+
3728
+ def scale_linetype_binned(
3729
+ name: Any = None,
3730
+ *,
3731
+ aesthetics: Union[str, List[str]] = "linetype",
3732
+ **kwargs: Any,
3733
+ ) -> ScaleBinned:
3734
+ """Binned linetype scale.
3735
+
3736
+ Parameters
3737
+ ----------
3738
+ name : str or Waiver, optional
3739
+ Scale title.
3740
+ aesthetics : str or list of str
3741
+ Aesthetic names.
3742
+ **kwargs
3743
+ Passed to :func:`binned_scale`.
3744
+
3745
+ Returns
3746
+ -------
3747
+ ScaleBinned
3748
+ """
3749
+ return binned_scale(
3750
+ aesthetics,
3751
+ palette=None,
3752
+ name=name,
3753
+ fallback_palette=pal_linetype(),
3754
+ **kwargs,
3755
+ )
3756
+
3757
+
3758
+ def scale_linetype_continuous(**kwargs: Any) -> None:
3759
+ """Raise an error -- continuous data cannot be mapped to linetype.
3760
+
3761
+ Raises
3762
+ ------
3763
+ ValueError
3764
+ """
3765
+ cli_abort(
3766
+ "A continuous variable cannot be mapped to the linetype aesthetic. "
3767
+ "Choose a different aesthetic or use scale_linetype_binned()."
3768
+ )
3769
+
3770
+
3771
+ def scale_linetype_identity(
3772
+ name: Any = None,
3773
+ *,
3774
+ guide: str = "none",
3775
+ aesthetics: Union[str, List[str]] = "linetype",
3776
+ **kwargs: Any,
3777
+ ) -> ScaleDiscreteIdentity:
3778
+ """Linetype identity scale.
3779
+
3780
+ Parameters
3781
+ ----------
3782
+ name, guide, aesthetics
3783
+ Standard parameters.
3784
+ **kwargs
3785
+ Passed to :func:`discrete_scale`.
3786
+
3787
+ Returns
3788
+ -------
3789
+ ScaleDiscreteIdentity
3790
+ """
3791
+ return discrete_scale(
3792
+ aesthetics,
3793
+ palette=pal_identity(),
3794
+ name=name,
3795
+ guide=guide,
3796
+ super_class=ScaleDiscreteIdentity,
3797
+ **kwargs,
3798
+ )
3799
+
3800
+
3801
+ def scale_linetype_manual(
3802
+ *,
3803
+ values: Any,
3804
+ breaks: Any = None,
3805
+ na_value: Any = np.nan,
3806
+ aesthetics: Union[str, List[str]] = "linetype",
3807
+ **kwargs: Any,
3808
+ ) -> ScaleDiscrete:
3809
+ """Linetype manual scale.
3810
+
3811
+ Parameters
3812
+ ----------
3813
+ values, breaks, na_value, aesthetics
3814
+ Standard parameters.
3815
+ **kwargs
3816
+ Passed to ``_manual_scale``.
3817
+
3818
+ Returns
3819
+ -------
3820
+ ScaleDiscrete
3821
+ """
3822
+ if breaks is None:
3823
+ breaks = waiver()
3824
+ return _manual_scale(aesthetics, values, breaks, na_value=na_value, **kwargs)
3825
+
3826
+
3827
+ # =========================================================================
3828
+ # Linewidth scales
3829
+ # =========================================================================
3830
+
3831
+ def scale_linewidth_continuous(
3832
+ name: Any = None,
3833
+ *,
3834
+ breaks: Any = None,
3835
+ labels: Any = None,
3836
+ limits: Optional[Any] = None,
3837
+ range: Optional[Sequence[float]] = None,
3838
+ transform: Union[str, Any] = "identity",
3839
+ trans: Optional[Any] = None,
3840
+ guide: str = "legend",
3841
+ aesthetics: Union[str, List[str]] = "linewidth",
3842
+ ) -> ScaleContinuous:
3843
+ """Continuous linewidth scale.
3844
+
3845
+ Parameters
3846
+ ----------
3847
+ name, breaks, labels, limits, range, transform, trans, guide, aesthetics
3848
+ Standard parameters.
3849
+
3850
+ Returns
3851
+ -------
3852
+ ScaleContinuous
3853
+ """
3854
+ palette = pal_rescale(range) if range is not None else None
3855
+ return continuous_scale(
3856
+ aesthetics,
3857
+ palette=palette,
3858
+ name=name,
3859
+ breaks=breaks,
3860
+ labels=labels,
3861
+ limits=limits,
3862
+ transform=transform,
3863
+ trans=trans,
3864
+ guide=guide,
3865
+ fallback_palette=pal_rescale((1, 6)),
3866
+ )
3867
+
3868
+
3869
+ scale_linewidth = scale_linewidth_continuous
3870
+
3871
+
3872
+ def scale_linewidth_binned(
3873
+ name: Any = None,
3874
+ *,
3875
+ breaks: Any = None,
3876
+ labels: Any = None,
3877
+ limits: Optional[Any] = None,
3878
+ range: Optional[Sequence[float]] = None,
3879
+ n_breaks: Optional[int] = None,
3880
+ nice_breaks: bool = True,
3881
+ transform: Union[str, Any] = "identity",
3882
+ trans: Optional[Any] = None,
3883
+ guide: str = "bins",
3884
+ aesthetics: Union[str, List[str]] = "linewidth",
3885
+ ) -> ScaleBinned:
3886
+ """Binned linewidth scale.
3887
+
3888
+ Parameters
3889
+ ----------
3890
+ name, breaks, labels, limits, range, n_breaks, nice_breaks,
3891
+ transform, trans, guide, aesthetics
3892
+ Standard parameters.
3893
+
3894
+ Returns
3895
+ -------
3896
+ ScaleBinned
3897
+ """
3898
+ palette = pal_rescale(range) if range is not None else None
3899
+ return binned_scale(
3900
+ aesthetics,
3901
+ palette=palette,
3902
+ name=name,
3903
+ breaks=breaks,
3904
+ labels=labels,
3905
+ limits=limits,
3906
+ transform=transform,
3907
+ trans=trans,
3908
+ n_breaks=n_breaks,
3909
+ nice_breaks=nice_breaks,
3910
+ guide=guide,
3911
+ fallback_palette=pal_rescale((1, 6)),
3912
+ )
3913
+
3914
+
3915
+ def scale_linewidth_discrete(
3916
+ name: Any = None,
3917
+ **kwargs: Any,
3918
+ ) -> ScaleDiscrete:
3919
+ """Discrete linewidth scale (not recommended).
3920
+
3921
+ Parameters
3922
+ ----------
3923
+ name : str or Waiver, optional
3924
+ Scale title.
3925
+ **kwargs
3926
+ Passed to :func:`scale_linewidth_ordinal`.
3927
+
3928
+ Returns
3929
+ -------
3930
+ ScaleDiscrete
3931
+ """
3932
+ cli_warn("Using linewidth for a discrete variable is not advised.")
3933
+ return scale_linewidth_ordinal(name=name, **kwargs)
3934
+
3935
+
3936
+ def scale_linewidth_ordinal(
3937
+ name: Any = None,
3938
+ *,
3939
+ range: Optional[Sequence[float]] = None,
3940
+ aesthetics: Union[str, List[str]] = "linewidth",
3941
+ **kwargs: Any,
3942
+ ) -> ScaleDiscrete:
3943
+ """Ordinal linewidth scale.
3944
+
3945
+ Parameters
3946
+ ----------
3947
+ name : str or Waiver, optional
3948
+ Scale title.
3949
+ range : tuple of float, optional
3950
+ Linewidth range.
3951
+ aesthetics : str or list of str
3952
+ Aesthetic names.
3953
+ **kwargs
3954
+ Passed to :func:`discrete_scale`.
3955
+
3956
+ Returns
3957
+ -------
3958
+ ScaleDiscrete
3959
+ """
3960
+ if range is not None:
3961
+ _r = range
3962
+
3963
+ def palette(n: int) -> List[float]:
3964
+ return list(np.linspace(_r[0], _r[1], n))
3965
+ else:
3966
+ palette = None
3967
+ return discrete_scale(
3968
+ aesthetics,
3969
+ palette=palette,
3970
+ name=name,
3971
+ fallback_palette=lambda n: list(np.linspace(2, 6, n)),
3972
+ **kwargs,
3973
+ )
3974
+
3975
+
3976
+ def scale_linewidth_identity(
3977
+ name: Any = None,
3978
+ *,
3979
+ guide: str = "none",
3980
+ aesthetics: Union[str, List[str]] = "linewidth",
3981
+ **kwargs: Any,
3982
+ ) -> ScaleContinuousIdentity:
3983
+ """Linewidth identity scale.
3984
+
3985
+ Parameters
3986
+ ----------
3987
+ name, guide, aesthetics
3988
+ Standard parameters.
3989
+ **kwargs
3990
+ Passed to :func:`continuous_scale`.
3991
+
3992
+ Returns
3993
+ -------
3994
+ ScaleContinuousIdentity
3995
+ """
3996
+ return continuous_scale(
3997
+ aesthetics,
3998
+ palette=pal_identity(),
3999
+ name=name,
4000
+ guide=guide,
4001
+ super_class=ScaleContinuousIdentity,
4002
+ **kwargs,
4003
+ )
4004
+
4005
+
4006
+ def scale_linewidth_manual(
4007
+ *,
4008
+ values: Any,
4009
+ breaks: Any = None,
4010
+ na_value: Any = np.nan,
4011
+ aesthetics: Union[str, List[str]] = "linewidth",
4012
+ **kwargs: Any,
4013
+ ) -> ScaleDiscrete:
4014
+ """Linewidth manual scale.
4015
+
4016
+ Parameters
4017
+ ----------
4018
+ values, breaks, na_value, aesthetics
4019
+ Standard parameters.
4020
+ **kwargs
4021
+ Passed to ``_manual_scale``.
4022
+
4023
+ Returns
4024
+ -------
4025
+ ScaleDiscrete
4026
+ """
4027
+ if breaks is None:
4028
+ breaks = waiver()
4029
+ return _manual_scale(aesthetics, values, breaks, na_value=na_value, **kwargs)
4030
+
4031
+
4032
+ def scale_linewidth_date(
4033
+ name: Any = None,
4034
+ *,
4035
+ range: Optional[Sequence[float]] = None,
4036
+ aesthetics: Union[str, List[str]] = "linewidth",
4037
+ **kwargs: Any,
4038
+ ) -> ScaleContinuous:
4039
+ """Linewidth date scale.
4040
+
4041
+ Parameters
4042
+ ----------
4043
+ name, range, aesthetics
4044
+ Standard parameters.
4045
+ **kwargs
4046
+ Passed to :func:`continuous_scale`.
4047
+
4048
+ Returns
4049
+ -------
4050
+ ScaleContinuous
4051
+ """
4052
+ palette = pal_rescale(range) if range is not None else None
4053
+ return continuous_scale(
4054
+ aesthetics,
4055
+ palette=palette,
4056
+ name=name,
4057
+ transform=transform_date(),
4058
+ fallback_palette=pal_rescale((1, 6)),
4059
+ **kwargs,
4060
+ )
4061
+
4062
+
4063
+ def scale_linewidth_datetime(
4064
+ name: Any = None,
4065
+ *,
4066
+ range: Optional[Sequence[float]] = None,
4067
+ aesthetics: Union[str, List[str]] = "linewidth",
4068
+ **kwargs: Any,
4069
+ ) -> ScaleContinuous:
4070
+ """Linewidth datetime scale.
4071
+
4072
+ Parameters
4073
+ ----------
4074
+ name, range, aesthetics
4075
+ Standard parameters.
4076
+ **kwargs
4077
+ Passed to :func:`continuous_scale`.
4078
+
4079
+ Returns
4080
+ -------
4081
+ ScaleContinuous
4082
+ """
4083
+ palette = pal_rescale(range) if range is not None else None
4084
+ return continuous_scale(
4085
+ aesthetics,
4086
+ palette=palette,
4087
+ name=name,
4088
+ transform=transform_time(),
4089
+ fallback_palette=pal_rescale((1, 6)),
4090
+ **kwargs,
4091
+ )
4092
+
4093
+
4094
+ # =========================================================================
4095
+ # Stroke scales (mirrors scale_linewidth_* with aesthetics="stroke")
4096
+ # R: stroke has no dedicated scale_stroke() — it falls back to
4097
+ # continuous_scale("stroke", palette=pal_rescale(c(1,6))).
4098
+ # We provide explicit functions for user control and legend generation.
4099
+ # =========================================================================
4100
+
4101
+
4102
+ def scale_stroke_continuous(
4103
+ name: Any = None,
4104
+ *,
4105
+ breaks: Any = None,
4106
+ labels: Any = None,
4107
+ limits: Optional[Any] = None,
4108
+ range: Optional[Sequence[float]] = None,
4109
+ transform: Union[str, Any] = "identity",
4110
+ trans: Optional[Any] = None,
4111
+ guide: str = "legend",
4112
+ aesthetics: Union[str, List[str]] = "stroke",
4113
+ ) -> ScaleContinuous:
4114
+ """Continuous stroke scale (point border width)."""
4115
+ palette = pal_rescale(range) if range is not None else None
4116
+ return continuous_scale(
4117
+ aesthetics,
4118
+ palette=palette,
4119
+ name=name,
4120
+ breaks=breaks,
4121
+ labels=labels,
4122
+ limits=limits,
4123
+ transform=transform,
4124
+ trans=trans,
4125
+ guide=guide,
4126
+ fallback_palette=pal_rescale((0, 6)),
4127
+ )
4128
+
4129
+
4130
+ scale_stroke = scale_stroke_continuous
4131
+
4132
+
4133
+ def scale_stroke_binned(
4134
+ name: Any = None,
4135
+ *,
4136
+ breaks: Any = None,
4137
+ labels: Any = None,
4138
+ limits: Optional[Any] = None,
4139
+ range: Optional[Sequence[float]] = None,
4140
+ n_breaks: Optional[int] = None,
4141
+ nice_breaks: bool = True,
4142
+ transform: Union[str, Any] = "identity",
4143
+ trans: Optional[Any] = None,
4144
+ guide: str = "bins",
4145
+ aesthetics: Union[str, List[str]] = "stroke",
4146
+ ) -> ScaleBinned:
4147
+ """Binned stroke scale."""
4148
+ palette = pal_rescale(range) if range is not None else None
4149
+ return binned_scale(
4150
+ aesthetics,
4151
+ palette=palette,
4152
+ name=name,
4153
+ breaks=breaks,
4154
+ labels=labels,
4155
+ limits=limits,
4156
+ transform=transform,
4157
+ trans=trans,
4158
+ n_breaks=n_breaks,
4159
+ nice_breaks=nice_breaks,
4160
+ guide=guide,
4161
+ fallback_palette=pal_rescale((0, 6)),
4162
+ )
4163
+
4164
+
4165
+ def scale_stroke_discrete(
4166
+ name: Any = None,
4167
+ *,
4168
+ aesthetics: Union[str, List[str]] = "stroke",
4169
+ **kwargs: Any,
4170
+ ) -> Any:
4171
+ """Discrete stroke scale (delegates to ordinal)."""
4172
+ return scale_stroke_ordinal(name=name, **kwargs)
4173
+
4174
+
4175
+ def scale_stroke_ordinal(
4176
+ name: Any = None,
4177
+ *,
4178
+ range: Optional[Sequence[float]] = None,
4179
+ aesthetics: Union[str, List[str]] = "stroke",
4180
+ **kwargs: Any,
4181
+ ) -> ScaleContinuous:
4182
+ """Ordinal stroke scale."""
4183
+ palette = pal_rescale(range) if range is not None else None
4184
+ return continuous_scale(
4185
+ aesthetics,
4186
+ palette=palette,
4187
+ name=name,
4188
+ fallback_palette=pal_rescale((0, 6)),
4189
+ **kwargs,
4190
+ )
4191
+
4192
+
4193
+ def scale_stroke_identity(
4194
+ name: Any = None,
4195
+ *,
4196
+ guide: str = "none",
4197
+ aesthetics: Union[str, List[str]] = "stroke",
4198
+ **kwargs: Any,
4199
+ ) -> ScaleContinuous:
4200
+ """Identity stroke scale (values used as-is)."""
4201
+ return continuous_scale(
4202
+ aesthetics,
4203
+ palette=identity_pal(),
4204
+ name=name,
4205
+ guide=guide,
4206
+ **kwargs,
4207
+ )
4208
+
4209
+
4210
+ def scale_stroke_manual(
4211
+ name: Any = None,
4212
+ *,
4213
+ values: Any = None,
4214
+ aesthetics: Union[str, List[str]] = "stroke",
4215
+ **kwargs: Any,
4216
+ ) -> ScaleContinuous:
4217
+ """Manual stroke scale."""
4218
+ from scales import manual_pal
4219
+ return continuous_scale(
4220
+ aesthetics,
4221
+ palette=manual_pal(values) if values is not None else None,
4222
+ name=name,
4223
+ **kwargs,
4224
+ )
4225
+
4226
+
4227
+ # =========================================================================
4228
+ # American spelling aliases (color -> colour)
4229
+ # =========================================================================
4230
+
4231
+ scale_color_continuous = scale_colour_continuous
4232
+ scale_color_discrete = scale_colour_discrete
4233
+ scale_color_gradient = scale_colour_gradient
4234
+ scale_color_gradient2 = scale_colour_gradient2
4235
+ scale_color_gradientn = scale_colour_gradientn
4236
+ scale_color_hue = scale_colour_hue
4237
+ scale_color_brewer = scale_colour_brewer
4238
+ scale_color_distiller = scale_colour_distiller
4239
+ scale_color_fermenter = scale_colour_fermenter
4240
+ scale_color_grey = scale_colour_grey
4241
+ scale_color_viridis_c = scale_colour_viridis_c
4242
+ scale_color_viridis_d = scale_colour_viridis_d
4243
+ scale_color_viridis_b = scale_colour_viridis_b
4244
+ scale_color_binned = scale_colour_binned
4245
+ scale_color_steps = scale_colour_steps
4246
+ scale_color_steps2 = scale_colour_steps2
4247
+ scale_color_stepsn = scale_colour_stepsn
4248
+ scale_color_identity = scale_colour_identity
4249
+ scale_color_manual = scale_colour_manual
4250
+ scale_color_date = scale_colour_date
4251
+ scale_color_datetime = scale_colour_datetime
4252
+ scale_color_ordinal = scale_colour_ordinal