py2ls 0.1.8.8__py3-none-any.whl → 0.1.9.0__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.
py2ls/ips.py CHANGED
@@ -45,7 +45,8 @@ from langdetect import detect
45
45
  from duckduckgo_search import DDGS
46
46
 
47
47
  from . import netfinder
48
- from .plot import get_color
48
+
49
+ # from .plot import get_color
49
50
 
50
51
  try:
51
52
  get_ipython().run_line_magic("load_ext", "autoreload")
@@ -1354,18 +1355,12 @@ def fsave(
1354
1355
 
1355
1356
  def save_json(fpath_fname, var_dict_or_df):
1356
1357
  with open(fpath_fname, "w") as f_json:
1357
- # Check if var_dict_or_df is a DataFrame
1358
1358
  if isinstance(var_dict_or_df, pd.DataFrame):
1359
- # Convert DataFrame to a list of dictionaries
1360
1359
  var_dict_or_df = var_dict_or_df.to_dict(orient="dict")
1361
-
1362
- # Check if var_dict_or_df is a dictionary
1363
1360
  if isinstance(var_dict_or_df, dict):
1364
- # Convert NumPy arrays to lists
1365
1361
  for key, value in var_dict_or_df.items():
1366
1362
  if isinstance(value, np.ndarray):
1367
1363
  var_dict_or_df[key] = value.tolist()
1368
-
1369
1364
  # Save the dictionary or list of dictionaries to a JSON file
1370
1365
  json.dump(var_dict_or_df, f_json, indent=4)
1371
1366
 
py2ls/plot.py CHANGED
@@ -8,6 +8,7 @@ import matplotlib
8
8
  import matplotlib.ticker as tck
9
9
  from cycler import cycler
10
10
  import logging
11
+ from .ips import fsave
11
12
 
12
13
  # Suppress INFO messages from fontTools
13
14
  logging.getLogger("fontTools").setLevel(logging.WARNING)
@@ -16,7 +17,10 @@ logging.getLogger("fontTools").setLevel(logging.WARNING)
16
17
  def catplot(data, *args, **kwargs):
17
18
  """
18
19
  catplot(data, opt=None, ax=None)
19
-
20
+ The catplot function is designed to provide a flexible way to create various types of
21
+ categorical plots. It supports multiple plot layers such as bars, error bars, scatter
22
+ plots, box plots, violin plots, and lines. Each plot type is handled by its own internal
23
+ function, allowing for separation of concerns and modularity in the design.
20
24
  Args:
21
25
  data (array): data matrix
22
26
  """
@@ -57,7 +61,7 @@ def catplot(data, *args, **kwargs):
57
61
  xloc, opt_e["loc"], opt_e["x_width"], data.shape[0]
58
62
  )
59
63
  error_positions = np.nanmean(error_positions, axis=0)
60
- errors = np.nanstd(data, axis=0)
64
+ errors = np.nanstd(data, axis=0, ddof=1)
61
65
  if opt_e["error"] == "sem":
62
66
  errors /= np.sqrt(np.sum(~np.isnan(data), axis=0))
63
67
 
@@ -212,6 +216,9 @@ def catplot(data, *args, **kwargs):
212
216
  color=bx_opt["MeanLineColor"],
213
217
  linewidth=bx_opt["MeanLineWidth"],
214
218
  )
219
+ # MeanLine or MedianLine only keep only one
220
+ if bx_opt["MeanLine"]: # MeanLine has priority
221
+ bx_opt["MedianLine"] = False
215
222
  bxp = ax.boxplot(
216
223
  data,
217
224
  positions=X_bx,
@@ -231,6 +238,9 @@ def catplot(data, *args, **kwargs):
231
238
  widths=bx_opt["x_width"],
232
239
  label=label,
233
240
  )
241
+ if not bx_opt["MedianLine"]:
242
+ for median in bxp["medians"]:
243
+ median.set_visible(False)
234
244
 
235
245
  if bx_opt["BoxLineWidth"] < 0.1:
236
246
  bx_opt["EdgeColor"] = "none"
@@ -452,260 +462,277 @@ def catplot(data, *args, **kwargs):
452
462
  # custom_order = ['s', 'bx', 'e']
453
463
  # full_order = sort_catplot_layers(custom_order)
454
464
 
