猿问

为什么 Seaborn 绘制两个图例,我如何删除一个并修复另一个?

当我运行下面显示的代码时,我得到一个包含 2 个图例的图形。我无法弄清楚为什么要绘制两个并且我无法删除其中一个。我的目标是保留图例之外的图例,删除图例内部的图例,并以某种方式停止切断图例右侧图例的奇怪裁剪。

我之前有一个问题问过类似的问题,但是通过使用 seaborns scatterplot 而不是 relplot 解决了这个问题。可悲的是,在该问题中有效的答案在这里都不起作用。如果这个问题是由绘制我试图制作的图形类型的“非常规”方式引起的,请告诉我。正确地做到这一点比破解解决方案要好...

  import matplotlib.pyplot as plt

    import seaborn as sns

    import numpy as np

    import pandas as pd



    #setup

    sns.set(font_scale=2)

    sns.set_context('poster')


    #figure and axes

    fig = plt.figure(figsize=(20,20))

    axs = {i:fig.add_subplot(330+i) for i in range(1,10)}





    #create random data

    r = np.random.randint

    N=10

    df = pd.DataFrame(columns=['No.','x1','x2','x3','y1','y2','y3'])

    for i in range(N):

        df.loc[i] = i+1,r(50,high=100),r(50,high=100),r(50,high=100),r(50,high=100),r(50,high=100),r(50,high=100)


    #create axes labels

    x_labels = ['x1','x2','x3']

    y_labels = ['y1','y2','y3']

    xy_labels = [(x,y) for y in y_labels for x in x_labels ]



    #plot on axes

    for i,(x_label,y_label) in enumerate(xy_labels):

        if i ==0:#if statement so only one of the plots has legend='full'

            a = sns.scatterplot(

                data=df,

                x=x_label,

                y=y_label,

                legend='full', #create the legend

                ax=axs[i+1],

                hue='No.',

                palette=sns.color_palette("hls", N)

            )


            fig.legend(bbox_to_anchor=(1, 0.7), loc=2, borderaxespad=0.) #Move the legend outside the plot

            a.legend_.remove() #attempt to remove the legend

        else:

            a = sns.scatterplot(

                data=df,

                x=x_label,

                y=y_label,

                legend=False,

                ax=axs[i+1],

                hue='No.',

                palette=sns.color_palette("hls", N)

            )


        #remove axes labels from specific plots

        if i not in [0,3,6]: axs[i+1].set_ylabel('')

        if i not in [6,7,8]: axs[i+1].set_xlabel('')


汪汪一只猫
浏览 386回答 1
1回答

红颜莎娜

您可以添加legend=False代码的最后一部分。#setupsns.set(font_scale=2)sns.set_context('poster')#figure and axesfig = plt.figure(figsize=(20,20))axs = {i:fig.add_subplot(330+i) for i in range(1,10)}#create axes labelsx_labels = ['x1','x2','x3']y_labels = ['y1','y2','y3']xy_labels = [(x,y) for y in y_labels for x in x_labels ]#plot on axesfor i,(x_label,y_label) in enumerate(xy_labels):    if i ==0:#if statement so only one of the plots has legend='full'        a = sns.scatterplot(            data=df,            x=x_label,            y=y_label,            legend='full', #create the legend            ax=axs[i+1],            hue='No.',            palette=sns.color_palette("hls", N)       )        fig.legend(bbox_to_anchor=(1, 0.7), loc=2, borderaxespad=0.) #Move the legend outside the plot        a.legend_.remove() #attempt to remove the legend    else:        a = sns.scatterplot(            data=df,            x=x_label,            y=y_label,            legend=False,            ax=axs[i+1],            hue='No.',            palette=sns.color_palette("hls", N)        )    #remove axes labels from specific plots    if i not in [0,3,6]: axs[i+1].set_ylabel('')    if i not in [6,7,8]: axs[i+1].set_xlabel('')#add line plots and set limits        for ax in axs.values():    sns.lineplot(x=range(50,100),y=range(50,100), ax=ax, linestyle='-', legend=False)    ax.set_xlim([50,100])    ax.set_ylim([50,100])fig.tight_layout()结果:
随时随地看视频慕课网APP

相关分类

Python
我要回答