1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
| import matplotlib.pyplot as plt import seaborn as sns from matplotlib.ticker import MultipleLocator, AutoMinorLocator
lats = [45, 23.5, 1, -23.5, -45] lon = 127.3845
nlats = len(lats) alts_lat = {} azis_lat = {} date_hr_lat = {}
for i, lat in enumerate(lats, 1): alts, azis, dates_hr = [], [], [] for hr in range(24): for min in range(0, 60, 1): date_hr = datetime.datetime(2017, 3, 20, hr, min, 0, tzinfo=KST) dates_hr.append(date_hr) alt = get_altitude(lat, lon, date_hr) azi = get_azimuth(lat, lon, date_hr) alts.append(alt) azis.append(azi)
date_hr_lat[i] = dates_hr alts = np.array(alts) alts_lat[i] = alts azis = np.array(azis) azis_lat[i] = azis
fig = plt.figure(figsize=(30,24)) axs = {}
for i, (lat) in enumerate(lats, 1): axs[i] = fig.add_subplot(5, nlats, i, projection='polar') axs[i].set_theta_zero_location("N") axs[i].set_theta_direction(-1)
axs[i].plot(np.deg2rad(azis_lat[i]), alts_lat[i], c="k", zorder=1) axs[i].scatter(np.deg2rad(azis_lat[i]), alts_lat[i], c=alts_lat[i], cmap="inferno", zorder=2, vmin=0, vmax=90)
axs[i].fill(np.deg2rad(azis_lat[i]), [0]*len(azis_lat[i]), "gray", alpha=0.5) axs[i].set_ylim(-80, 90) axs[i].set_title(f"{lat}" + " $^{\circ}$", fontdict={"fontsize":32, "fontweight":"bold"}, pad=16)
hrs = list(range(1440)) for i, (lat) in enumerate(lats, nlats+1): axs[i] = fig.add_subplot(5, nlats, i) axs[i].scatter(azis_lat[i-nlats], alts_lat[i-nlats], c=alts_lat[i-nlats], cmap="inferno", zorder=2, vmin=0, vmax=90) axs[i].xaxis.set_major_locator(MultipleLocator(180)) axs[i].xaxis.set_minor_locator(MultipleLocator(60)) axs[i].set_xlim(0, 360) axs[i].set_ylim(-90, 100) yticks = [-90, -60, -30, 0, 30, 60, 90] axs[i].set_yticks(yticks) axs[i].set_yticklabels(yticks) axs[i].tick_params(axis="both", labelsize=20) axs[i].fill_between(hrs, -90, 0, facecolor="gray", alpha=0.5) axs[i].set_xlabel("azimuthal angle (deg.)", fontdict={"fontsize":24, "fontweight":"bold"}, labelpad=12) if i == nlats+1: axs[i].set_ylabel("altitude A (deg.)", fontdict={"fontsize":24, "fontweight":"bold"}, labelpad=12)
hrs = list(range(1440)) for i, (lat) in enumerate(lats, 2*nlats+1): axs[i] = fig.add_subplot(5, nlats, i) axs[i].scatter(hrs, alts_lat[i-2*nlats], c=alts_lat[i-2*nlats], cmap="inferno", zorder=2, vmin=0, vmax=90) axs[i].xaxis.set_major_locator(MultipleLocator(180)) axs[i].xaxis.set_minor_locator(MultipleLocator(60)) axs[i].set_xlim(0, 1440) axs[i].set_ylim(-90, 100) xticks = [int(x//60) for x in axs[i].get_xticks()] axs[i].set_xticklabels(xticks) axs[i].set_xlabel("time (hour)", fontdict={"fontsize":24, "fontweight":"bold"}, labelpad=12) yticks = [-90, -60, -30, 0, 30, 60, 90] axs[i].set_yticks(yticks) axs[i].set_yticklabels(yticks) axs[i].tick_params(axis="both", labelsize=20) axs[i].fill_between(hrs, -90, 0, facecolor="gray", alpha=0.5) if i == 2*nlats+1: axs[i].set_ylabel("altitude A (deg.)", fontdict={"fontsize":24, "fontweight":"bold"}, labelpad=12)
for i, lat in enumerate(lats, 3*nlats+1): axs[i] = fig.add_subplot(5, nlats, i) irrs_pysolar = [] for j in range(len(date_hr_lat[i-(3*nlats)])): irr_pysolar = get_radiation_direct(date_hr_lat[i-(3*nlats)][j], alts_lat[i-(3*nlats)][j]) irrs_pysolar.append(irr_pysolar) axs[i].scatter(hrs, irrs_pysolar, c=irrs_pysolar, cmap="copper", zorder=2, vmin=0, vmax=1100) axs[i].xaxis.set_major_locator(MultipleLocator(180)) axs[i].xaxis.set_minor_locator(MultipleLocator(60)) axs[i].set_xlim(0, 1440) xticks = [int(x//60) for x in axs[i].get_xticks()] axs[i].set_xticklabels(xticks) axs[i].set_xlabel("time (hour)", fontdict={"fontsize":24, "fontweight":"bold"}, labelpad=12) axs[i].tick_params(axis="both", labelsize=20) axs[i].set_ylim(0, 1100) if i == 3*nlats+1: axs[i].set_ylabel("solar irradiation (W/m2)\n incl. diffuse irradiation", fontdict={"fontsize":24, "fontweight":"bold"}, labelpad=12)
for i, lat in enumerate(lats, 4*nlats+1): axs[i] = fig.add_subplot(5, nlats, i) irradiation = np.sin(np.deg2rad(alts_lat[i-(4*nlats)])) axs[i].scatter(hrs, irradiation, c=irradiation, cmap="copper", zorder=2, vmin=0, vmax=1) axs[i].xaxis.set_major_locator(MultipleLocator(180)) axs[i].xaxis.set_minor_locator(MultipleLocator(60)) axs[i].set_xlim(0, 1440) xticks = [int(x//60) for x in axs[i].get_xticks()] axs[i].set_xticklabels(xticks) axs[i].set_xlabel("time (hour)", fontdict={"fontsize":24, "fontweight":"bold"}, labelpad=12) axs[i].tick_params(axis="both", labelsize=20) axs[i].set_ylim(0, 1.2) if i == 4*nlats+1: axs[i].set_ylabel("projection " + "$cos(A)$", fontdict={"fontsize":24, "fontweight":"bold"}, labelpad=12)
fig.align_ylabels([axs[1], axs[6], axs[11], axs[16], axs[21]]) fig.tight_layout()
|