455
- # figsets
456
- kw_figsets = kwargs.get("figsets", None)
457
- # check the data type
458
- if isinstance(data, pd.DataFrame):
459
- df = data.copy()
460
- x = kwargs.get("x", None)
461
- y = kwargs.get("y", None)
462
- hue = kwargs.get("hue", None)
463
- data = df2array(data=data, x=x, y=y, hue=hue)
464
- xticklabels = []
465
- if hue is not None:
466
- for i in df[x].unique().tolist():
467
- for j in df[hue].unique().tolist():
468
- xticklabels.append(i + "-" + j)
469
- x_len = len(df[x].unique().tolist())
470
- hue_len = len(df[hue].unique().tolist())
471
- xticks = generate_xticks_with_gap(x_len, hue_len)
472
- default_x_width = 0.85
473
- legend_hue = df[hue].unique().tolist()
465
+ col = kwargs.get("col", None)
466
+ if not col:
467
+ # figsets
468
+ kw_figsets = kwargs.get("figsets", None)
469
+ # check the data type
470
+ if isinstance(data, pd.DataFrame):
471
+ df = data.copy()
472
+ x = kwargs.get("x", None)
473
+ y = kwargs.get("y", None)
474
+ hue = kwargs.get("hue", None)
475
+ data = df2array(data=data, x=x, y=y, hue=hue)
476
+ xticklabels = []
477
+ if hue is not None:
478
+ for i in df[x].unique().tolist():
479
+ for j in df[hue].unique().tolist():
480
+ xticklabels.append(i + "-" + j)
481
+ x_len = len(df[x].unique().tolist())
482
+ hue_len = len(df[hue].unique().tolist())
483
+ xticks = generate_xticks_with_gap(x_len, hue_len)
484
+ default_x_width = 0.85
485
+ legend_hue = df[hue].unique().tolist()
486
+ default_colors = get_color(hue_len)
487
+ else:
488
+ for i in df[x].unique().tolist():
489
+ xticklabels.append(i)
490
+ xticks = np.arange(1, len(xticklabels) + 1).tolist()
491
+ legend_hue = xticklabels
492
+ default_colors = get_color(len(xticklabels))
493
+ default_x_width = 0.5
494
+
495
+ # when the xticklabels are too long, rotate the labels a bit
496
+
497
+ xangle = 30 if max([len(i) for i in xticklabels]) > 5 else 0
498
+ if kw_figsets is not None:
499
+ kw_figsets = {
500
+ "ylabel": y,
501
+ # "xlabel": x,
502
+ "xticks": xticks,
503
+ "xticklabels": xticklabels,
504
+ "xangle": xangle,
505
+ **kw_figsets,
506
+ }
507
+ else:
508
+ kw_figsets = {
509
+ "ylabel": y,
510
+ # "xlabel": x,
511
+ "xticks": xticks,
512
+ "xticklabels": xticklabels,
513
+ "xangle": xangle,
514
+ }
474
515
  else:
475
- for i in df[x].unique().tolist():
476
- xticklabels.append(i)
477
- xticks = np.arange(1, len(xticklabels) + 1)
478
- legend_hue = xticklabels
516
+ xticks = np.arange(1, data.shape[1] + 1).tolist()
479
517
  default_x_width = 0.5
480
- # when the xticklabels are too long, rotate the labels a bit
481
-
482
- xangle = 30 if max([len(i) for i in xticklabels]) > 5 else 0
483
- if kw_figsets is not None:
484
- kw_figsets = {
485
- "ylabel": y,
486
- "xlabel": x,
487
- "xticks": xticks,
488
- "xticklabels": xticklabels,
489
- "xangle": xangle,
490
- **kw_figsets,
491
- }
518
+ default_colors = get_color(len(xticks))
519
+ legend_hue = None
520
+ xangle = 0
521
+
522
+ # full_order
523
+ opt = kwargs.get("opt", {})
524
+ ax = kwargs.get("ax", None)
525
+ if "ax" not in locals() or ax is None:
526
+ ax = plt.gca()
527
+ opt.setdefault("c", default_colors)
528
+ # if len(opt["c"]) < data.shape[1]:
529
+ # additional_colors = plt.cm.winter(
530
+ # np.linspace(0, 1, data.shape[1] - len(opt["c"]))
531
+ # )
532
+ # opt["c"] = np.vstack([opt["c"], additional_colors[:, :3]])
533
+
534
+ opt.setdefault("loc", {})
535
+ opt["loc"].setdefault("go", 0)
536
+ opt["loc"].setdefault("xloc", xticks)
537
+
538
+ # export setting
539
+ opt.setdefault("export", {})
540
+ opt["export"].setdefault("path", None)
541
+ print(opt["export"])
542
+
543
+ # opt.setdefault('layer', {})
544
+ opt.setdefault("layer", ["b", "bx", "e", "v", "s", "l"])
545
+
546
+ opt.setdefault("b", {})
547
+ opt["b"].setdefault("go", 1)
548
+ opt["b"].setdefault("loc", "c")
549
+ opt["b"].setdefault("FaceColor", opt["c"])
550
+ opt["b"].setdefault("FaceAlpha", 1)
551
+ opt["b"].setdefault("EdgeColor", "k")
552
+ opt["b"].setdefault("EdgeAlpha", 1)
553
+ opt["b"].setdefault("LineStyle", "-")
554
+ opt["b"].setdefault("LineWidth", 0.8)
555
+ opt["b"].setdefault("x_width", default_x_width)
556
+ opt["b"].setdefault("ShowBaseLine", "off")
557
+ opt["b"].setdefault("hatch", None)
558
+
559
+ opt.setdefault("e", {})
560
+ opt["e"].setdefault("go", 1)
561
+ opt["e"].setdefault("loc", "l")
562
+ opt["e"].setdefault("LineWidth", 1)
563
+ opt["e"].setdefault("CapLineWidth", 1)
564
+ opt["e"].setdefault("CapSize", 2)
565
+ opt["e"].setdefault("Marker", "none")
566
+ opt["e"].setdefault("LineStyle", "none")
567
+ opt["e"].setdefault("LineColor", "k")
568
+ opt["e"].setdefault("LineJoin", "round")
569
+ opt["e"].setdefault("MarkerSize", "auto")
570
+ opt["e"].setdefault("FaceColor", opt["c"])
571
+ opt["e"].setdefault("MarkerEdgeColor", "none")
572
+ opt["e"].setdefault("Visible", True)
573
+ opt["e"].setdefault("Orientation", "vertical")
574
+ opt["e"].setdefault("error", "sem")
575
+ opt["e"].setdefault("x_width", opt["b"]["x_width"] / 5)
576
+ opt["e"].setdefault("cap_dir", "b")
577
+
578
+ opt.setdefault("s", {})
579
+ opt["s"].setdefault("go", 1)
580
+ opt["s"].setdefault("loc", "r")
581
+ opt["s"].setdefault("FaceColor", "w")
582
+ opt["s"].setdefault("cmap", None)
583
+ opt["s"].setdefault("FaceAlpha", 1)
584
+ opt["s"].setdefault("x_width", opt["b"]["x_width"] / 5)
585
+ opt["s"].setdefault("Marker", "o")
586
+ opt["s"].setdefault("MarkerSize", 15)
587
+ opt["s"].setdefault("LineWidth", 0.8)
588
+ opt["s"].setdefault("MarkerEdgeColor", "k")
589
+
590
+ opt.setdefault("l", {})
591
+ opt["l"].setdefault("go", 1)
592
+ opt["l"].setdefault("LineStyle", "-")
593
+ opt["l"].setdefault("LineColor", "k")
594
+ opt["l"].setdefault("LineWidth", 0.5)
595
+ opt["l"].setdefault("LineAlpha", 0.5)
596
+
597
+ opt.setdefault("bx", {})
598
+ opt["bx"].setdefault("go", 0)
599
+ opt["bx"].setdefault("loc", "r")
600
+ opt["bx"].setdefault("FaceColor", opt["c"])
601
+ opt["bx"].setdefault("EdgeColor", "k")
602
+ opt["bx"].setdefault("FaceAlpha", 0.85)
603
+ opt["bx"].setdefault("EdgeAlpha", 1)
604
+ opt["bx"].setdefault("LineStyle", "-")
605
+ opt["bx"].setdefault("x_width", 0.2)
606
+ opt["bx"].setdefault("ShowBaseLine", "off")
607
+ opt["bx"].setdefault("Notch", False)
608
+ opt["bx"].setdefault("Outliers", "on")
609
+ opt["bx"].setdefault("OutlierMarker", "+")
610
+ opt["bx"].setdefault("OutlierColor", "r")
611
+ opt["bx"].setdefault("OutlierSize", 6)
612
+ # opt['bx'].setdefault('PlotStyle', 'traditional')
613
+ # opt['bx'].setdefault('FactorDirection', 'auto')
614
+ opt["bx"].setdefault("Whisker", 0.5)
615
+ opt["bx"].setdefault("Orientation", "vertical")
616
+ opt["bx"].setdefault("BoxLineWidth", 0.5)
617
+ opt["bx"].setdefault("FaceColor", "k")
618
+ opt["bx"].setdefault("WhiskerLineStyle", "-")
619
+ opt["bx"].setdefault("WhiskerLineColor", "k")
620
+ opt["bx"].setdefault("WhiskerLineWidth", 0.5)
621
+ opt["bx"].setdefault("Caps", True)
622
+ opt["bx"].setdefault("CapLineColor", "k")
623
+ opt["bx"].setdefault("CapLineWidth", 0.5)
624
+ opt["bx"].setdefault("CapSize", 0.2)
625
+ opt["bx"].setdefault("MedianLine", True)
626
+ opt["bx"].setdefault("MedianLineStyle", "-")
627
+ opt["bx"].setdefault("MedianStyle", "line")
628
+ opt["bx"].setdefault("MedianLineColor", "k")
629
+ opt["bx"].setdefault("MedianLineWidth", 2)
630
+ opt["bx"].setdefault("MedianLineTop", False)
631
+ opt["bx"].setdefault("MeanLine", False)
632
+ opt["bx"].setdefault("showmeans", opt["bx"]["MeanLine"])
633
+ opt["bx"].setdefault("MeanLineStyle", "-")
634
+ opt["bx"].setdefault("MeanLineColor", "w")
635
+ opt["bx"].setdefault("MeanLineWidth", 2)
636
+
637
+ # Violin plot options
638
+ opt.setdefault("v", {})
639
+ opt["v"].setdefault("go", 0)
640
+ opt["v"].setdefault("x_width", 0.3)
641
+ opt["v"].setdefault("loc", "r")
642
+ opt["v"].setdefault("EdgeColor", "none")
643
+ opt["v"].setdefault("FaceColor", opt["c"])
644
+ opt["v"].setdefault("FaceAlpha", 0.3)
645
+ opt["v"].setdefault("BandWidth", "scott")
646
+ opt["v"].setdefault("Function", "pdf")
647
+ opt["v"].setdefault("Kernel", "gau")
648
+ opt["v"].setdefault("NumPoints", 500)
649
+ opt["v"].setdefault("BoundaryCorrection", "reflection")
650
+
651
+ data_m = np.nanmean(data, axis=0)
652
+ nr, nc = data.shape
653
+
654
+ for key in kwargs.keys():
655
+ if key in opt:
656
+ if isinstance(kwargs[key], dict):
657
+ opt[key].update(kwargs[key])
658
+ else:
659
+ opt[key] = kwargs[key]
660
+ if isinstance(opt["loc"]["xloc"], list):
661
+ xloc = np.array(opt["loc"]["xloc"])
492
662
  else:
