我正在嘗試使用 Windrose 庫制作污染風玫瑰。我有 5 個站點,并希望為每個站點創建一個圖形(由列名末尾的四位數字表示),但每個圖形將有 12 個污染風玫瑰子圖,對應于每個月。我有一個作業代碼,但我必須為每個站點單獨運行它,并且想要創建一個回圈,允許我在一次運行中為每個站點制作一個數字。問題是,為了每個月制作一個子圖,我有一個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 檔案的鏈接: https ://drive.google.com/file/d/1CanA2IlCo0AotnX_uEafw2vfIW38rVvd/view?usp=sharing
目前代碼只產生一個數字,這意味著第一個數字有問題for loop
。
uj5u.com熱心網友回復:
我稍微改變了回圈(我切換了回圈,將月份回圈嵌套在站點回圈中,并將這些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 個子圖(每個月一個)。希望這對您有用(并且是您正在尋找的)。
這背后的邏輯是您需要每個站點的圖,以及圖中每個月的子圖。正如您所寫的那樣,您實際上是在撰寫“每個月的子圖,并且在子圖中,每個站點都有一個條形圖”,這與我認為您想要的(從您的問題)以及為什么只有一個數字相反.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/470699.html