【问题标题】:legends not print fully when multiple plots are plotted on same figure当在同一图形上绘制多个图时,图例未完全打印
【发布时间】:2020-09-17 03:06:03
【问题描述】:

我有如下代码在同一个图上绘制多个图

fig, ax = plt.subplots(figsize=(25, 10))
def wl_ratioplot(wavelength1,wavelength2, dataframe, x1=0.1,x2=1.5,y1=-500,y2=25000):
    a=dataframe[['asphalt_index','layer_thickness',wavelength1,wavelength2]].copy()
    sns.scatterplot(x=a[wavelength1]/a[wavelength2],y=a['layer_thickness'],data=a)
    ax.set_xlim(x1,x2)
    ax.set_ylim(y1,y2)
    leg = "{} vs {}".format(wavelength1,wavelength2)
    print(leg) #this line is only to see the variable legend has the proper content
    ax.legend(leg)
wl_ratioplot(wave_lengths[2],wave_lengths[0],dataframe=train_df_wo_outliers,x1=-.1,x2=3)
wl_ratioplot(wave_lengths[0],wave_lengths[1],dataframe=train_df_wo_outliers,x1=-.1,x2=3)
wl_ratioplot(wave_lengths[3],wave_lengths[1],dataframe=train_df_wo_outliers,x1=-.1,x2=3)
wl_ratioplot(wave_lengths[3],wave_lengths[0],dataframe=train_df_wo_outliers,x1=-.1,x2=3)
wl_ratioplot(wave_lengths[2],wave_lengths[1],dataframe=train_df_wo_outliers,x1=-.1,x2=3)

我得到的情节如下图所示,其中图例似乎分别是前 5 个字母,即使变量图例具有正确的内容

还有另一个类似的问题,解决方案是在变量图例中加上方括号。我用下面的代码试过这个。

fig, ax = plt.subplots(figsize=(25, 10))
def wl_ratioplot(wavelength1,wavelength2, dataframe, x1=0.1,x2=1.5,y1=-500,y2=25000):
    a=dataframe[['asphalt_index','layer_thickness',wavelength1,wavelength2]].copy()
    sns.scatterplot(x=a[wavelength1]/a[wavelength2],y=a['layer_thickness'],data=a)
    ax.set_xlim(x1,x2)
    ax.set_ylim(y1,y2)
    leg = "{} vs {}".format(wavelength1,wavelength2)
    print(leg)#this line is only to see the variable legend has the proper content
    ax.legend([leg])
wl_ratioplot(wave_lengths[2],wave_lengths[0],dataframe=train_df_wo_outliers,x1=-.1,x2=3)
wl_ratioplot(wave_lengths[0],wave_lengths[1],dataframe=train_df_wo_outliers,x1=-.1,x2=3)
wl_ratioplot(wave_lengths[3],wave_lengths[1],dataframe=train_df_wo_outliers,x1=-.1,x2=3)
wl_ratioplot(wave_lengths[3],wave_lengths[0],dataframe=train_df_wo_outliers,x1=-.1,x2=3)
wl_ratioplot(wave_lengths[2],wave_lengths[1],dataframe=train_df_wo_outliers,x1=-.1,x2=3)

现在我得到了完整的图例,但只有第一个图例如下图所示

谁能告诉我如何获得所有情节的完整图例?谢谢。

虚拟数据(图中的情节不匹配)

14nm    15nm    16nm    17nm    18nm    19nm    layer_thickness
1   2   3   4   5   6   0
1   2   3   4   5   6   0
3   5   7   9   11  13  5700
1   2   3   4   5   6   0
3   5   7   9   11  13  8600
1   2   3   4   5   6   0
3   5   7   9   11  13  5000
1   2   3   4   5   6   0
45  55  65  75  85  95  100
1   2   3   4   5   6   0
8   15  22  29  36  43  16600

wave_lengths=['15nm','16nm','14nm','18nm']

答案更新 根据 Quang Hoang 的回答。使用 matplotlib 和 sns.scatterplot 散点图的输出图片

【问题讨论】:

  • 只是好奇,为什么sns.scatterplot?你也可以分享一些数据吗?
  • 当前调用函数的方式似乎是在调用 wl_ratioplot 时覆盖现有的 ax.legend 而不是扩展图例
  • @QuangHoang, sns.scatterplot 因为它对我来说似乎很直观。但如果可以直接用 matplot 实现同样的效果,我可以使用它。添加了一些虚拟数据。
  • @KaranShishoo 我也这么认为,但我不知道如何解决?此外,当我使用不带方括号的变量leg 进行绘图时,所有图例都会打印(仅第一个字母)!

标签: python matplotlib legend


【解决方案1】:

plt 很自然:

def wl_ratioplot(wavelength1,wavelength2, dataframe, 
                 x1=0.1,x2=1.5,y1=-500,y2=25000,
                 ax=None):
    leg = "{} vs {}".format(wavelength1,wavelength2)
    
    # set the label here, and let plt deal with it 
    # also, you don't need to copy the dataframe:
    ax.scatter(x=dataframe[wavelength1]/dataframe[wavelength2],
               y=dataframe['layer_thickness'],label=leg)
    ax.set_xlim(x1,x2)
    ax.set_ylim(y1,y2)

fig, ax = plt.subplots(figsize=(25, 10))
wl_ratioplot(wave_lengths[2],wave_lengths[0],dataframe=df,x1=-.1,x2=3, ax=ax)
wl_ratioplot(wave_lengths[0],wave_lengths[1],dataframe=df,x1=-.1,x2=3, ax=ax)
wl_ratioplot(wave_lengths[3],wave_lengths[1],dataframe=df,x1=-.1,x2=3, ax=ax)
wl_ratioplot(wave_lengths[3],wave_lengths[0],dataframe=df,x1=-.1,x2=3, ax=ax)
wl_ratioplot(wave_lengths[2],wave_lengths[1],dataframe=df,x1=-.1,x2=3, ax=ax)
ax.legend()

输出:

【讨论】:

  • 谢谢。这行得通!但我仍然会使用 sns.scatterplot,因为 mat plot 散点图看起来很“笨拙”
【解决方案2】:

每次调用 wl_ratioplot 函数时,图例都会被重置为最终值。使用数组存储所有图例,然后通过循环访问它。

ax.legend([leg]) #it is resetting the legend after each call.

使用图例 = [];

legends.append([leg])

在所有函数调用之后,以不同的方式绘制图例

ax.legend(legends)

【讨论】:

  • 这行得通。但是,有没有办法在函数或绘图本身中做到这一点?
猜你喜欢
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多