Mentions légales du service

Skip to content
Snippets Groups Projects
plot_regional_strains.py 6.68 KiB
Newer Older
#coding=utf8

################################################################################
###                                                                          ###
Martin Genet's avatar
Martin Genet committed
### Created by Martin Genet, 2016-2018                                       ###
###                                                                          ###
### École Polytechnique, Palaiseau, France                                   ###
###                                                                          ###
################################################################################

import math
import matplotlib.pyplot

################################################################################

def plot_regional_strains(
        working_folder,
        working_basename,
        k_frame=None,
        components="all", # all, circ-long, or rad-circ
        yranges=[0]*6,
        n_sectors_c=6,
        n_sectors_l=3,
        suffix="",
        verbose=1):

    assert (components in ("all", "circ-long", "rad-circ"))
    if (components == "all"):
        comp_names = ["radial", "circumferential", "longitudinal", "radial-circumferential", "radial-longitudinal", "circumferential-longitudinal"]
        n_cols = 3
        n_rows = 2
    elif (components == "circ-long"):
        comp_names = ["circumferential","longitudinal","circumferential-longitudinal"]
        n_cols = 3
        n_rows = 1
    elif (components == "rad-circ"):
        comp_names = ["radial", "circumferential", "radial-circumferential"]
        n_cols = 3
        n_rows = 1
    n_comp = len(comp_names)

    strains_lines = open(working_folder+"/"+working_basename+"-strains.dat").readlines()[1:]
    strains_all = [[100*float(string) for string in line.split()[1:]] for line in strains_lines]

    n_frames = len(strains_lines)
    if (k_frame is None):
        k_frame = n_frames/2

    strains_es = strains_all[k_frame]
    #print "len(strains_es) = "+str(len(strains_es))

    n_sectors = n_sectors_l * n_sectors_c
    assert (len(strains_es)/2 == (1+n_sectors)*n_comp), "Number of strain components ("+str(len(strains_es)/2)+") inconsistent with number of sectors (n_sectors_c="+str(n_sectors_c)+", n_sectors_l="+str(n_sectors_l)+"). Aborting."

    strains_es_avg = [[strains_es[(k_sector+1)*2*n_comp+2*k_comp] for k_sector in xrange(n_sectors)] for k_comp in xrange(n_comp)]

    size = 4
    fig = matplotlib.pyplot.figure(figsize=(n_cols*size,n_rows*size))

    for k_comp in xrange(n_comp):

        subplot = fig.add_subplot(n_rows, n_cols, k_comp+1, projection='polar')
        subplot.set_title(comp_names[k_comp]+" strain (%)")

        subplot.set_xticks([])
        subplot.set_yticks([])

        strains_comp = strains_es_avg[k_comp]

        yrange = yranges[k_comp]
        if (yrange == 0):
            strains_comp_min = min(strains_comp)
            strains_comp_max = max(strains_comp)
            strains_comp_min = min(strains_comp_min, -strains_comp_max)
            strains_comp_max = -strains_comp_min
        else:
            strains_comp_min = -yrange
            strains_comp_max = +yrange
        assert (strains_comp_max>strains_comp_min), "strains_comp_max ("+str(strains_comp_max)+") <= strains_comp_min (strains_comp_min). Aborting."

        cmap = matplotlib.pyplot.cm.get_cmap('coolwarm')
        smap = matplotlib.pyplot.cm.ScalarMappable(
            cmap=cmap,
            norm=matplotlib.pyplot.Normalize(vmin=strains_comp_min, vmax=strains_comp_max))
        smap._A = []

        cbar = matplotlib.pyplot.colorbar(
            mappable=smap,
            #orientation="horizontal",
            format="%+g",
            shrink=2./3)
        #cbar.set_label(comp_names[k_comp]+" (%)")
        cbar.solids.set_edgecolor("face")

        k_sector = 0
        for k_l in xrange(n_sectors_l):
            for k_c in xrange(n_sectors_c):
                subplot.bar(
                    left = k_c * 2*math.pi/n_sectors_c,
                    height = 1./n_sectors_l,
                    width = 2*math.pi/n_sectors_c,
                    bottom = 1.-float(k_l+1)/n_sectors_l,
                    color = cmap(float(strains_comp[k_sector]-strains_comp_min)/(strains_comp_max - strains_comp_min)),
                    linewidth=0)
                #subplot.annotate(
                    #"{:+2.1f}".format(strains_comp[k_sector]),
                    #xy=    [(k_c+0.5) * 2*math.pi/n_sectors_c, 1.-float(k_l+0.5)/n_sectors_l],
                    #xytext=[(k_c+0.5) * 2*math.pi/n_sectors_c, 1.-float(k_l+0.5)/n_sectors_l],
                    #xycoords='polar',
                    #textcoords='data',
                    #horizontalalignment='center',
                    #verticalalignment='center')
                subplot.annotate(
                    str(k_sector+1),
                    xy=    [(k_c+0.5) * 2*math.pi/n_sectors_c, 1.-float(k_l+0.5)/n_sectors_l],
                    xytext=[(k_c+0.5) * 2*math.pi/n_sectors_c, 1.-float(k_l+0.5)/n_sectors_l],
                    xycoords='polar',
                    textcoords='data',
                    horizontalalignment='center',
                    verticalalignment='center')
                k_sector += 1

        subplot.annotate(
            "anterior",
            textcoords='data',
            xycoords='polar',
            xy=    [1*math.pi/4,1.1],
            xytext=[1*math.pi/4,1.1],
            horizontalalignment='center',
            verticalalignment='center',
            rotation=-45)
        subplot.annotate(
            "septal",
            textcoords='data',
            xycoords='polar',
            xy=    [3*math.pi/4,1.1],
            xytext=[3*math.pi/4,1.1],
            horizontalalignment='center',
            verticalalignment='center',
            rotation=45)
        subplot.annotate(
            "inferior",
            textcoords='data',
            xycoords='polar',
            xy=    [5*math.pi/4,1.1],
            xytext=[5*math.pi/4,1.1],
            horizontalalignment='center',
            verticalalignment='center',
            rotation=-45)
        subplot.annotate(
            "lateral",
            textcoords='data',
            xycoords='polar',
            xy=    [7*math.pi/4,1.1],
            xytext=[7*math.pi/4,1.1],
            horizontalalignment='center',
            verticalalignment='center',
            rotation=45)

    matplotlib.pyplot.tight_layout()

    if (suffix is None):
        plotfile_basename = working_folder+"/"+working_basename+"-regional_strains"
    else:
        plotfile_basename = "plot_regional_strains"+("-"+suffix)*(suffix!="")
    matplotlib.pyplot.savefig(plotfile_basename+".pdf", format='pdf')