493
- kw_figsets = {
494
- "ylabel": y,
495
- "xlabel": x,
496
- "xticks": xticks,
497
- "xticklabels": xticklabels,
498
- "xangle": xangle,
499
- }
500
- else:
501
- xticks = np.arange(1, data.shape[1] + 1)
502
- default_x_width = 0.5
503
- xangle = 0
504
-
505
- # full_order
506
- opt = kwargs.get("opt", {})
507
- ax = kwargs.get("ax", None)
508
- if "ax" not in locals() or ax is None:
509
- ax = plt.gca()
663
+ xloc = opt["loc"]["xloc"]
664
+ layers = sort_catplot_layers(opt["layer"])
665
+
666
+ label_which = kwargs.get("label_which", "barplot")
667
+ if "b" in label_which:
668
+ legend_which = "b"
669
+ elif "s" in label_which:
670
+ legend_which = "s"
671
+ elif "bx" in label_which:
672
+ legend_which = "bx"
673
+ elif "e" in label_which:
674
+ legend_which = "e"
675
+ elif "v" in label_which:
676
+ legend_which = "v"
677
+ else:
678
+ legend_which = None
510
679
 
511
- default_colors = (
512
- np.array(
513
- [
514
- [0, 0, 0],
515
- [234, 37, 46],
516
- [0, 154, 222],
517
- [175, 89, 186],
518
- [255, 198, 37],
519
- [242, 133, 34],
520
- ]
521
- )
522
- / 255.0
523
- )
680
+ for layer in layers:
681
+ if layer == "b" and opt["b"]["go"]:
682
+ if legend_which == "b":
683
+ plot_bars(data, data_m, opt["b"], xloc, ax, label=legend_hue)
684
+ else:
685
+ plot_bars(data, data_m, opt["b"], xloc, ax, label=None)
686
+ elif layer == "e" and opt["e"]["go"]:
687
+ if legend_which == "e":
688
+ plot_errors(data, data_m, opt["e"], xloc, ax, label=legend_hue)
689
+ else:
690
+ plot_errors(data, data_m, opt["e"], xloc, ax, label=None)
691
+ elif layer == "s" and opt["s"]["go"]:
692
+ if legend_which == "s":
693
+ plot_scatter(data, opt["s"], xloc, ax, label=legend_hue)
694
+ else:
695
+ plot_scatter(data, opt["s"], xloc, ax, label=None)
696
+ elif layer == "bx" and opt["bx"]["go"]:
697
+ if legend_which == "bx":
698
+ plot_boxplot(data, opt["bx"], xloc, ax, label=legend_hue)
699
+ else:
700
+ plot_boxplot(data, opt["bx"], xloc, ax, label=None)
701
+ elif layer == "v" and opt["v"]["go"]:
702
+ if legend_which == "v":
703
+ plot_violin(data, opt["v"], xloc, ax, label=legend_hue)
704
+ else:
705
+ plot_violin(data, opt["v"], xloc, ax, label=None)
706
+ elif all([layer == "l", opt["l"]["go"], opt["s"]["go"]]):
707
+ plot_lines(data, opt["l"], opt["s"], ax)
524
708
 
