Dual Stack Pyramid Plots

Population pyramid plots can be generated using the fig_dual_stack_pyramid() function, which returns a Plotly Go Figure object.

Dual stack pyramid plot

The plot above was generated using a synthetic dataset of patients with subgroups indicating outcome (Death, Discharged, Censored). Click the image to view the full interactive and fully annotated Plotly Go figure.

The synthetic dataset used for this plot is given below as a table (which can easily be converted to a CSV).

Synthetic dataset of a patient population distribution by age group, sex and outcome

Age Group

Sex

Outcome

Number

0-5

Male

death

1

0-5

Male

censored

19

0-5

Female

discharged

29

0-5

Female

death

3

0-5

Female

censored

21

5-10

Male

discharged

27

5-10

Male

death

4

5-10

Male

censored

19

5-10

Female

discharged

29

5-10

Female

death

1

5-10

Female

censored

19

10-15

Male

discharged

33

10-15

Male

death

1

10-15

Male

censored

18

10-15

Female

discharged

30

10-15

Female

death

1

10-15

Female

censored

20

15-20

Male

discharged

32

15-20

Male

death

1

15-20

Male

censored

17

15-20

Female

discharged

27

15-20

Female

death

9

15-20

Female

censored

18

20-25

Male

discharged

36

20-25

Male

death

1

20-25

Male

censored

23

20-25

Female

discharged

30

20-25

Female

death

7

20-25

Female

censored

17

25-30

Male

discharged

37

25-30

Male

death

4

25-30

Male

censored

19

25-30

Female

discharged

31

25-30

Female

death

8

25-30

Female

censored

19

30-35

Male

discharged

39

30-35

Male

death

9

30-35

Male

censored

17

30-35

Female

discharged

34

30-35

Female

death

11

30-35

Female

censored

17

35-40

Male

discharged

41

35-40

Male

death

12

35-40

Male

censored

25

35-40

Female

discharged

36

35-40

Female

death

5

35-40

Female

censored

19

40-45

Male

discharged

39

40-45

Male

death

13

40-45

Male

censored

19

40-45

Female

discharged

33

40-45

Female

death

9

40-45

Female

censored

18

45-50

Male

discharged

42

45-50

Male

death

10

45-50

Male

censored

19

45-50

Female

discharged

40

45-50

Female

death

12

45-50

Female

censored

27

50-55

Male

discharged

39

50-55

Male

death

13

50-55

Male

censored

20

50-55

Female

discharged

45

50-55

Female

death

9

50-55

Female

censored

28

55-60

Male

discharged

41

55-60

Male

death

17

55-60

Male

censored

26

55-60

Female

discharged

46

55-60

Female

death

17

55-60

Female

censored

24

60-65

Male

discharged

41

60-65

Male

death

16

60-65

Male

censored

28

60-65

Female

discharged

49

60-65

Female

death

20

60-65

Female

censored

29

65-70

Male

discharged

41

65-70

Male

death

22

65-70

Male

censored

28

65-70

Female

discharged

49

65-70

Female

death

21

65-70

Female

censored

22

70-75

Male

discharged

50

70-75

Male

death

23

70-75

Male

censored

25

70-75

Female

discharged

43

70-75

Female

death

23

70-75

Female

censored

25

75-80

Male

discharged

47

75-80

Male

death

18

75-80

Male

censored

28

75-80

Female

discharged

54

75-80

Female

death

24

75-80

Female

censored

33

80-85

Male

discharged

55

80-85

Male

death

26

80-85

Male

censored

33

80-85

Female

discharged

54

80-85

Female

death

21

80-85

Female

censored

25

85-90

Male

discharged

54

85-90

Male

death

28

85-90

Male

censored

33

85-90

Female

discharged

52

85-90

Female

death

24

85-90

Female

censored

33

90-95

Male

discharged

55

90-95

Male

death

26

90-95

Male

censored

27

90-95

Female

discharged

52

90-95

Female

death

28

90-95

Female

censored

29

96-100

Male

discharged

52

96-100

Male

death

31

96-100

Male

censored

37

96-100

Female

discharged

58

96-100

Female

death

33

96-100

Female

censored

36

The fig_dual_stack_pyramid() function expects a dataframe with the following columns (in no particular order):

  • "y_axis" - the age group label

  • "side" - the sex

  • "stack_group" - the patient outcome

  • "value" - the number of patients in the category (combination of age group, sex, outcome)

  • "left_side" - a boolean to indicate where the value should appear, with 1 indicating left and 0 indicating right

The data source can be in any appropriate form, such as, typically, a CSV. Here are the Python steps required to generate the plot, where males are on the left and females are on the right, using the fig_dual_stack_pyramid() function:

import pandas as pd
from isaricanalytics.visualisation import fig_dual_stack_pyramid
# Load the CSV data from a string buffer
data = pd.read_csv(io.StringIO(
    """
    y_axis,side,stack_group,value,left_side
    0-5,Male,discharged,31,1
    0-5,Male,death,1,1
    0-5,Male,censored,19,1
    0-5,Female,discharged,29,0
    0-5,Female,death,3,0
    0-5,Female,censored,21,0
    5-10,Male,discharged,27,1
    5-10,Male,death,4,1
    5-10,Male,censored,19,1
    5-10,Female,discharged,29,0
    5-10,Female,death,1,0
    5-10,Female,censored,19,0
    10-15,Male,discharged,33,1
    10-15,Male,death,1,1
    10-15,Male,censored,18,1
    10-15,Female,discharged,30,0
    10-15,Female,death,1,0
    10-15,Female,censored,20,0
    15-20,Male,discharged,32,1
    15-20,Male,death,1,1
    15-20,Male,censored,17,1
    15-20,Female,discharged,27,0
    15-20,Female,death,9,0
    15-20,Female,censored,18,0
    20-25,Male,discharged,36,1
    20-25,Male,death,1,1
    20-25,Male,censored,23,1
    20-25,Female,discharged,30,0
    20-25,Female,death,7,0
    20-25,Female,censored,17,0
    25-30,Male,discharged,37,1
    25-30,Male,death,4,1
    25-30,Male,censored,19,1
    25-30,Female,discharged,31,0
    25-30,Female,death,8,0
    25-30,Female,censored,19,0
    30-35,Male,discharged,39,1
    30-35,Male,death,9,1
    30-35,Male,censored,17,1
    30-35,Female,discharged,34,0
    30-35,Female,death,11,0
    30-35,Female,censored,17,0
    35-40,Male,discharged,41,1
    35-40,Male,death,12,1
    35-40,Male,censored,25,1
    35-40,Female,discharged,36,0
    35-40,Female,death,5,0
    35-40,Female,censored,19,0
    40-45,Male,discharged,39,1
    40-45,Male,death,13,1
    40-45,Male,censored,19,1
    40-45,Female,discharged,33,0
    40-45,Female,death,9,0
    40-45,Female,censored,18,0
    45-50,Male,discharged,42,1
    45-50,Male,death,10,1
    45-50,Male,censored,19,1
    45-50,Female,discharged,40,0
    45-50,Female,death,12,0
    45-50,Female,censored,27,0
    50-55,Male,discharged,39,1
    50-55,Male,death,13,1
    50-55,Male,censored,20,1
    50-55,Female,discharged,45,0
    50-55,Female,death,9,0
    50-55,Female,censored,28,0
    55-60,Male,discharged,41,1
    55-60,Male,death,17,1
    55-60,Male,censored,26,1
    55-60,Female,discharged,46,0
    55-60,Female,death,17,0
    55-60,Female,censored,24,0
    60-65,Male,discharged,41,1
    60-65,Male,death,16,1
    60-65,Male,censored,28,1
    60-65,Female,discharged,49,0
    60-65,Female,death,20,0
    60-65,Female,censored,29,0
    65-70,Male,discharged,41,1
    65-70,Male,death,22,1
    65-70,Male,censored,28,1
    65-70,Female,discharged,49,0
    65-70,Female,death,21,0
    65-70,Female,censored,22,0
    70-75,Male,discharged,50,1
    70-75,Male,death,23,1
    70-75,Male,censored,25,1
    70-75,Female,discharged,43,0
    70-75,Female,death,23,0
    70-75,Female,censored,25,0
    75-80,Male,discharged,47,1
    75-80,Male,death,18,1
    75-80,Male,censored,28,1
    75-80,Female,discharged,54,0
    75-80,Female,death,24,0
    75-80,Female,censored,33,0
    80-85,Male,discharged,55,1
    80-85,Male,death,26,1
    80-85,Male,censored,33,1
    80-85,Female,discharged,54,0
    80-85,Female,death,21,0
    80-85,Female,censored,25,0
    85-90,Male,discharged,54,1
    85-90,Male,death,28,1
    85-90,Male,censored,33,1
    85-90,Female,discharged,52,0
    85-90,Female,death,24,0
    85-90,Female,censored,33,0
    90-95,Male,discharged,55,1
    90-95,Male,death,26,1
    90-95,Male,censored,27,1
    90-95,Female,discharged,52,0
    90-95,Female,death,28,0
    90-95,Female,censored,29,0
    96-100,Male,discharged,52,1
    96-100,Male,death,31,1
    96-100,Male,censored,37,1
    96-100,Female,discharged,58,0
    96-100,Female,death,33,0
    96-100,Female,censored,36,0
    """
), skipinitialspace=True)
fig = fig_dual_stack_pyramid(
   data=data,
   title="Population Pyramid Plot of Synthetic Patient Dataset",
   xlabel="Count",
   ylabel="Age Group",
   base_color_map={
       "discharged": "#00c26f",
       "death": "#df0069",
       "censored": "#fff500"
   },
   height=430
)
fig.show()

You should see the plot appearing as given above.

Note

Any dataframe or CSV column names, or dictionary field labels, in the example above that are not specific to the dataset must be as given, otherwise the function may throw an exception or return an incorrect figure.

Also, the height parameter, which is optional with a default of 430, can be used to customise the plot height. Refer to the fig_dual_stack_pyramid() function docstring for more information.