Visualising RDMs with the 92 images dataset¶
This notebook demonstrates how rsatoolbox.vis.show_rdm can be used to visualise RDMs. By setting the RDM’s pattern_descriptors to rsatoolbox.vis.Icon instances it is possible to automatically generate stacked image labels and other custom visualisations.
[ ]:
# imports
import matplotlib.pyplot as plt
import matplotlib
from rsatoolbox import vis
from rsatoolbox import rdm
import numpy as np
import os
import scipy
from collections import defaultdict
Loading data and building RDMs instance with Icon pattern_descriptors¶
Before we begin, we need to load up the fMRI data from the 92 images dataset (Kriegeskorte et al., 2008).
[2]:
# supporting functions and constants
DEMO_DIR = os.getcwd()
NEURON_DIR = os.path.join(DEMO_DIR, "92imageData")
def neuron_2008_icons(**kwarg):
""" Load Krigeskorte et al. (2008, Neuron) images as Icon instances."""
mat_path = os.path.join(NEURON_DIR, "Kriegeskorte_Neuron2008_supplementalData.mat")
mat = scipy.io.loadmat(mat_path)
colors = plt.get_cmap('Accent', lut=16).colors
markers = list(matplotlib.markers.MarkerStyle('').markers.keys())
icons = defaultdict(list)
for this_struct in mat["stimuli_92objs"][0]:
# we're going to treat the 4 binary indicators (human, face, animal, natural) as a
# base2 binary string, and index into this array of colors accordingly.
index = int("".join(
[
str(this_struct[this_key][0,0]) for this_key in (
'human', 'face', 'animal', 'natural')
]
),
base=2)
this_color = colors[index]
icons['image'].append(vis.Icon(image=this_struct['image'],
color=this_color,
circ_cut='cut',
border_type='conv',
border_width=5,
**kwarg))
icons['string'].append(vis.Icon(string=this_struct['category'][0],
color=this_color,
font_color=this_color,
**kwarg))
icons['marker'].append(vis.Icon(marker=markers[index],
color=this_color,
**kwarg))
return icons
def neuron_2008_rdms_fmri(**kwarg):
""" Load Kriegeskorte et al. (2008, Neuron) fMRI RDMs as RDMs instance.
All key-word arguments are passed to neuron_2008_images."""
mat_path = os.path.join(NEURON_DIR, "92_brainRDMs.mat")
mat = scipy.io.loadmat(mat_path)
icons = neuron_2008_icons(**kwarg)
# insert leading dim to conform with rsatoolbox nrdm x ncon x ncon convention
return rdm.concat(
[
rdm.RDMs(
dissimilarities=this_rdm["RDM"][None, :, :],
dissimilarity_measure="1-rho",
rdm_descriptors=dict(
zip(["ROI", "subject", "session"], this_rdm["name"][0].split(" | ")),
name=this_rdm["name"][0]
),
pattern_descriptors=icons
)
for this_rdm in mat["RDMs"].flatten()
]
)
[3]:
# as an example, load the Kriegeskorte et al., 2008 fMRI RDMs
rdms = neuron_2008_rdms_fmri()
Plotting RDMs with text labels¶
[4]:
# to keep it simple, let's start with plotting the first 10 conditions
rdms_small = rdms.subset_pattern('index', np.arange(10))
rdms_small = rdm.rank_transform(rdms_small)
[5]:
vis.show_rdm(rdms_small, rdm_descriptor='name', show_colorbar='figure', pattern_descriptor='index')
plt.show()
Plotting with image labels¶
It might help to put some image labels on…
[6]:
vis.show_rdm(rdms_small,
rdm_descriptor='name',
show_colorbar='figure',
pattern_descriptor='image')
plt.show()
Notice how the image labels are scaled to avoid overlap. However, they are rather small. Grouping them might help us get away with larger images. We will also tweak icon_spacing to 10% overlap between the images.
[7]:
vis.show_rdm(rdms_small,
rdm_descriptor='name',
show_colorbar='figure',
pattern_descriptor='image',
num_pattern_groups=5,
icon_spacing=.9)
plt.show()
Now the images are very clear (maybe too big in fact, unless you are preparing a figure for a slideshow). Notice how show_rdm adds white gridlines to mark the label groups. If you like, you can control this behavior with the gridlines argument.
For now though, let’s scale up to the full insanity of 92 images…
[8]:
# probably sane not to plot too many of these
fig, ax, ret_val = vis.show_rdm(rdms[0],
rdm_descriptor='name',
pattern_descriptor='image',
num_pattern_groups=6,
icon_spacing=.9,
show_colorbar='panel',
vmin=0.,
n_column=1,
figsize=(10,10)
)
plt.show()
Not too bad, considering how many images we are plotting. With this full view you can also see two other features that help guide the eye in large RDM visualisations:
A carefully selected
num_pattern_groupsparameter really helps with picking out interesting conditions (notice how the faces are in grids 3-4 and 7-8 above).The
colorparameter that was used when instancing the Icons controls the color of the supporting lines and the circular outlines. This can also be used to convey category membership.
Optimising image label display and saving figure¶
In general, you can achieve larger, clearer image labels by
plotting fewer RDMs in the same figure
increasing
num_pattern_groupsdecreasing
icon_spacingadjusting
figsizeincreasing
dpiwhen saving, see below
[9]:
# to save the figure, remember to set bbox_inches='tight'.
# (Otherwise the image labels may get cropped out)
fig.savefig('temp_rdm.png', bbox_inches='tight', dpi=300)
The saved RDM image is plotted below. It may look quite a bit crisper than the inline view we generated previously. 
Plot MDS¶
Here we make a scatterplot of the RDM reduced to two dimensions using MultiDimensional Scaling
[10]:
vis.show_MDS(
rdms_small,
rdm_descriptor='name',
pattern_descriptor='image'
)
[10]: