|
354 | 354 | "source": [ |
355 | 355 | "### Multi-Trace Figures\n", |
356 | 356 | "\n", |
357 | | - "When both base and secondary figures already split into multiple traces (e.g. a categorical xarray dimension), `add_secondary_y` keeps each side's traces visible in the legend. If the two figures share `legendgroup` names — common when they share a categorical dimension — those legendgroups are namespaced with each figure's y-axis title so every trace gets its own legend entry." |
| 357 | + "When both base and secondary figures already split into multiple traces (e.g. via a categorical xarray dimension), `add_secondary_y` keeps every trace visible in the legend. By default (`legend=\"suffix\"`), traces with the same name across the two figures are disambiguated by appending each figure's y-axis title — `\"Brazil (Population)\"` vs `\"Brazil (GDP per Capita)\"` — so each trace is its own legend entry and toggles independently." |
358 | 358 | ] |
359 | 359 | }, |
360 | 360 | { |
|
382 | 382 | "cell_type": "markdown", |
383 | 383 | "id": "23", |
384 | 384 | "metadata": {}, |
| 385 | + "source": [ |
| 386 | + "#### Choosing how the legend treats same-named traces\n", |
| 387 | + "\n", |
| 388 | + "`add_secondary_y` accepts a `legend=` argument controlling how same-named\n", |
| 389 | + "traces from the two figures are presented:\n", |
| 390 | + "\n", |
| 391 | + "- `\"suffix\"` (default): each trace gets its own entry with the source y-axis title appended.\n", |
| 392 | + "- `\"merge\"`: same-named traces share a `legendgroup`, collapsing to a single entry that toggles both axes together.\n", |
| 393 | + "- `\"separate\"`: PX entries are left as-is; duplicate names are accepted and each trace toggles alone." |
| 394 | + ] |
| 395 | + }, |
| 396 | + { |
| 397 | + "cell_type": "code", |
| 398 | + "execution_count": null, |
| 399 | + "id": "24", |
| 400 | + "metadata": {}, |
| 401 | + "outputs": [], |
| 402 | + "source": [ |
| 403 | + "# legend=\"merge\": clicking \"United States\" in the legend toggles both\n", |
| 404 | + "# the Population trace (left axis) and the GDP per Capita trace (right axis).\n", |
| 405 | + "pop_fig = xpx(population).line()\n", |
| 406 | + "gdp_fig = xpx(gdp_per_capita).line()\n", |
| 407 | + "combined_merge = add_secondary_y(\n", |
| 408 | + " pop_fig, gdp_fig, secondary_y_title=\"GDP per Capita ($)\", legend=\"merge\"\n", |
| 409 | + ")\n", |
| 410 | + "combined_merge.update_layout(title='legend=\"merge\" — one entry per country, toggles both axes')\n", |
| 411 | + "combined_merge" |
| 412 | + ] |
| 413 | + }, |
| 414 | + { |
| 415 | + "cell_type": "markdown", |
| 416 | + "id": "25", |
| 417 | + "metadata": {}, |
385 | 418 | "source": [ |
386 | 419 | "### With Animation\n", |
387 | 420 | "\n", |
|
391 | 424 | { |
392 | 425 | "cell_type": "code", |
393 | 426 | "execution_count": null, |
394 | | - "id": "24", |
| 427 | + "id": "26", |
395 | 428 | "metadata": {}, |
396 | 429 | "outputs": [], |
397 | 430 | "source": [ |
|
409 | 442 | }, |
410 | 443 | { |
411 | 444 | "cell_type": "markdown", |
412 | | - "id": "25", |
| 445 | + "id": "27", |
413 | 446 | "metadata": {}, |
414 | 447 | "source": [ |
415 | 448 | "### Static Secondary on Animated Base\n", |
|
420 | 453 | { |
421 | 454 | "cell_type": "code", |
422 | 455 | "execution_count": null, |
423 | | - "id": "26", |
| 456 | + "id": "28", |
424 | 457 | "metadata": {}, |
425 | 458 | "outputs": [], |
426 | 459 | "source": [ |
|
441 | 474 | }, |
442 | 475 | { |
443 | 476 | "cell_type": "markdown", |
444 | | - "id": "27", |
| 477 | + "id": "29", |
445 | 478 | "metadata": {}, |
446 | 479 | "source": [ |
447 | 480 | "### With Facets\n", |
|
452 | 485 | { |
453 | 486 | "cell_type": "code", |
454 | 487 | "execution_count": null, |
455 | | - "id": "28", |
| 488 | + "id": "30", |
456 | 489 | "metadata": {}, |
457 | 490 | "outputs": [], |
458 | 491 | "source": [ |
|
470 | 503 | }, |
471 | 504 | { |
472 | 505 | "cell_type": "markdown", |
473 | | - "id": "29", |
| 506 | + "id": "31", |
474 | 507 | "metadata": {}, |
475 | 508 | "source": [ |
476 | 509 | "### Multi-Trace + Facets\n", |
|
482 | 515 | { |
483 | 516 | "cell_type": "code", |
484 | 517 | "execution_count": null, |
485 | | - "id": "30", |
| 518 | + "id": "32", |
486 | 519 | "metadata": {}, |
487 | 520 | "outputs": [], |
488 | 521 | "source": [ |
|
519 | 552 | }, |
520 | 553 | { |
521 | 554 | "cell_type": "markdown", |
522 | | - "id": "31", |
| 555 | + "id": "33", |
523 | 556 | "metadata": {}, |
524 | 557 | "source": [ |
525 | 558 | "### Composing `overlay` with `add_secondary_y`\n", |
|
530 | 563 | { |
531 | 564 | "cell_type": "code", |
532 | 565 | "execution_count": null, |
533 | | - "id": "32", |
| 566 | + "id": "34", |
534 | 567 | "metadata": {}, |
535 | 568 | "outputs": [], |
536 | 569 | "source": [ |
|
558 | 591 | }, |
559 | 592 | { |
560 | 593 | "cell_type": "markdown", |
561 | | - "id": "33", |
| 594 | + "id": "35", |
562 | 595 | "metadata": {}, |
563 | 596 | "source": [ |
564 | 597 | "## subplots\n", |
|
569 | 602 | }, |
570 | 603 | { |
571 | 604 | "cell_type": "markdown", |
572 | | - "id": "34", |
| 605 | + "id": "36", |
573 | 606 | "metadata": {}, |
574 | 607 | "source": [ |
575 | 608 | "### Different Variables Side by Side" |
|
578 | 611 | { |
579 | 612 | "cell_type": "code", |
580 | 613 | "execution_count": null, |
581 | | - "id": "35", |
| 614 | + "id": "37", |
582 | 615 | "metadata": {}, |
583 | 616 | "outputs": [], |
584 | 617 | "source": [ |
|
598 | 631 | }, |
599 | 632 | { |
600 | 633 | "cell_type": "markdown", |
601 | | - "id": "36", |
| 634 | + "id": "38", |
602 | 635 | "metadata": {}, |
603 | 636 | "source": [ |
604 | 637 | "### 2x2 Grid\n", |
|
609 | 642 | { |
610 | 643 | "cell_type": "code", |
611 | 644 | "execution_count": null, |
612 | | - "id": "37", |
| 645 | + "id": "39", |
613 | 646 | "metadata": {}, |
614 | 647 | "outputs": [], |
615 | 648 | "source": [ |
|
626 | 659 | }, |
627 | 660 | { |
628 | 661 | "cell_type": "markdown", |
629 | | - "id": "38", |
| 662 | + "id": "40", |
630 | 663 | "metadata": {}, |
631 | 664 | "source": [ |
632 | 665 | "### Mixed Chart Types\n", |
|
638 | 671 | { |
639 | 672 | "cell_type": "code", |
640 | 673 | "execution_count": null, |
641 | | - "id": "39", |
| 674 | + "id": "41", |
642 | 675 | "metadata": {}, |
643 | 676 | "outputs": [], |
644 | 677 | "source": [ |
|
654 | 687 | }, |
655 | 688 | { |
656 | 689 | "cell_type": "markdown", |
657 | | - "id": "40", |
| 690 | + "id": "42", |
658 | 691 | "metadata": {}, |
659 | 692 | "source": [ |
660 | 693 | "### With Facets\n", |
|
665 | 698 | { |
666 | 699 | "cell_type": "code", |
667 | 700 | "execution_count": null, |
668 | | - "id": "41", |
| 701 | + "id": "43", |
669 | 702 | "metadata": {}, |
670 | 703 | "outputs": [], |
671 | 704 | "source": [ |
|
680 | 713 | }, |
681 | 714 | { |
682 | 715 | "cell_type": "markdown", |
683 | | - "id": "42", |
| 716 | + "id": "44", |
684 | 717 | "metadata": {}, |
685 | 718 | "source": [ |
686 | 719 | "---\n", |
|
692 | 725 | }, |
693 | 726 | { |
694 | 727 | "cell_type": "markdown", |
695 | | - "id": "43", |
| 728 | + "id": "45", |
696 | 729 | "metadata": {}, |
697 | 730 | "source": [ |
698 | 731 | "### overlay: Mismatched Facet Structure\n", |
|
703 | 736 | { |
704 | 737 | "cell_type": "code", |
705 | 738 | "execution_count": null, |
706 | | - "id": "44", |
| 739 | + "id": "46", |
707 | 740 | "metadata": {}, |
708 | 741 | "outputs": [], |
709 | 742 | "source": [ |
|
721 | 754 | }, |
722 | 755 | { |
723 | 756 | "cell_type": "markdown", |
724 | | - "id": "45", |
| 757 | + "id": "47", |
725 | 758 | "metadata": {}, |
726 | 759 | "source": [ |
727 | 760 | "### overlay: Animated Overlay on Static Base\n", |
|
732 | 765 | { |
733 | 766 | "cell_type": "code", |
734 | 767 | "execution_count": null, |
735 | | - "id": "46", |
| 768 | + "id": "48", |
736 | 769 | "metadata": {}, |
737 | 770 | "outputs": [], |
738 | 771 | "source": [ |
|
750 | 783 | }, |
751 | 784 | { |
752 | 785 | "cell_type": "markdown", |
753 | | - "id": "47", |
| 786 | + "id": "49", |
754 | 787 | "metadata": {}, |
755 | 788 | "source": [ |
756 | 789 | "### overlay: Mismatched Animation Frames\n", |
|
761 | 794 | { |
762 | 795 | "cell_type": "code", |
763 | 796 | "execution_count": null, |
764 | | - "id": "48", |
| 797 | + "id": "50", |
765 | 798 | "metadata": {}, |
766 | 799 | "outputs": [], |
767 | 800 | "source": [ |
|
777 | 810 | }, |
778 | 811 | { |
779 | 812 | "cell_type": "markdown", |
780 | | - "id": "49", |
| 813 | + "id": "51", |
781 | 814 | "metadata": {}, |
782 | 815 | "source": [ |
783 | 816 | "### add_secondary_y: Mismatched Facet Structure\n", |
|
788 | 821 | { |
789 | 822 | "cell_type": "code", |
790 | 823 | "execution_count": null, |
791 | | - "id": "50", |
| 824 | + "id": "52", |
792 | 825 | "metadata": {}, |
793 | 826 | "outputs": [], |
794 | 827 | "source": [ |
|
806 | 839 | }, |
807 | 840 | { |
808 | 841 | "cell_type": "markdown", |
809 | | - "id": "51", |
| 842 | + "id": "53", |
810 | 843 | "metadata": {}, |
811 | 844 | "source": [ |
812 | 845 | "### add_secondary_y: Animated Secondary on Static Base\n", |
|
817 | 850 | { |
818 | 851 | "cell_type": "code", |
819 | 852 | "execution_count": null, |
820 | | - "id": "52", |
| 853 | + "id": "54", |
821 | 854 | "metadata": {}, |
822 | 855 | "outputs": [], |
823 | 856 | "source": [ |
|
835 | 868 | }, |
836 | 869 | { |
837 | 870 | "cell_type": "markdown", |
838 | | - "id": "53", |
| 871 | + "id": "55", |
839 | 872 | "metadata": {}, |
840 | 873 | "source": [ |
841 | 874 | "### add_secondary_y: Mismatched Animation Frames" |
|
844 | 877 | { |
845 | 878 | "cell_type": "code", |
846 | 879 | "execution_count": null, |
847 | | - "id": "54", |
| 880 | + "id": "56", |
848 | 881 | "metadata": {}, |
849 | 882 | "outputs": [], |
850 | 883 | "source": [ |
|
860 | 893 | }, |
861 | 894 | { |
862 | 895 | "cell_type": "markdown", |
863 | | - "id": "55", |
| 896 | + "id": "57", |
864 | 897 | "metadata": {}, |
865 | 898 | "source": [ |
866 | 899 | "## Summary\n", |
|
0 commit comments