Μέχρι στιγμής έχουμε δει πως κάνουμε plot μέσω της matplotlib στις περσινές και φετινές σημειώσεις. Η matplotlib είναι κατάλληλη για "στατικά" plots που μπορούμε να σώσουμε σε ένα αρχείο εικόνας. Αυτά τα plots δεν μας επιτρέπουν να αλληλεπιδράσουμε με τα δεδομένα και να τα εξερευνήσουμε!
Μία από τις πιο γνωστές βιβιλιοθήκες για αυτό το σκοπό είναι η bokeh. Για αρχή ας την εγκαταστήσουμε:
!conda install -y bokeh
Κάνουμε import:
from bokeh.io import output_notebook, show
from bokeh.plotting import figure
Η παρακάτω εντολή, ρυθμίζει τη bokeh να ενσωματώνει τα plots στο jupyter:
output_notebook()
Ας φτιάξουμε ένα απλό plot:
# create a new plot with default tools, using figure
p = figure()
# Βάζουμε κύκλους σε συγκεκριμένα σημεία
p.circle([1, 2, 3, 4, 5], [6, 7, 2, 4, 5],)
show(p) # showtime!
Για αρχή παρατηρήστε ότι μπορείτε να αλληλεπιδράσετε με αυτό το plot.
Ας κάνουμε τους κύκλους να έχουν διαφορετικό χρώμα και μέγεθος:
# create a new plot with default tools, using figure
p = figure(plot_width=400, plot_height=400)
# add a circle renderer with a size, color, and alpha
p.circle([1, 2, 3, 4, 5], [6, 7, 2, 4, 5],
size=[10,11,12,13,14],
line_color="navy",
fill_color=["orange"]*4+['pink'], fill_alpha=0.5)
show(p) # show the results
Η πιο σημαντική ίσως ιδιότητα της bokeh είναι ότι σας επιτρέπει να σώσεται τα plots σε μορφή html. Με αυτόν τον τρόπο μπορείτε όχι μόνο να "στείλετε" ένα plot κάπου αλλού, αλλά και να το "ανεβάσετε" στο Internet!
from bokeh.io import save
save(p, 'graph.html')
Δοκιμάστε τώρα να ανοίξετε το αρχείο graph.html
από τον browser σας (File -> Open..)
Η bokeh είναι πολύ πλούσια βιβλιοθήκη. Σε αυτό link: http://nbviewer.jupyter.org/github/bokeh/bokeh-notebooks/blob/master/tutorial/00%20-%20Introduction%20and%20Setup.ipynb υπάρχει ένας πολύ αναλυτικός οδηγός με τις περισσότερες λειτουργίες της.
Με τις παρακάτω εντολές εγκαθιστά διάφορα δοκιμαστικά datasets:
import bokeh
bokeh.sampledata.download()
Με τη παρακάτω εντολή εγκαθιστούμε τη pandas την οποία θα χρειαστούμε για το επόμενο παράδειγμα. Σε επόμενη διάλεξη θα κάνουμε μία αναλυτική παρουσιάση της pandas.
!conda install -y pandas
Μία από τις πιο βασικές ιδιότητες της bokeh είναι ότι μπορούμε να προσθέσουμε tooltips. Τα tooltips είναι διάφορες (μετα)πληροφορίες που εμφανίζονται όταν "περνάμε" το ποντίκι πάνω από ένα σημείο.
from bokeh.models import TapTool, CustomJS, ColumnDataSource
from bokeh.models import HoverTool
from bokeh.io import output_file
output_file('plot.html')
source = ColumnDataSource(
data=dict(
x=[1, 2, 3, 4, 5],
y=[2, 5, 8, 2, 7],
desc=['A', 'b', 'C', 'd', 'E'],
example=['aa', 'bb', 'cc', 'dd', 'ee'],
)
)
hover = HoverTool(
tooltips=[
("index", "$index"),
("(x,y)", "($x, $y)"),
("desc", "@desc"),
("Mitsos", "@example"),
]
)
p = figure(plot_width=300, plot_height=300, tools=[hover], title="Mouse over the dots")
p.circle('x', 'y', size=20, source=source)
show(p)
Αυτή η σειρά ασκήσεων έχει μόνο μία άσκηση. Θα πρέπει να κάνετε ένα plot το οποίο θα το σώσετε σε μορφή html. Στη συνέχεια και σε συνεργασία με τους διδάσκοντες στο μάθημα BIO102 θα πρέπει να "ανεβάσετε" το plot στη προσωπική σας σελίδα.
Στείλτε το plot:
Σε αυτή τη σελίδα: https://www.ebi.ac.uk/gwas/docs/file-downloads υπάρχει κατάλογος με τα πεισσότερα GWAS πειράματα που έχουν γίνει. Μπορούμε να το κατεβάσουμε με τη παρακάτω εντολή:
!wget -O gwas_catalogue.tsv https://www.ebi.ac.uk/gwas/api/search/downloads/full
Ας διαβάσουμε τη πρώτη γραμμή του αρχείου:
file = open('gwas_catalogue.tsv')
line_1 = file.readline()
line_1
Το αρχείο είναι tab delimited. Ας το κάνουμε split:
line_1_splitted = line_1.split('\t')
line_1_splitted
Αυτό το αρχείο λοιπόν περιέχει όλα τα SNPs για τα οποία έχει βρεθεί κάποια στατιστική συσχέτιση με κάποιον φαινότυπο. Οι στήλες που μας ενδιαφέρουν είναι:
Το plot σας θα έχει στον χ-άξονα την ημερομηνία που έγινε η δημοσίευση (DATA). Στον χ-άξονα, οι ημερομηνίες πρέπει να είναι ταξινομημένες από τη πιο παλιά (αριστερά) στη πιο πρόσφατη (δεξιά). Θα πρέπει δηλαδή να ταξινομήσετε τα δεδομένα με βάση την ημερομηνία. Ο y άξονας θα έχει τον αρνητικό λογάριθμο του p-value. Επειδή το p-value συνήθως είναι πολύ μικρό, χρησιμοποιούμε τον αρνητικό λογάριθμο για να τον αναπαραστήσουμε. Για παράδειγμα:
import math
p_value = 4E-7 # 4*10^(-7)
def negative_log(p):
return -math.log10(p)
negative_log(p_value)
Κάθε SNP θα αναπαριστάται με έναν κύκλο με μέγεθος ανάλογα με το πλήθος των samples που συμμετείχαν στη μελέτη (πεδίο INITIAL_SAMPLE_SIZE
).
Όταν ο χρήστης περνάει με το ποντίκι πάνω από κάποιον κύκλο θα πρέπει να του εμφανίζεται ο τίτλος του paper όπου έγινε η δημοσίευση.
Σημείωση: Αν τα δεδομένα είναι πάρα πολλά και το plot είναι πολύ πυκνό τότε μπορείτε να βάλετε κάποιο φίλτρο π.χ. Μόνο τα SNPs που δημοσιεύθηκαν από το 2013 και μετά ή/και αυτά που είναι στο χρωμόσωμα 1.
Προσπαθήστε το plot να είναι ταυτόχρονα χρηστικό και αισθητικά ωραίο!