In [1]:
%matplotlib inline
# globals
import matplotlib as mpl
from customize_matplotlib import clean_axis, set_fonts
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid.inset_locator import inset_axes
from scipy.stats import tsem
set_fonts(mpl, 'paper')
In [4]:
# Get polysome profile data
# get list of all raw csv files
parentdir = '../rawdata/sucrosegradients/'
listoffiles = [
parentdir + File for File in os.listdir(parentdir)
if File.startswith('20160617')
]
# sort alphabetically
listoffiles = sorted(listoffiles, key=lambda File: File.split('_')[-1])
samplenames = pd.read_table(parentdir + 'samplenames.tsv', index_col=0)
polysomedata = dict()
for File in listoffiles:
samplename = samplenames.ix[int(File.split('_')[-1][-5])]['samplename']
polysomedata[samplename] = pd.read_table(
File, skiprows=32, sep=',', skipinitialspace=True)
# Align x, normalize y to monosome peak for all polysome profiles
ynorm = dict()
xnorm = dict()
disome = dict()
ymin = dict()
for sample in polysomedata:
monosomeSubset = polysomedata[sample]['Distance(mm)'] > 20
disomeSubset = polysomedata[sample]['Distance(mm)'] > 33
monosomeSubsetData = polysomedata[sample][monosomeSubset]
disomeSubsetData = polysomedata[sample][disomeSubset]
ynorm[sample] = np.max(monosomeSubsetData['Absorbance'])
maxyindex = np.argmax(monosomeSubsetData['Absorbance'])
xnorm[sample] = monosomeSubsetData.ix[maxyindex]['Distance(mm)']
disome[sample] = np.max(disomeSubsetData['Absorbance'])
ymin[sample] = np.min(disomeSubsetData['Absorbance'])
avgxnorm = np.mean(list(xnorm.values()))
xnorm = {key: (value - avgxnorm) for key, value in xnorm.items()}
# Get qPCR data
parentdir = '../rawdata/qpcr/polysome_fig1c/'
qpcrfiles = [parentdir + File for File in os.listdir(parentdir)]
qpcrdata = []
for File in qpcrfiles:
qpcrdata.append(pd.read_table(File)[['ct', 'samplename']])
qpcrdata = pd.concat(qpcrdata)
qpcrdata = qpcrdata[qpcrdata['samplename'].apply(lambda x: x.find('-RT') == -1)]
qpcrdata['ct'] = qpcrdata['ct'].apply(float)
# Normalize by Fluc
averagedqpcrdata = qpcrdata.groupby('samplename')['ct'].agg([np.mean, tsem])
averagedqpcrdata['normmean'] = np.nan
averagedqpcrdata['normtsem'] = np.nan
for row in averagedqpcrdata.iterrows():
normsample = row[0].replace('leu1214primer', 'flucprimer')
averagedqpcrdata.ix[row[0]]['normmean'] = row[1][
'mean'] - averagedqpcrdata.ix[normsample]['mean']
averagedqpcrdata.ix[row[0]]['normtsem'] = row[1][
'tsem'] + averagedqpcrdata.ix[normsample]['tsem']
averagedqpcrdata = averagedqpcrdata.select(lambda x: x.find('fluc') == -1)
# Plot Fig. 1C
fig = plt.figure()
fig.set_size_inches([4.5, 3]) # width, height
# common axis below used for a shared x and y label across panels
commonaxis = plt.axes(frameon=False)
commonaxis.set_xticks([])
commonaxis.set_yticks([])
commonaxis.yaxis.labelpad = 30 # move the labels a bit away from panels
commonaxis.xaxis.labelpad = 30 # move the labels a bit away from panels
commonaxis.set(xlabel='Fraction number',
ylabel='Normalized yfp mRNA abundance')
samplelabels = {
'yfp0_rich': 'yfp0: Leu rich',
'yfp0_starve': 'yfp0: Leu starved',
'cta1314_rich': 'yfp3: Leu rich',
'cta1314_starve': 'yfp3: Leu starved'
}
samplenumber = 0
for polysomesample in [
'yfp0_rich', 'yfp0_starve', 'cta1314_rich', 'cta1314_starve'
]:
# this subtracts a constant values from X-axis to align all monosome
# peaks
xadjust = xnorm[polysomesample]
samplenumber += 1
ax1 = fig.add_subplot(2, 2, samplenumber)
ax2 = ax1.twinx()
ax2_inset = inset_axes(
ax2,
width="40%", # width = 10% of parent_bbox width
height="40%", # height : 50%
loc=1,
bbox_to_anchor=(0.25, 0.05, 1, 1),
bbox_transform=ax2.transAxes,
borderpad=0, )
fractionchanges = polysomedata[polysomesample].dropna(
subset=['Fraction Number'])
previouslocation = 0
fractionpositions = []
linepositions = [previouslocation]
for xlocation, fraction in zip(
fractionchanges['Distance(mm)'] - xnorm[polysomesample],
fractionchanges['Fraction Number']):
if fraction == '1': # this fraction was combined with fraction 2
continue
textposition = xlocation - (xlocation - previouslocation) / 2
fractionpositions.append(textposition)
linepositions.append(xlocation)
previouslocation = xlocation
subsetdata = averagedqpcrdata.select(
lambda x: x.startswith(polysomesample))
subsetdata['err'] = map(
lambda x: np.log(2) * x[1]['normtsem'] * 2**(-x[1]['normmean']),
subsetdata.iterrows())
subsetdata['mean'] = map(lambda x: 2**(-x[1]['normmean']),
subsetdata.iterrows())
norm = max(subsetdata['mean'])
subsetdata = subsetdata / norm
x = fractionpositions[:len(subsetdata)] - xadjust
linex = linepositions[:len(subsetdata) + 1] - xadjust
ax2.set_ylim(
bottom=ymin[polysomesample] / ynorm[polysomesample],
top=1.05 * (disome[polysomesample] / ynorm[polysomesample]))
ax2x = polysomedata[polysomesample]['Distance(mm)'] - xadjust
ax2y = polysomedata[polysomesample]['Absorbance'] / ynorm[polysomesample]
ax2.plot(ax2x, ax2y, color='0.5', label='$A_{260}$', zorder=1)
ax2_inset.plot(
polysomedata[polysomesample]['Distance(mm)'] - xnorm[polysomesample],
polysomedata[polysomesample]['Absorbance'] / ynorm[polysomesample],
color='0.5')
ax1.errorbar(
x,
subsetdata['mean'],
subsetdata['err'],
linestyle='None',
marker='^',
markersize=3,
color='black',
elinewidth=0.5,
capthick=0.5,
capsize=2,
zorder=10)
[
ax1.text(
(linex[n + 1] + linex[n]) / 2,
-0.2,
str(n + 1),
zorder=1,
fontsize=8,
ha='center',
va='top') for n in range(0, len(linex) - 1, 2)
]
# customize axis display
ax1.set_title(samplelabels[polysomesample], y=1.05)
clean_axis(ax1)
ax2.axis('off')
ax1.set_xlim(left=0, right=80)
ax1.set_xticks(linex)
ax1.set_xticklabels([])
ax1.set_ylim(bottom=0, top=1.2)
ax2_inset.yaxis.set(ticks_position='none')
ax2_inset.xaxis.set(ticks_position='none')
ax2_inset.set_xlim(left=0, right=80)
ax2_inset.set_ylim(top=1.2)
ax2_inset.set_xticks([])
ax2_inset.set_yticks([])
# ax2.legend(bbox_to_anchor=[1.2, -0.5])
fig.subplots_adjust(wspace=0.7, hspace=0.7)
fig.savefig('../figures/fig1c.svg')