def visualize_importance(importance, ax, xticklabels=True, 
                           yticklabels=True, pad=0, ymax=None, legend=True):
    """Plot task loadings on one axis"""
    importance_vars = importance[0]
    importance_vals = [abs(i)+pad for i in importance[1].T]
    plot_loadings(ax, importance_vals, kind='line', offset=.5,
                  plot_kws={'alpha': 1, 'linewidth': 3})
    # set up x ticks
    xtick_locs = np.arange(0.0, 2*np.pi, 2*np.pi/len(importance_vars))
    ax.set_xticks(xtick_locs)
    ax.set_xticks(xtick_locs+np.pi/len(importance_vars), minor=True)
    if xticklabels:
        if type(importance_vars[0]) == str:
            ax.set_xticklabels(importance_vars, 
                               y=.08, minor=True)
        else:
            ax.set_xticklabels(['Fac %s' % str(i+1) for i in importance_vars], 
                               y=.08, minor=True)
    # set up yticks
    if ymax:
        ax.set_ylim(top=ymax)
    ytick_locs = ax.yaxis.get_ticklocs()
    new_yticks = np.linspace(0, ytick_locs[-1], 7)
    ax.set_yticks(new_yticks)
    if yticklabels:
        labels = np.round(new_yticks,2)
        replace_dict = {i:'' for i in labels[::2]}
        labels = [replace_dict.get(i, i) for i in labels]
        ax.set_yticklabels(labels)
    if legend:
        ax.legend(loc='upper center', bbox_to_anchor=(.5,-.15))
def visualize_importance(importance, ax, xticklabels=True, yticklabels=True, 
                         axes_linewidth=None, label_size=10,
                         label_scale=0, title=None, 
                         ymax=None, color='k'):
    importance_vars = importance[0]
    importance_vars = [shortened_factors.get(v,v) for v in importance_vars]
    if importance[1] is not None:
        importance_vals = [abs(i) for i in importance[1]]
        plot_loadings(ax, importance_vals, kind='line', offset=.5, 
                      colors=[color], plot_kws={'alpha': 1, 'linewidth': label_size/4})
    else:
        ax.set_yticks([])
    ax.grid(linewidth=label_size/8)
    if axes_linewidth:
        plt.setp(list(ax.spines.values()), linewidth=axes_linewidth)

    # set up x ticks
    xtick_locs = np.arange(0.0, 2*np.pi, 2*np.pi/len(importance_vars))
    ax.set_xticks(xtick_locs)
    ax.set_xticks(xtick_locs+np.pi/len(importance_vars), minor=True)
    if xticklabels:
        if type(importance_vars[0]) != str:
            importance_vars = [str(i+1) for i in importance_vars]
        scale = 1+label_scale
        size = ax.get_position().expanded(scale, scale)
        ax2=ax.get_figure().add_axes(size,zorder=2)
        for i, var in enumerate(importance_vars):
            arc_start = (i+.15)*2*np.pi/len(importance_vars)
            arc_end = (i+.85)*2*np.pi/len(importance_vars)
            curve = [
                .85*np.cos(np.linspace(arc_start,arc_end,100)),
                .85*np.sin(np.linspace(arc_start,arc_end,100))
            ]  
            plt.plot(*curve, alpha=0)
            curvetext = CurvedText(
                x = curve[0][::-1],
                y = curve[1][::-1],
                text=var, #'this this is a very, very long text',
                va = 'bottom',
                axes = ax2,
                fontsize=label_size
            )
            ax2.set_xlim([-1,1]); ax2.set_ylim([-1,1])
            ax2.axis('off')
        
    if title:
        ax.set_title(title, fontsize=label_size*1.5, y=1.1)
    # set up yticks
    if len(importance[1]) != 0:
        ax.set_ylim(bottom=0)
        if ymax is None:
            ymax = np.max(importance_vals)*1.1
        ax.set_ylim(top=ymax)
        new_yticks = np.linspace(0, ymax, 7)
        ax.set_yticks(new_yticks)
        if yticklabels:
            labels = np.round(new_yticks,2)
            replace_dict = {i:'' for i in labels[::2]}
            labels = [replace_dict.get(i, i) for i in labels]
            ax.set_yticklabels(labels)
