Skip to content

A novel graph-based visualization method for large and complex pedigrees

License

Notifications You must be signed in to change notification settings

changebio/GraphPed

Repository files navigation

GraphPed

A novel graph-based visualization method for large and complex pedigrees

Author: Yin Huang

Citation:

Features

  • It can deal with complex families, wrong pedigrees, and multiple groups in a family.

  • It can help to check pedigrees.

  • It can show multiple traits or status in one pedigree.

  • It can show pedigrees in jupyter notebook and output as common image format (pdf, svg, png).

Install

pip install graphped

How to use

1. In command line

!GraphPed -h
usage: GraphPed [-h] [-p PED] [-o OUTPUT] [-f FORMAT] [-a ATTRIBUTES]
                [-e ENGINE]

The arguments of graphped

options:
  -h, --help            show this help message and exit
  -p PED, --ped PED     a ped file or an extended ped file (default: None)
  -o OUTPUT, --output OUTPUT
                        output folder (default: ./)
  -f FORMAT, --format FORMAT
                        the format of the output picture (default: svg)
  -a ATTRIBUTES, --attributes ATTRIBUTES
                        the attributes of the output picture (default: None)
  -e ENGINE, --engine ENGINE
                        the engine of graphviz rendering the output picture
                        (default: dot)
    1. standard pedigrees in the ped file
GraphPed -p data/example_fam.ped -o data/cli/ -f pdf
    1. extended pedigrees in the ped file
GraphPed -p data/example_fam_ext.ped -o data/cli/ -f svg -a data/default.yaml 

2.In jupyter notebook

from graphped.plot import *
fam=readped('data/example_fam.ped')
plotped(fam)

svg

Or

show(GraphPed(fam))

svg

GraphPed function can plot all the pedigrees in the fam dataframe.

Adding self-defined attributes. the number of traits in the input file should match with the number of traits in the attribute yaml file.

attrs=load_attributes('data/default.yaml')
famext=readped('data/example_fam_ext.ped',attrs)
plotped(famext,attrs)

svg

Write to output folder with pdf format

plotped(famext,attrs,output='data/jpn',format='pdf')

Or output multiple pedigrees.

GraphPed(famext,attrs,output='data/jpn',format='pdf')

Tutorial

Setting the attribute yaml file

For one trait ped file, if the trait values are affected status, which should be coded as follows: -9 or 0 is missing,1 is unaffected, and 2 is affected. you don't need to set the attribute file. Otherwise, you need to set your attribute file by following:

The format of the attribute of yaml file

trait name:
    attribute name:
        (the pairs of tait value and attribute value)
        tait value1: attribute value1
        tait value2: attribute value2
        ...

If you have more than one traits, you need to set each trait separately in the yaml file. The following is an example.

%%writefile data/default.yaml

trait1:
    fillcolor:
        1: 'white'
        2: 'dimgrey'
        -9: 'aquamarine3'

trait2:
    style:
        True: filled,setlinewidth(4)
        False: filled
    

trait3:
    fontcolor:
        True: darkorange
        False: black
    
Overwriting data/default.yaml
attrs=load_attributes('data/default.yaml')
attrs
{'trait1': {'fillcolor': {1: 'white', 2: 'dimgrey', -9: 'aquamarine3'}},
 'trait2': {'style': {True: 'filled,setlinewidth(4)', False: 'filled'}},
 'trait3': {'fontcolor': {True: 'darkorange', False: 'black'}}}

Two example pedigrees

one is standard, one is extended with 3 traits.

Standard ped file

%%writefile data/example_fam.ped
Fam	F4	P3	F1	1	1
Fam	F3	P3	F1	2	1
Fam	F2	P3	F1	2	1
Fam	F1	P1	P2	2	2
Fam	P3	0	0	1	2
Fam	P1	0	0	1	-9
Fam	P2	0	0	2	-9
Overwriting data/example_fam.ped
fam=readped('data/example_fam.ped')
fam
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
fid iid fathid mothid sex trait
0 Fam F4 P3 F1 1 1
1 Fam F3 P3 F1 2 1
2 Fam F2 P3 F1 2 1
3 Fam F1 P1 P2 2 2
4 Fam P3 0 0 1 2
5 Fam P1 0 0 1 -9
6 Fam P2 0 0 2 -9
plotped(fam)

svg

plotped(fam)

svg

Extended ped file

%%writefile data/example_fam_ext.ped
Fam1	F4	P3	F1	1	1	True	False
Fam1	F3	P3	F1	2	1	True	True
Fam1	F2	P3	F1	2	1	True	False
Fam1	F1	P1	P2	2	2	True	False
Fam1	P3	0	0	1	2	True	False
Fam1	P1	0	0	1	-9	False	True
Fam1	P2	0	0	2	-9	False	True
Overwriting data/example_fam_ext.ped
famext=readped('data/example_fam_ext.ped',attrs)
famext
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
fid iid fathid mothid sex trait1 trait2 trait3
0 Fam1 F4 P3 F1 1 1 True False
1 Fam1 F3 P3 F1 2 1 True True
2 Fam1 F2 P3 F1 2 1 True False
3 Fam1 F1 P1 P2 2 2 True False
4 Fam1 P3 0 0 1 2 True False
5 Fam1 P1 0 0 1 -9 False True
6 Fam1 P2 0 0 2 -9 False True
plotped(famext,attrs)