525
- opt.setdefault("c", default_colors)
526
- if len(opt["c"]) < data.shape[1]:
527
- additional_colors = plt.cm.winter(
528
- np.linspace(0, 1, data.shape[1] - len(opt["c"]))
529
- )
530
- opt["c"] = np.vstack([opt["c"], additional_colors[:, :3]])
531
-
532
- opt.setdefault("loc", {})
533
- opt["loc"].setdefault("go", 0)
534
- opt["loc"].setdefault("xloc", xticks)
535
-
536
- # export setting
537
- opt.setdefault("export", {})
538
- opt["export"].setdefault("path", None)
539
- print(opt["export"])
540
-
541
- # opt.setdefault('layer', {})
542
- opt.setdefault("layer", ["b", "bx", "e", "v", "s", "l"])
543
-
544
- opt.setdefault("b", {})
545
- opt["b"].setdefault("go", 1)
546
- opt["b"].setdefault("loc", "c")
547
- opt["b"].setdefault("FaceColor", opt["c"])
548
- opt["b"].setdefault("FaceAlpha", 0.65)
549
- opt["b"].setdefault("EdgeColor", "k")
550
- opt["b"].setdefault("EdgeAlpha", 1)
551
- opt["b"].setdefault("LineStyle", "-")
552
- opt["b"].setdefault("LineWidth", 0.8)
553
- opt["b"].setdefault("x_width", default_x_width)
554
- opt["b"].setdefault("ShowBaseLine", "off")
555
- opt["b"].setdefault("hatch", None)
556
-
557
- opt.setdefault("e", {})
558
- opt["e"].setdefault("go", 1)
559
- opt["e"].setdefault("loc", "l")
560
- opt["e"].setdefault("LineWidth", 1)
561
- opt["e"].setdefault("CapLineWidth", 1)
562
- opt["e"].setdefault("CapSize", 2)
563
- opt["e"].setdefault("Marker", "none")
564
- opt["e"].setdefault("LineStyle", "none")
565
- opt["e"].setdefault("LineColor", "k")
566
- opt["e"].setdefault("LineJoin", "round")
567
- opt["e"].setdefault("MarkerSize", "auto")
568
- opt["e"].setdefault("FaceColor", opt["c"])
569
- opt["e"].setdefault("MarkerEdgeColor", "none")
570
- opt["e"].setdefault("Visible", True)
571
- opt["e"].setdefault("Orientation", "vertical")
572
- opt["e"].setdefault("error", "sem")
573
- opt["e"].setdefault("x_width", opt["b"]["x_width"] / 5)
574
- opt["e"].setdefault("cap_dir", "b")
575
-
576
- opt.setdefault("s", {})
577
- opt["s"].setdefault("go", 1)
578
- opt["s"].setdefault("loc", "r")
579
- opt["s"].setdefault("FaceColor", opt["c"])
580
- opt["s"].setdefault("cmap", None)
581
- opt["s"].setdefault("FaceAlpha", 1)
582
- opt["s"].setdefault("x_width", opt["b"]["x_width"] / 5)
583
- opt["s"].setdefault("Marker", "o")
584
- opt["s"].setdefault("MarkerSize", 10)
585
- opt["s"].setdefault("LineWidth", 0.5)
586
- opt["s"].setdefault("MarkerEdgeColor", "k")
587
-
588
- opt.setdefault("l", {})
589
- opt["l"].setdefault("go", 1)
590
- opt["l"].setdefault("LineStyle", "-")
591
- opt["l"].setdefault("LineColor", "k")
592
- opt["l"].setdefault("LineWidth", 0.5)
593
- opt["l"].setdefault("LineAlpha", 0.5)
594
-
595
- opt.setdefault("bx", {})
596
- opt["bx"].setdefault("go", 0)
597
- opt["bx"].setdefault("loc", "r")
598
- opt["bx"].setdefault("FaceColor", opt["c"])
599
- opt["bx"].setdefault("EdgeColor", "k")
600
- opt["bx"].setdefault("FaceAlpha", 0.7)
601
- opt["bx"].setdefault("EdgeAlpha", 1)
602
- opt["bx"].setdefault("LineStyle", "-")
603
- opt["bx"].setdefault("x_width", 0.2)
604
- opt["bx"].setdefault("ShowBaseLine", "off")
605
- opt["bx"].setdefault("Notch", False)
606
- opt["bx"].setdefault("Outliers", "on")
607
- opt["bx"].setdefault("OutlierMarker", "+")
608
- opt["bx"].setdefault("OutlierColor", "r")
609
- opt["bx"].setdefault("OutlierSize", 6)
610
- # opt['bx'].setdefault('PlotStyle', 'traditional')
611
- # opt['bx'].setdefault('FactorDirection', 'auto')
612
- opt["bx"].setdefault("Whisker", 0.5)
613
- opt["bx"].setdefault("Orientation", "vertical")
614
- opt["bx"].setdefault("BoxLineWidth", 0.5)
615
- opt["bx"].setdefault("FaceColor", "k")
616
- opt["bx"].setdefault("WhiskerLineStyle", "-")
617
- opt["bx"].setdefault("WhiskerLineColor", "k")
618
- opt["bx"].setdefault("WhiskerLineWidth", 0.5)
619
- opt["bx"].setdefault("Caps", True)
620
- opt["bx"].setdefault("CapLineColor", "k")
621
- opt["bx"].setdefault("CapLineWidth", 0.5)
622
- opt["bx"].setdefault("CapSize", 0.2)
623
- opt["bx"].setdefault("MedianLineStyle", "-")
624
- opt["bx"].setdefault("MedianStyle", "line")
625
- opt["bx"].setdefault("MedianLineColor", "k")
626
- opt["bx"].setdefault("MedianLineWidth", 2)
627
- opt["bx"].setdefault("MedianLineTop", False)
628
- opt["bx"].setdefault("MeanLine", False)
629
- opt["bx"].setdefault("showmeans", opt["bx"]["MeanLine"])
630
- opt["bx"].setdefault("MeanLineStyle", "-")
631
- opt["bx"].setdefault("MeanLineColor", "w")
632
- opt["bx"].setdefault("MeanLineWidth", 2)
633
-
634
- # Violin plot options
635
- opt.setdefault("v", {})
636
- opt["v"].setdefault("go", 0)
637
- opt["v"].setdefault("x_width", 0.3)
638
- opt["v"].setdefault("loc", "r")
639
- opt["v"].setdefault("EdgeColor", "none")
640
- opt["v"].setdefault("FaceColor", opt["c"])
641
- opt["v"].setdefault("FaceAlpha", 0.3)
642
- opt["v"].setdefault("BandWidth", "scott")
643
- opt["v"].setdefault("Function", "pdf")
644
- opt["v"].setdefault("Kernel", "gau")
645
- opt["v"].setdefault("NumPoints", 500)
646
- opt["v"].setdefault("BoundaryCorrection", "reflection")
647
-
648
- data_m = np.nanmean(data, axis=0)
649
- nr, nc = data.shape
650
-
651
- for key in kwargs.keys():
652
- if key in opt:
653
- if isinstance(kwargs[key], dict):
654
- opt[key].update(kwargs[key])
655
- else:
656
- opt[key] = kwargs[key]
657
- if isinstance(opt["loc"]["xloc"], list):
658
- xloc = np.array(opt["loc"]["xloc"])
659
- else:
660
- xloc = opt["loc"]["xloc"]
661
- layers = sort_catplot_layers(opt["layer"])
662
-
663
- label_which = kwargs.get("label_which", "barplot")
664
- if "b" in label_which:
665
- legend_which = "b"
666
- elif "s" in label_which:
667
- legend_which = "s"
668
- elif "bx" in label_which:
669
- legend_which = "bx"
670
- elif "e" in label_which:
671
- legend_which = "e"
672
- elif "v" in label_which:
673
- legend_which = "v"
709
+ if kw_figsets is not None:
710
+ figsets(ax=ax, **kw_figsets)
711
+ show_legend = kwargs.get("show_legend", True)
712
+ if show_legend:
713
+ ax.legend()
714
+ export_style = kwargs.get("export_style", None)
715
+ if export_style:
716
+ fsave(export_style, opt)
717
+ return ax, opt
674
718
  else:
675
- legend_which = None
676
-
677
- for layer in layers:
678
- if layer == "b" and opt["b"]["go"]:
679
- if legend_which == "b":
680
- plot_bars(data, data_m, opt["b"], xloc, ax, label=legend_hue)
681
- else:
682
- plot_bars(data, data_m, opt["b"], xloc, ax, label=None)
683
- elif layer == "e" and opt["e"]["go"]:
684
- if legend_which == "e":
685
- plot_errors(data, data_m, opt["e"], xloc, ax, label=legend_hue)
686
- else:
687
- plot_errors(data, data_m, opt["e"], xloc, ax, label=None)
688
- elif layer == "s" and opt["s"]["go"]:
689
- if legend_which == "s":
690
- plot_scatter(data, opt["s"], xloc, ax, label=legend_hue)
691
- else:
692
- plot_scatter(data, opt["s"], xloc, ax, label=None)
693
- elif layer == "bx" and opt["bx"]["go"]:
694
- if legend_which == "bx":
695
- plot_boxplot(data, opt["bx"], xloc, ax, label=legend_hue)
696
- else:
697
- plot_boxplot(data, opt["bx"], xloc, ax, label=None)
698
- elif layer == "v" and opt["v"]["go"]:
699
- if legend_which == "v":
700
- plot_violin(data, opt["v"], xloc, ax, label=legend_hue)
701
- else:
702
- plot_violin(data, opt["v"], xloc, ax, label=None)
703
- elif all([layer == "l", opt["l"]["go"], opt["s"]["go"]]):
704
- plot_lines(data, opt["l"], opt["s"], ax)
705
-
706
- if kw_figsets is not None:
707
- figsets(ax=ax, **kw_figsets)
708
- return ax
719
+ col_names = data[col].unique().tolist()
720
+ nrow, ncol = kwargs.get("subplots", [len(col_names), 1])
721
+ figsize = kwargs.get("figsize", [3 * ncol, 3 * nrow])
722
+ fig, axs = plt.subplots(nrow, ncol, figsize=figsize, squeeze=False)
723
+ axs = axs.flatten()
724
+ key2rm = ["data", "ax", "col", "subplots"]
725
+ for k2rm in key2rm:
726
+ if k2rm in kwargs:
727
+ del kwargs[k2rm]
728
+ for i, ax in enumerate(axs):
729
+ # ax = axs[i][0] if len(col_names) > 1 else axs[0]
730
+ if i < len(col_names):
731
+ df_sub = data.loc[data[col] == col_names[i]]
732
+ catplot(ax=ax, data=df_sub, **kwargs)
733
+ ax.set_title(col_names[i])
734
+ print(f"Axis layout shape: {axs.shape}")
735
+ return axs
709
736
 