Пример #3
0
def plot_cluster_factors(results,
                         c,
                         rotate='oblimin',
                         ext='png',
                         plot_dir=None):
    """
    Args:
        EFA: EFA_Analysis object
        c: number of components for EFA
        task_sublists: a dictionary whose values are sets of tasks, and 
                        whose keywords are labels for those lists
    """
    # set up variables
    HCA = results.HCA
    EFA = results.EFA

    names, cluster_loadings = zip(
        *HCA.get_cluster_loading(EFA, rotate=rotate).items())
    cluster_DVs = HCA.get_cluster_DVs(inp='EFA%s_%s' % (EFA.get_c(), rotate))
    cluster_loadings = list(
        zip([cluster_DVs[n] for n in names], cluster_loadings))
    max_loading = max([max(abs(i[1])) for i in cluster_loadings])
    # plot
    colors = sns.hls_palette(len(cluster_loadings))
    ncols = min(5, len(cluster_loadings))
    nrows = ceil(len(cluster_loadings) / ncols)
    f, axes = plt.subplots(nrows,
                           ncols,
                           figsize=(ncols * 10, nrows * (8 + nrows)),
                           subplot_kw={'projection': 'polar'})
    axes = f.get_axes()
    for i, (measures, loading) in enumerate(cluster_loadings):
        plot_loadings(axes[i],
                      loading,
                      kind='line',
                      offset=.5,
                      plot_kws={
                          'alpha': .8,
                          'c': colors[i]
                      })
        axes[i].set_title('Cluster %s' % i, y=1.14, fontsize=25)
        # set tick labels
        xtick_locs = np.arange(0.0, 2 * np.pi, 2 * np.pi / len(loading))
        axes[i].set_xticks(xtick_locs)
        axes[i].set_xticks(xtick_locs + np.pi / len(loading), minor=True)
        if i % (ncols * 2) == 0 or i % (ncols * 2) == (ncols - 1):
            axes[i].set_xticklabels(loading.index, y=.08, minor=True)
            # set ylim
            axes[i].set_ylim(top=max_loading)
    for j in range(i + 1, len(axes)):
        axes[j].set_visible(False)
    plt.subplots_adjust(hspace=.5, wspace=.5)

    filename = 'polar_factors_EFA%s_%s.%s' % (c, rotate, ext)
    if plot_dir is not None:
        save_figure(f, path.join(plot_dir, filename), {'bbox_inches': 'tight'})
        plt.close()
def plot_cluster_factors(results, c, rotate='oblimin',  ext='png', plot_dir=None):
    """
    Args:
        EFA: EFA_Analysis object
        c: number of components for EFA
        task_sublists: a dictionary whose values are sets of tasks, and 
                        whose keywords are labels for those lists
    """
    # set up variables
    HCA = results.HCA
    EFA = results.EFA
    
    names, cluster_loadings = zip(*HCA.get_cluster_loading(EFA, rotate=rotate).items())
    cluster_DVs = HCA.get_cluster_DVs(inp='EFA%s_%s' % (EFA.get_c(), rotate))
    cluster_loadings = list(zip([cluster_DVs[n] for n in names], cluster_loadings))
    max_loading = max([max(abs(i[1])) for i in cluster_loadings])
    # plot
    colors = sns.hls_palette(len(cluster_loadings))
    ncols = min(5, len(cluster_loadings))
    nrows = ceil(len(cluster_loadings)/ncols)
    f, axes = plt.subplots(nrows, ncols, 
                               figsize=(ncols*10,nrows*(8+nrows)),
                               subplot_kw={'projection': 'polar'})
    axes = f.get_axes()
    for i, (measures, loading) in enumerate(cluster_loadings):
        plot_loadings(axes[i], loading, kind='line', offset=.5,
              plot_kws={'alpha': .8, 'c': colors[i]})
        axes[i].set_title('Cluster %s' % i, y=1.14, fontsize=25)
        # set tick labels
        xtick_locs = np.arange(0.0, 2*np.pi, 2*np.pi/len(loading))
        axes[i].set_xticks(xtick_locs)
        axes[i].set_xticks(xtick_locs+np.pi/len(loading), minor=True)
        if i%(ncols*2)==0 or i%(ncols*2)==(ncols-1):
            axes[i].set_xticklabels(loading.index,  y=.08, minor=True)
            # set ylim
            axes[i].set_ylim(top=max_loading)
    for j in range(i+1, len(axes)):
        axes[j].set_visible(False)
    plt.subplots_adjust(hspace=.5, wspace=.5)
    
    filename = 'polar_factors_EFA%s_%s.%s' % (c, rotate, ext)
    if plot_dir is not None:
        save_figure(f, path.join(plot_dir, filename),
                    {'bbox_inches': 'tight'})
        plt.close()
Пример #5
0
def visualize_importance(importance,
                         ax,
                         xticklabels=True,
                         yticklabels=True,
                         pad=0,
                         ymax=None,
                         legend=True):
    """Plot task loadings on one axis"""
    importance_vars = importance[0]
    importance_vals = [abs(i) + pad for i in importance[1].T]
    plot_loadings(ax,
                  importance_vals,
                  kind='line',
                  offset=.5,
                  plot_kws={
                      'alpha': 1,
                      'linewidth': 3
                  })
    # set up x ticks
    xtick_locs = np.arange(0.0, 2 * np.pi, 2 * np.pi / len(importance_vars))
    ax.set_xticks(xtick_locs)
    ax.set_xticks(xtick_locs + np.pi / len(importance_vars), minor=True)
    if xticklabels:
        if type(importance_vars[0]) == str:
            ax.set_xticklabels(importance_vars, y=.08, minor=True)
        else:
            ax.set_xticklabels(
                ['Fac %s' % str(i + 1) for i in importance_vars],
                y=.08,
                minor=True)
    # set up yticks
    if ymax:
        ax.set_ylim(top=ymax)
    ytick_locs = ax.yaxis.get_ticklocs()
    new_yticks = np.linspace(0, ytick_locs[-1], 7)
    ax.set_yticks(new_yticks)
    if yticklabels:
        labels = np.round(new_yticks, 2)
        replace_dict = {i: '' for i in labels[::2]}
        labels = [replace_dict.get(i, i) for i in labels]
        ax.set_yticklabels(labels)
    if legend:
        ax.legend(loc='upper center', bbox_to_anchor=(.5, -.15))
def visualize_importance(importance,
                         ax,
                         xticklabels=True,
                         yticklabels=True,
                         axes_linewidth=None,
                         label_size=10,
                         label_scale=0,
                         title=None,
                         ymax=None,
                         color='k'):
    importance_vars = importance[0]
    importance_vars = [shortened_factors.get(v, v) for v in importance_vars]
    if importance[1] is not None:
        importance_vals = [abs(i) for i in importance[1]]
        plot_loadings(ax,
                      importance_vals,
                      kind='line',
                      offset=.5,
                      colors=[color],
                      plot_kws={
                          'alpha': 1,
                          'linewidth': label_size / 4
                      })
    else:
        ax.set_yticks([])
    ax.grid(linewidth=label_size / 8)
    if axes_linewidth:
        plt.setp(list(ax.spines.values()), linewidth=axes_linewidth)

    # set up x ticks
    xtick_locs = np.arange(0.0, 2 * np.pi, 2 * np.pi / len(importance_vars))
    ax.set_xticks(xtick_locs)
    ax.set_xticks(xtick_locs + np.pi / len(importance_vars), minor=True)
    if xticklabels:
        if type(importance_vars[0]) != str:
            importance_vars = [str(i + 1) for i in importance_vars]
        scale = 1 + label_scale
        size = ax.get_position().expanded(scale, scale)
        ax2 = ax.get_figure().add_axes(size, zorder=2)
        for i, var in enumerate(importance_vars):
            arc_start = (i + .15) * 2 * np.pi / len(importance_vars)
            arc_end = (i + .85) * 2 * np.pi / len(importance_vars)
            curve = [
                .85 * np.cos(np.linspace(arc_start, arc_end, 100)),
                .85 * np.sin(np.linspace(arc_start, arc_end, 100))
            ]
            plt.plot(*curve, alpha=0)
            curvetext = CurvedText(
                x=curve[0][::-1],
                y=curve[1][::-1],
                text=var,  #'this this is a very, very long text',
                va='bottom',
                axes=ax2,
                fontsize=label_size)
            ax2.set_xlim([-1, 1])
            ax2.set_ylim([-1, 1])
            ax2.axis('off')

    if title:
        ax.set_title(title, fontsize=label_size * 1.5, y=1.1)
    # set up yticks
    if len(importance[1]) != 0:
        ax.set_ylim(bottom=0)
        if ymax is None:
            ymax = np.max(importance_vals) * 1.1
        ax.set_ylim(top=ymax)
        new_yticks = np.linspace(0, ymax, 7)
        ax.set_yticks(new_yticks)
        if yticklabels:
            labels = np.round(new_yticks, 2)
            replace_dict = {i: '' for i in labels[::2]}
            labels = [replace_dict.get(i, i) for i in labels]
            ax.set_yticklabels(labels)