Matplotlib 使用嵌套的 for 循环绘制子图。

10 浏览
0 Comments

Matplotlib 使用嵌套的 for 循环绘制子图。

第一次发帖,对错误提前道歉。

我想要为嵌套的for循环创建一个matplotlib子图。

我的数据是广告数据,包含关键词、点击量、出价、星期几等列。

我想为每个关键词创建8个图,其中x轴为出价,y轴为点击量。

第一个图应该包含该关键词的出价和点击量,另外7个图应该分别显示每天的出价和点击量(每天一个图)。

目前,我能够将第一个图添加到子图网格中(但格式看起来很奇怪),而其他7个图则分别显示,而不是显示在子图中。我在下面的代码中包含了一个虚拟数据框。

我想要做的事情:

  1. 修复第一个图的格式
  2. 希望星期一的图在第二个子图位置上

非常感谢任何和所有的建议。谢谢!

我的代码:

#创建一个唯一的日期列表
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)

0
0 Comments

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循环创建子图,并通过调整子图间距来解决子图坐标轴重叠的问题。

虽然问题的解决方法相对简单,但在问题的提问者询问如何调整子图间距时,提供了一些参考链接,可以进一步了解如何通过调整子图间距来解决标签重叠的问题。

0