Draw a horizontal line line at specific position/annotate a Facetgrid in seaborn

前端 未结 4 764
北恋
北恋 2021-02-05 07:07

A have produced a boxplot with Facetgrid in seaborn the following way

# Import the dataset
tips = sns.load_dataset(\"tips\")

# Plot using Facegrid, separated by         


        
相关标签:
4条回答
  • 2021-02-05 07:43

    You can get a list of axes used in the FacetGrid using FacetGrid.axes which returns the axes used. You can then do all of the normal matplotlib operations using these axes, such as axhline for horizontal lines, or plt.text for putting text on the axes:

    import seaborn as sns
    import matplotlib.pyplot as plt
    tips = sns.load_dataset("tips")
    
    # Plot using Facegrid, separated by smoke
    plt.style.use('ggplot')
    g = sns.FacetGrid(tips, col="smoker", size=5, aspect=1.5)
    g.map(sns.boxplot, "sex", "total_bill", palette='viridis', order=['Male', 'Female'])
    
    ax1, ax2 = g.axes[0]
    
    ax1.axhline(10, ls='--')
    ax2.axhline(30, ls='--')
    
    ax1.text(0.5,25, "Some text")
    ax2.text(0.5,25, "Some text")
    
    plt.show()
    

    0 讨论(0)
  • 2021-02-05 07:48

    Additionally, if you have a bunch of grids that you want to add one horizontal line (say at y=10) to all then you can just "map" the "plt.axhline" with your grid object:

    import seaborn as sns
    import matplotlib.pyplot as plt
    tips = sns.load_dataset("tips")
    # Plot using Facegrid, separated by smoke
    plt.style.use('ggplot')
    g = sns.FacetGrid(tips, col="smoker", size=5, aspect=1.5)
    g.map(sns.boxplot, "sex", "total_bill", palette='viridis', order=['Male', 'Female'])
    
    g.map(plt.axhline, y=10, ls='--', c='red')
    
    0 讨论(0)
  • 2021-02-05 08:03

    There is axhline and hlines. Simple example:

    chart = sns.relplot(x="x", y="y", kind="line", data=df)
    
    chart.axes[0][0].axhline(y = 10, color='black', linewidth=2, alpha=.7)
    chart.axes[0][0].hlines( y = 20, color='black', linewidth=2, alpha=.7, 
                             xmin = 30, xmax = 50) 
    

    Seems like hlines allows for min-max (documentation) but axhline doesn't.

    0 讨论(0)
  • 2021-02-05 08:04

    Just add to the top answer, if you want do the same thing with figures in cols.

    g = sns.FacetGrid(df_long, col="variable", size=5, aspect=1.5,col_wrap=1,sharey=False)
    # df_long is a long table with 3 variables
    g.map(sns.boxplot, "label", "value", palette='Set2')
    g.axes[0].axhline(1, ls='--',c='r')
    g.axes[1].axhline(1, ls='--',c='r')
    g.axes[2].axhline(0.5, ls='--',c='r')
    g.map(plt.xticks, rotation=70) 
    plt.show()
    

    result

    0 讨论(0)
提交回复
热议问题