在一个循环代码中创建多个 windrose 子图

create multiple windrose subplots in one loop code

我正在尝试使用 Windrose 库制作污染 windroses。我有 5 个站点,想为每个站点创建一个图形(由列名称末尾的四位数字表示),但每个图形都有 12 个对应于每个月的污染 windrose 子图。我有一个工作代码,但我必须 运行 为每个站点单独设置它,并且想要创建一个循环,让我可以在一个 运行 中为每个站点制作一个图形。问题是,为了每个月制作一个子图,我有一个 for loop 干扰了另一个循环,该循环将允许在一个 运行 中准备多个数字。这是代码:

import pandas as pd
from windrose import WindroseAxes
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
wr = pd.read_csv('')

wr["date"] = wr["date"].astype("M8")
wr["Month"] = wr.date.dt.month

month_dict = {1: "January", 2: "February", 3: "March", 4: "April",
               5: "May", 6: "June", 7: "July", 8: "August", 9: "September",
               10: "October", 11: "November", 12: "December"}
wr["Month"] = wr["Month"].map(month_dict)
# Filter
wr = wr.set_index("date")
wr = wr.between_time('6:00', '18:00') #day

xval = ["dir_3168", "dir_5405", "dir_5409", "dir_5407", "dir_5408", "dir_3135"]
yval = ["pm25_3168", "pm25_5405", "pm25_5409", "pm25_5407", "pm25_5408", "pm25_3135"]
fnames_day = ['Banning_PM25_monthly_day.png','Torres_PM25_monthly_day.png','NTB_PM25_monthly_day.png', 
          'BB_PM25_monthly_day.png','SB_PM25_monthly_day.png']

months = [v for k,v in month_dict.items()]
nrows, ncols = 2,6 
fig = plt.figure(figsize=(30, 10))
bins=np.arange(0, 60, 12) #pm2.5
fig.tight_layout()

for i, month in enumerate(months):
    d =  wr[wr["Month"].eq(month)].reset_index(drop=True)
    ax = fig.add_subplot(nrows, ncols, i + 1, projection="windrose")
    ax.set_title(month.capitalize(),fontsize=20, weight='bold')
    for x,y,fname in zip(xval,yval,fnames_day):
        ax.bar(d[x], d[y],
           normed=True, opening=0.8,
           bins=bins, cmap=cm.rainbow,
           nsector=16)
        ax.set_xticklabels(['E', 'N-E', 'N', 'N-W', 'W', 'S-W', 'S', 'S-E'],fontsize=18)
        #ax.set_yticks(np.arange(11, 77, step=11))
        ax.tick_params(axis="y", labelsize=18)
        #ax.figure.savefig(fname, dpi=400)

这是 csv 文件的 link: https://drive.google.com/file/d/1CanA2IlCo0AotnX_uEafw2vfIW38rVvd/view?usp=sharing

目前代码只生成一个数字,这意味着第一个数字有问题for loop

我稍微改变了循环(我调换了循环,将月循环嵌套在站点循环中,并将 fig 行添加到循环中):

#...
months = [v for k,v in month_dict.items()]
nrows, ncols = 2,6 

for x, y, fname in zip(xval, yval, fnames_day):
    fig = plt.figure(figsize=(30, 10))
    bins=np.arange(0, 60, 12) #pm2.5
    fig.tight_layout()
    for i, month in enumerate(months):
        d =  wr[wr["Month"].eq(month)].reset_index(drop=True)
        ax = fig.add_subplot(nrows, ncols, i + 1, projection="windrose")
        ax.set_title(month.capitalize(),fontsize=20, weight='bold')
        ax.bar(d[x], d[y],
           normed=True, opening=0.8,
           bins=bins, cmap=cm.rainbow,
           nsector=16)
        ax.set_xticklabels(['E', 'N-E', 'N', 'N-W', 'W', 'S-W', 'S', 'S-E'],fontsize=18)
        #ax.set_yticks(np.arange(11, 77, step=11))
        ax.tick_params(axis="y", labelsize=18)
    ax.figure.savefig(fname, dpi=400)
    #plt.show()

我的输出是 5 个数字和 12 个子图(每个月一个)。希望这对你有用(并且是你正在寻找的)。

这背后的逻辑是,您想要每个网站的图表,以及图表中每个月的子图。正如你所写的,你实际上是在写“每个月的一个子图,在子图中,每个站点的一个栏”,这与我认为你想要的(根据你的问题)以及为什么你只有一个数字相反.