具有seaborn或pyplot的Python子图

时间:2019-01-31 16:19:04

标签: python subplot

我是一名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 :(得分:0)

这就是我想出的!只是两个问题:

  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