Сюжеты Python с Seaborn или Pyplot - PullRequest
0 голосов
/ 31 января 2019

Я программист на R, изучающий Python и находящий построение графиков на Python гораздо более сложным, чем R.

Я пытаюсь написать следующую функцию, но безуспешно.Может ли кто-нибудь помочь?

import pandas as pd

#example data
df1 = pd.DataFrame({
        'PC1':[-2.2,-2.0,2.04,0.97],
        'PC2':[0.5,-0.6,0.9,-0.5],
        'PC3':[-0.1,-0.2,0.2,0.8],
        'f1':['a','a','b','b'],
        'f2':['x','y','x','y'],
        'f3':['k','g','g','k']
        })

def drawPCA(df,**kwargs):
    """Produce a 1x3 subplots of scatterplot; each subplot includes two PCs with
    no legend, e.g. subplot 1 is PC1 vs PC2. The legend is on the upper middle of 
    the figure.
    Parameters
    ----------
    df: Pandas DataFrame
        The first 3 columns are the PCs, followed by sample characters.
    kwargs
        To specify hue,style,size, etc. if the plotting uses seaborn.scatterplot; 
        or c,s,etc. if using pyplot scatter
    Example
    ----------
    drawPCA(df1, hue="f1")
    drawPCA(df1, c="f1", s="f2") #if plotting uses plt.scatter
    drawPCA(df1, hue="f1", size="f2",style="f3")
    or more varialbes passable to the actual plotting function
    """    

1 Ответ

0 голосов
/ 01 февраля 2019

Вот что я придумала!Всего два вопроса:

  1. есть ли параметр для установки легенды по горизонтали, вместо использования ncol?
  2. , как предотвратить отображение фигуры при запуске такой функции, какэто?
fig,ax=drawPCA(df1,hue="f1",style="f2",size="f3")
#may do more changing on the figure.

Вот функция:

def drawPCA2(df,**kwargs):
    import matplotlib.pyplot as plt
    import seaborn as sns
    from matplotlib.figure import figaspect

    nUniVals=sum([df[i].unique().size for i in kwargs.values()])
    nKeys=len(kwargs.keys())

    w, h = figaspect(1/3)
    fig1, axs = plt.subplots(ncols=3,figsize=(w,h))
    fig1.suptitle("All the PCs")
    sns.scatterplot(x="PC1",y="PC2",data=df,legend=False,ax=axs[0],**kwargs)
    sns.scatterplot(x="PC1",y="PC3",data=df,legend=False,ax=axs[1],**kwargs)
    sns.scatterplot(x="PC2",y="PC3",data=df,ax=axs[2],label="",**kwargs)
    handles, labels = axs[2].get_legend_handles_labels()
    fig1.legend(handles, labels, loc='lower center',bbox_to_anchor=(0.5, 0.85), ncol=nUniVals+nKeys)  
    axs[2].get_legend().remove()
    fig1.tight_layout(rect=[0, 0.03, 1, 0.9])    

    return fig1,axs

enter image description here

...