Matplotlib 使用嵌套的 for 循环绘制子图。
Matplotlib 使用嵌套的 for 循环绘制子图。
第一次发帖,对错误提前道歉。
我想要为嵌套的for循环创建一个matplotlib子图。
我的数据是广告数据,包含关键词、点击量、出价、星期几等列。
我想为每个关键词创建8个图,其中x轴为出价,y轴为点击量。
第一个图应该包含该关键词的出价和点击量,另外7个图应该分别显示每天的出价和点击量(每天一个图)。
目前,我能够将第一个图添加到子图网格中(但格式看起来很奇怪),而其他7个图则分别显示,而不是显示在子图中。我在下面的代码中包含了一个虚拟数据框。
我想要做的事情:
- 修复第一个图的格式
- 希望星期一的图在第二个子图位置上
非常感谢任何和所有的建议。谢谢!
我的代码:
#创建一个唯一的日期列表 day_list = df['day_of_week'].unique() #为每个关键词按星期几创建一个图 def keyword_plots(x, y): #创建一个字典,使每天在图的子图上有一个位置 ndict = {'星期一': 2, '星期二': 3, '星期三': 4, '星期四': 5, '星期五': 6, '星期六' : 7, '星期日' :8} #处理颜色 color_labels = y['day_of_week'].unique() rgb_values = sns.color_palette("husl", 7) color_map = dict(zip(color_labels, rgb_values)) #循环遍历每个关键词并将其添加到图中(第一个位置) for each in x: #为每个关键词创建子集 subset = y[y["keyword"]==each][["clicks","bid", "day_of_week"]] #为每个关键词创建一个有8个空间的图 fig, axes = plt.subplots(2, 4, figsize=(20, 8)) fig.tight_layout() #将此关键词的图添加到第一个子图位置 ax=fig.add_subplot(4,4,1) plt.scatter(subset['bid'], subset['clicks'], c = subset['day_of_week'].map(color_map), alpha=0.5) #标签 plt.title(each) plt.xlabel("出价") plt.ylabel("点击量") #趋势线 z = np.polyfit(subset["bid"], subset['clicks'], 1) p = np.poly1d(z) pylab.plot(subset['bid'],p(subset['bid']),"r--") plt.show() #循环遍历每个星期几,并为每个星期每个关键词创建一个图(共7个,对应星期一到星期日) for i in day_list: #筛选数据 day_sub = subset[subset["day_of_week"]==i][["clicks","bid", "day_of_week"]] #将图添加到对应的星期几的位置(在ndict中) ax=fig.add_subplot(4, 4, ndict[i]) #创建图 plt.scatter(day_sub['bid'], day_sub['clicks'], c = day_sub['day_of_week'].map(color_map), alpha=0.5) #绘制标签 plt.title(each + " " + i) plt.xlabel("出价") plt.ylabel("点击量") #趋势线 z = np.polyfit(day_sub["bid"], day_sub['clicks'], 1) p = np.poly1d(z) pylab.plot(day_sub['bid'],p(day_sub['bid']),"r--") plt.show() keyword_plots(list_of_keywords_I_want, keywords_df)
Matplotlib subplot using nested for loop问题的原因是由于使用了嵌套的for循环来创建子图,导致子图的坐标轴重叠。解决方法是使用tight_layout()
函数来自动调整子图的间距,以确保标签不重叠。
在给定的代码中,tight_layout()
函数被用来调整子图的间距,使得标签不会重叠。具体来说,以下是解决问题的步骤:
1. 导入所需的库和模块,生成随机数据。这些步骤不是解决问题的关键,只是为了提供一个完整的环境。
2. 在函数keyword_plots()
中,创建了一个字典ndict
,用于将每个星期几映射到子图的位置。
3. 使用sns.color_palette()
函数生成一个颜色映射字典color_map
,用于将每个星期几映射到不同的颜色。
4. 创建一个包含8个子图的图形对象fig
,并将其传递给变量axes
。通过设置figsize=(20, 8)
来指定子图的大小。
5. 使用axes[0,0]
绘制第一个子图,即所有关键字的总体趋势。
6. 使用axes[ndict[i] // 4, ndict[i] % 4]
在每个子图的位置绘制每个关键字在每个星期几的趋势。
7. 在每个子图中添加标签和趋势线。
8. 调用plt.show()
显示图形。
9. 最后,调用keyword_plots()
函数,传递关键字列表和数据框作为参数,生成包含所有子图的图形。
这样,就实现了使用嵌套的for循环创建子图,并通过调整子图间距来解决子图坐标轴重叠的问题。
虽然问题的解决方法相对简单,但在问题的提问者询问如何调整子图间距时,提供了一些参考链接,可以进一步了解如何通过调整子图间距来解决标签重叠的问题。