svg

dots=GraphPed(fam)
show(dots)

svg

Write out plots

plotped(fam,output='data/exampleplots',format='png')

Show the plot from data/exampleplots/Fam.png

data/exampleplots/Fam.png

Real data examples

all_fam=readped('data/Fig_2_3_fam.ped')
all_fam
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
fid iid fathid mothid sex trait
0 25_2 25_2_33 25_2_49 25_2_50 2 2
1 25_2 25_2_28c1 0 0 2 1
2 25_2 25_2_25 25_2_49 25_2_50 1 2
3 25_2 25_2_28 0 0 1 2
4 25_2 25_2_29 25_2_49 25_2_50 2 2
... ... ... ... ... ... ...
401 10R_R99 10R_R99_22 10R_R99_29 10R_R99_15 1 1
402 10R_R99 10R_R99_29 0 0 1 2
403 10R_R99 10R_R99_7 0 0 2 2
404 10R_R99 10R_R99_8 0 0 1 1
405 10R_R99 10R_R99_8 10R_R99_19 10R_R99_5 2 1

406 rows × 6 columns

Fig.1 The workflow of GraphPed

show workflow

Fig.2 The pedigrees of complex families

plotped(all_fam[all_fam.fid=='25_2'])

svg

Fig.S2 The largest pedigree in ADSP

plotped(all_fam[all_fam.fid=='4_649'])

svg

Fig.3 The pedigrees with incorrect information

plotped(all_fam[all_fam.fid=='10R_R99'])

svg

Fig.4 The pedigrees with multiple phenotypes

self-defined multiple-trait yaml

%%writefile data/self_defined_mutiple_traits.yaml

ad:
    fillcolor:
        1: 'white'
        2: 'dimgrey'
        -9: 'aquamarine3'

vcf:
    style:
        True: filled,setlinewidth(4)
        False: filled
    

trim:
    fontcolor:
        True: darkorange
        False: black
    
Writing data/self_defined_mutiple_traits.yaml
attrs=load_attributes('data/self_defined_mutiple_traits.yaml')
ped=readped('data/Fig4_fam_ext.ped',attrs)
ped
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
fid iid fathid mothid sex ad vcf trim
0 10R_R99 10R_R99_10 10R_R99_2 10R_R99_1 2 1 True False
1 10R_R99 10R_R99_19 10R_R99_2 10R_R99_1 1 1 True False
2 10R_R99 10R_R99_20 10R_R99_2 10R_R99_1 1 1 False False
3 10R_R99 10R_R99_21 10R_R99_2 10R_R99_1 1 1 False False
4 10R_R99 10R_R99_17 10R_R99_29 10R_R99_15 1 1 True False
5 10R_R99 10R_R99_22 10R_R99_29 10R_R99_15 1 1 False False
6 10R_R99 10R_R99_15 10R_R99_8 10R_R99_7 2 2 True False
7 10R_R99 10R_R99_12 10R_R99_8 10R_R99_7 2 2 True False
8 10R_R99 10R_R99_1 10R_R99_8 10R_R99_7 2 2 True False
9 10R_R99 10R_R99_5 10R_R99_8 10R_R99_7 1 1 True False
10 10R_R99 10R_R99_6 10R_R99_8 10R_R99_7 2 1 True False
11 10R_R99 10R_R99_2 0 0 1 -9 False False
12 10R_R99 10R_R99_29 0 0 1 2 False False
13 10R_R99 10R_R99_7 0 0 2 2 False False
14 10R_R99 10R_R99_8 0 0 1 1 False False
plotped(ped,attrs)

svg

Show multiple figures with self-defined attributes

self-defined single-trait yaml

%%writefile data/self_defined_single_trait.yaml

ad:
    fillcolor:
        1: 'white'
        2: 'dimgrey'
        -9: 'aquamarine3'
Writing data/self_defined_single_trait.yaml
attr=load_attributes('data/self_defined_single_trait.yaml')
all_fam=readped('data/Fig_2_3_fam.ped',attr)
all_fam
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
fid iid fathid mothid sex ad
0 25_2 25_2_33 25_2_49 25_2_50 2 2
1 25_2 25_2_28c1 0 0 2 1
2 25_2 25_2_25 25_2_49 25_2_50 1 2
3 25_2 25_2_28 0 0 1 2
4 25_2 25_2_29 25_2_49 25_2_50 2 2
... ... ... ... ... ... ...
401 10R_R99 10R_R99_22 10R_R99_29 10R_R99_15 1 1
402 10R_R99 10R_R99_29 0 0 1 2
403 10R_R99 10R_R99_7 0 0 2 2
404 10R_R99 10R_R99_8 0 0 1 1
405 10R_R99 10R_R99_8 10R_R99_19 10R_R99_5 2 1

406 rows × 6 columns

dots=GraphPed(all_fam,attr)
show(dots)

svg

svg

svg

Releases

No releases published

Packages

No packages published

Languages