Source code for BrainNetworksInPython.scripts.visualisation_commands
#!/usr/bin/env python
import seaborn as sns
import matplotlib.pylab as plt
import numpy as np
import networkx as nx
import pandas as pd
import matplotlib as mpl
import os
import sys
import matplotlib.image as mpimg
import matplotlib.gridspec as gridspec
from glob import glob
import itertools as it
import matplotlib.patches as mpatches
[docs]def rescale(fname, suff='png'):
'''
Journals generally like to make life easier for reviewers
by sending them a manuscript that is not going to crash
their computers with its size, so we're going to create
a smaller version of the input figure (fname) that is
8 inches wide at 200 dpi. It will be saved out in whatever
format specified by the suff parameter, and the name
will be the same as the original but with _LowRes appended
'''
from PIL import Image
import numpy as np
# Open the file and figure out what size it is
img = Image.open(fname+'.'+suff)
size = img.size
# Calculate the scale factor that sets the width
# of the figure to 1600 pixels
scale_factor = 1600.0/size[0]
# Apply this scale factor to the width and height
# to get the new size
new_size = (np.int(size[0]*scale_factor), np.int(size[1]*scale_factor))
# Resize the image
small_img = img.resize(new_size, Image.ANTIALIAS)
# Define the output name
new_name = ''.join([os.path.splitext(fname)[0],
'_LowRes.',
suff])
# Save the image
small_img.save(new_name, optimize=True, quality=95)
# And you're done!
[docs]def view_corr_mat(corr_mat_file, output_name, cmap_name='RdBu_r', cost=None, bin=False):
# Read in the data
M = np.loadtxt(corr_mat_file)
# If cost is given then roughly threshold at that cost.
# NOTE - this is not actually the EXACT network that you're analysing
# because it doesn't include the minimum spanning tree. But it will give
# you a good sense of the network structure.
# #GoodEnough ;)
if cost:
thr = np.percentile(M.reshape(-1), 100-cost)
M[M<thr] = 0
vmin=0
vmax=1
ticks_dict = { 'locations' : [ 0, 1 ],
'labels' : [ '0', '1' ] }
else:
vmin=-1
vmax=1
ticks_dict = { 'locations' : [ -1, 0, 1 ],
'labels' : [ '-1', '0', '1' ] }
if bin:
M[M>0] = 1
# Create an axis
fig, ax = plt.subplots(figsize=(6,5))
ax.axis('off')
# Show the network measures
mat_ax = ax.imshow(M,
interpolation='none',
cmap=cmap_name,
vmin=vmin,
vmax=vmax)
# Put a box around your data
ax.add_patch(
mpatches.Rectangle(
(ax.get_xlim()[0], ax.get_ylim()[1]),
ax.get_xlim()[1],
ax.get_ylim()[0],
fill=False, # remove background
color='k',
linewidth=1) )
# Add colorbar, make sure to specify tick locations to match desired ticklabels
cbar = fig.colorbar(mat_ax, ticks=ticks_dict['locations'])
cbar.ax.set_yticklabels(ticks_dict['labels']) # vertically oriented colorbar
plt.tight_layout()
# Save the picture
fig.savefig(output_name, bbox_inches=0, dpi=100)
rescale(output_name)
plt.close(fig)