def plot_poincare_disc()

in poincare_maps.py [0:0]


def plot_poincare_disc(x, labels=None, title_name=None,
    labels_name='labels', labels_order=None, labels_pos=None, labels_text=None,
                       file_name=None, coldict=None,
                       d1=4.5, d2=4.0, fs=9, ms=20,
                       u=None, v=None, alpha=1.0,
                       col_palette=plt.get_cmap("tab10"), print_labels=True,
                       bbox=(1.3, 0.7), leg=True, ft='pdf'):    

    idx = np.random.permutation(len(x))
    df = pd.DataFrame(x[idx, :], columns=['pm1', 'pm2'])
    
    fig = plt.figure(figsize=(d1, d2))
    ax = plt.gca()
    circle = plt.Circle((0, 0), radius=1,  fc='none', color='black')
    ax.add_patch(circle)
    ax.plot(0, 0, '.', c=(0, 0, 0), ms=4)
    if title_name:
        ax.set_title(title_name, fontsize=fs)

    if not (labels is None):
        df[labels_name] = labels[idx]
        if labels_order is None:
            labels_order = np.unique(labels)        
        if coldict is None:
            coldict = dict(zip(labels_order, col_palette[:len(labels)]))
        sns.scatterplot(x="pm1", y="pm2", hue=labels_name, 
                        hue_order=labels_order,
                        palette=coldict,
                        alpha=alpha, edgecolor="none",
                        data=df, ax=ax, s=ms)
        
        if leg:
            ax.legend(fontsize=fs, loc='outside', bbox_to_anchor=bbox, facecolor='white')
        else:
            ax.legend_.remove()
            
    else:
        sns.scatterplot(x="pm1", y="pm2",
                        data=df, ax=ax, s=ms)

        if leg == False:
            ax.legend_.remove()

    if not (u is None):     
        a, b = get_geodesic_parameters(u, v)        
        circle_geo = plt.Circle((-a/2, -b/2), radius=np.sqrt(a**2/4 + b**2/4 - 1),  fc='none', color='grey')
        ax.add_patch(circle_geo)

    fig.tight_layout()
    ax.axis('off')
    ax.axis('equal') 

    if print_labels:
        if labels_text is None:
            labels_list = np.unique(labels)
        else:
            labels_list = np.unique(labels_text)
        if labels_pos is None:  
            labels_pos = {}  
            for l in labels_list:
        #         i = np.random.choice(np.where(labels == l)[0])
                ix_l = np.where(labels == l)[0]
                Dl = poincare_distance(th.DoubleTensor(x[ix_l, :])).numpy()
                i = ix_l[np.argmin(Dl.sum(axis=0))]
                labels_pos[l] = i

        for l in labels_list:    
            ax.text(x[labels_pos[l], 0], x[labels_pos[l], 1], l, fontsize=fs)

    ax.set_ylim([-1.01, 1.01])
    ax.set_xlim([-1.01, 1.01]) 

    plt.tight_layout()

    if file_name:
        if ft == 'png':            
            plt.savefig(file_name + '.' + ft, format=ft, dpi=300)
        else:
            plt.savefig(file_name + '.' + ft, format=ft)

    return labels_pos