710
737
 
711
738
  def get_cmap():
@@ -1356,14 +1383,16 @@ def stdshade(ax=None, *args, **kwargs):
1356
1383
  yMean = np.nanmean(y, axis=0)
1357
1384
  if paraStdSem == "sem":
1358
1385
  if smth > 1:
1359
- wings = savgol_filter(np.nanstd(y, axis=0) / np.sqrt(y.shape[0]), smth, 1)
1386
+ wings = savgol_filter(
1387
+ np.nanstd(y, axis=0, ddof=1) / np.sqrt(y.shape[0]), smth, 1
1388
+ )
1360
1389
  else:
1361
- wings = np.nanstd(y, axis=0) / np.sqrt(y.shape[0])
1390
+ wings = np.nanstd(y, axis=0, ddof=1) / np.sqrt(y.shape[0])
1362
1391
  elif paraStdSem == "std":
1363
1392
  if smth > 1:
1364
- wings = savgol_filter(np.nanstd(y, axis=0), smth, 1)
1393
+ wings = savgol_filter(np.nanstd(y, axis=0, ddof=1), smth, 1)
1365
1394
  else:
1366
- wings = np.nanstd(y, axis=0)
1395
+ wings = np.nanstd(y, axis=0, ddof=1)
1367
1396
 
1368
1397
  # fill_kws = kwargs.get('fill_kws', {})
1369
1398
  # line_kws = kwargs.get('line_kws', {})
@@ -1668,6 +1697,6 @@ def generate_xticks_with_gap(x_len, hue_len):
1668
1697
  for i in range(max(x_len, hue_len), 0, -1) # i iterates from 3 to 1
1669
1698
  ]
1670
1699
  concatenated_array = np.concatenate(arrays)
1671
- positive_array = concatenated_array[concatenated_array > 0]
1700
+ positive_array = concatenated_array[concatenated_array > 0].tolist()
1672
1701
 
1673
1702
  return positive_array
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: py2ls
3
- Version: 0.1.8.8
3
+ Version: 0.1.9.0
4
4
  Summary: py(thon)2(too)ls
5
5
  Author: Jianfeng
6
6
  Author-email: Jianfeng.Liu0413@gmail.com
@@ -134,14 +134,14 @@ py2ls/db2ls.py,sha256=MMfFX47aIPIyu7fU9aPvX9lbPRPYOpJ_VXwlnWk-8qo,13615
134
134
  py2ls/doc.py,sha256=xN3g1OWfoaGUhikbJ0NqbN5eKy1VZVvWwRlhHMgyVEc,4243
135
135
  py2ls/export_requirements.py,sha256=x2WgUF0jYKz9GfA1MVKN-MdsM-oQ8yUeC6Ua8oCymio,2325
136
136
  py2ls/freqanalysis.py,sha256=F4218VSPbgL5tnngh6xNCYuNnfR-F_QjECUUxrPYZss,32594
137
- py2ls/ips.py,sha256=6eNvNwaCDj2jyjter7VPL9oEGB2jS4ge9mSgiIrvZfo,100788
137
+ py2ls/ips.py,sha256=N7MdOCgJXDQu73YkJQTtDN3RSntzXX7V0MOJ1NYBLEk,100572
138
138
  py2ls/netfinder.py,sha256=OMStrwMAASf1ajlyEfseoaEygo7G5WKBAFRE0LY15Lw,49477
139
- py2ls/plot.py,sha256=E6cV26ixVa8HFYTsTvaEtc-CgLYvaA7OhPg6S0eBZ2M,62740
139
+ py2ls/plot.py,sha256=1hwNRxvI-oHwyvs6coupyl_xR6c3aLeIcgSnenl-i4Y,65406
140
140
  py2ls/setuptools-70.1.0-py3-none-any.whl,sha256=2bi3cUVal8ip86s0SOvgspteEF8SKLukECi-EWmFomc,882588
141
141
  py2ls/sleep_events_detectors.py,sha256=bQA3HJqv5qnYKJJEIhCyhlDtkXQfIzqksnD0YRXso68,52145
142
142
  py2ls/stats.py,sha256=Wd9yCKQ_61QD29WMEgMuEcreFxF91NmlPW65iWT2B5w,39041
143
143
  py2ls/translator.py,sha256=bc5FB-wqC4TtQz9gyCP1mE38HqNRJ_pmuRIgKnAlMzM,30581
144
144
  py2ls/wb_detector.py,sha256=7y6TmBUj9exCZeIgBAJ_9hwuhkDh1x_-yg4dvNY1_GQ,6284
145
- py2ls-0.1.8.8.dist-info/METADATA,sha256=tnUzLUWK94WS_DVJ1Jxcn_fRFrQRktuceHW0WMRfS5g,20017
146
- py2ls-0.1.8.8.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
147
- py2ls-0.1.8.8.dist-info/RECORD,,
145
+ py2ls-0.1.9.0.dist-info/METADATA,sha256=vmri4oGNRRS-eJxRHjWOd2pOd2xq3iyOUkgX9LJsVTA,20017
146
+ py2ls-0.1.9.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
147
+ py2ls-0.1.9.0.dist-info/RECORD,,