【疑难杂症】根据指定行列生成subplots子图坐标,解决Seaborn子图覆盖问题


手动反爬虫: 原博地址 https://blog.csdn.net/lys_828/article/details/123898527

 知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息

1 问题说明

在进行seaborn绘制分类箱型图时,发现批量生成的图形会自动追加到第一个图中,如下
在这里插入图片描述
如果是单独进行各区域数据的绘制,都可以正常出图,如下(比如选择朝阳区数据)
在这里插入图片描述
接着把数据换成海淀区,输出结果如下
在这里插入图片描述

2 问题解决

2.1 Seaborn子图覆盖问题解决

由于是通过Seaborn进行绘制箱型图,要解决图形不覆盖的问题,就只能进行图形的分配,即子图的绘制,把每一个图形的输出结果都放在一个子图中进行显示,这样最终的结果就不会被覆盖了。

首先子图的绘制,可以参考之前写的博客,Matplotlib库绘图的子图绘制绘制的方式有多种,这里采用subplots方法进行子图的绘制,所以要先清楚该方法的输出的信息。

比如指定整个画布分成6个子图,子图按照2行3列的方式排列,其中subplots中的第一个参数就是代表行,第二个参数代表列
在这里插入图片描述
获取第一个子图,可以使用ax[0][0],也可以使用ax[(0,0)],代码及输出结果如下
在这里插入图片描述
进一步就是如何把子图加载到boxplot中,借助ax参数,就是指定每次绘制的子图的位置,代码如下

fig,ax = plt.subplots(2,3) 
df = data_0[data_0['dist'] == '朝阳']
sns.boxplot(x = 'dist',y = 'price',data = df,hue = 'school',ax=ax[(0,0)])
df = data_0[data_0['dist'] == '海淀']
sns.boxplot(x = 'dist',y = 'price',data = df,hue = 'school',ax=ax[(0,1)])

输出结果如下(由此可以发现只要是指定ax中子图的具体坐标就可以解决Seaborn绘制子图覆盖的问题)
在这里插入图片描述
如果是接下来手动指定子图的坐标,直接通过批量赋值后修改一下对应的坐标值就可以将6个子图全部绘制出来,代码如下

fig,ax = plt.subplots(2,3,figsize=(12,8)) 
df = data_0[data_0['dist'] == '朝阳']
sns.boxplot(x = 'dist',y = 'price',data = df,hue = 'school',ax=ax[(0,0)])
df = data_0[data_0['dist'] == '海淀']
sns.boxplot(x = 'dist',y = 'price',data = df,hue = 'school',ax=ax[(0,1)])
df = data_0[data_0['dist'] == '丰台']
sns.boxplot(x = 'dist',y = 'price',data = df,hue = 'school',ax=ax[(0,2)])
df = data_0[data_0['dist'] == '西城']
sns.boxplot(x = 'dist',y = 'price',data = df,hue = 'school',ax=ax[(1,0)])
df = data_0[data_0['dist'] == '东城']
sns.boxplot(x = 'dist',y = 'price',data = df,hue = 'school',ax=ax[(1,1)])
df = data_0[data_0['dist'] == '石景山']
sns.boxplot(x = 'dist',y = 'price',data = df,hue = 'school',ax=ax[(1,2)])

输出结果如下。(可以解决Seaborn绘制子图覆盖的问题,但是可以发现这种操作会有大量的代码重复)
在这里插入图片描述

2.2 指定行列生成subplots子图坐标问题解决

观察重复的代码中,有变化的只有两处,一个就是城区的选择,还有一个就是子图坐标的设置。其中前者很好进行处理,就是通过unique方法直接获取对应的区域数据即可,代码及输出结果如下。
在这里插入图片描述
第二个问题就是要充分考虑子图坐标的特点:坐标的值,最小的是从(0,0)开始,最大的就是比指定行列数值都小1(比如上图指定的是2行3列,最后的子图坐标就是[(1,2)],按照这个特点进行子图坐标的生成,直接给出封装好的函数,代码如下。

def generate_axis(rows,cols):
    return [(row,col) for row in range(rows) for col in range(cols)]
generate_axis(2,3)

输出结果如下(封装函数的好处在于之后再次遇到此类问题,就可以直接拿来使用,不用再多余进行重新设置,这里还进行了3行2列坐标的生成,验证结果输出无误)
在这里插入图片描述

2.3 所有问题解决

将2.1和2.2的问题解决方法进行结合,就可以完美的实现要求,代码如下

fig,ax = plt.subplots(2,3,figsize=(12,8)) 
nums = generate_axis(2,3)
zones = data_0.dist.unique()
for i in range(len(zones)):
    df = data_0[data_0['dist'] == zones[i]]
    sns.boxplot(x = 'dist',y = 'price',data = df,hue = 'school',ax = ax[nums[i]])

输出结果如下(顺利解决问题,完结撒花✿✿ヽ(°▽°)ノ✿)
在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用plt.subplots()创建的子图默认是不会被其他子图遮挡的。每个子图都会被放置在一个独立的坐标轴上,它们之间不会相互遮挡。这意味着您可以在同一个画布上同时显示多个子图,而不会出现遮挡的问题。您可以使用plt.subplots_adjust()函数来调整子图之间的间距和位置,以确保它们适合您的需求。如果您希望某些子图更加显眼,可以使用top参数来增加它们所占的版面高度,使其在整个画布中更加突出。这样就可以避免子图之间的遮挡问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Matplotlib:plt.tight_layout()主标题(plt.suptitle)被覆盖](https://blog.csdn.net/Strive_For_Future/article/details/115052014)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [matplotilb中fig,ax = plt.subplots()的使用](https://download.csdn.net/download/weixin_38707153/13750992)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【疑难杂症】根据指定行列生成subplots子图坐标解决Seaborn子图覆盖问题](https://blog.csdn.net/lys_828/article/details/123898527)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lys_828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值