我使用相同的代码创建下图中的每个子图,我无法理解为什么其中一个子图缺少网格线。
奇怪的是,我可以在事实之后添加网格线:
In [18]: ax2b Out[18]: <AxesSubplot:title={'center':'12:10-12:16 (after 13:00 PST Oct 26th)'}> In [19]: ax2b.xaxis.grid(which='major'); fig Out[19]:
但这正是我的脚本的工作原理,所以我不明白为什么(2,2)处的子图被忽略了。
我已经尽了最大努力来排除拼写错误和错误。以下是用于生成绘图的脚本(抱歉,数据未包括在内):
import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib import ticker run5 = combine_run5_data() pdtpst = '2022-10-26T13:00' colname = 'Licor_CO2' cycle1a = run5[:pdtpst].between_time('05:00', '05:35').groupby(lambda idx: idx.dayofyear) cycle2a = run5[:pdtpst].between_time('11:00', '11:35').groupby(lambda idx: idx.dayofyear) cycle3a = run5[:pdtpst].between_time('17:00', '17:35').groupby(lambda idx: idx.dayofyear) cycle4a = run5[:pdtpst].between_time('23:00', '23:35').groupby(lambda idx: idx.dayofyear) cycle1b = run5[pdtpst:].between_time('06:00', '06:35').groupby(lambda idx: idx.dayofyear) cycle2b = run5[pdtpst:].between_time('12:00', '12:35').groupby(lambda idx: idx.dayofyear) cycle3b = run5[pdtpst:].between_time('18:00', '18:35').groupby(lambda idx: idx.dayofyear) cycle4b = run5[pdtpst:].between_time('00:00', '00:35').groupby(lambda idx: idx.dayofyear) nrows, ncols = 4, 2 fig = plt.figure(figsize=(6*ncols,3*nrows), constrained_layout=True) fig.suptitle('Run 5 drain cycle flagging (pink=active, blue=recovery)') fig.supylabel('LI-COR carbon dioxide data, normalized to 0-1') fig.supxlabel('Pacific Standard Time (UTC-0800)') xmajor = 5 # minutes xminor = 1 # minutes ax1a = fig.add_subplot(nrows, ncols, 1) ax1b = fig.add_subplot(nrows, ncols, 2) ax2a = fig.add_subplot(nrows, ncols, 3) ax2b = fig.add_subplot(nrows, ncols, 4) ax3a = fig.add_subplot(nrows, ncols, 5) ax3b = fig.add_subplot(nrows, ncols, 6) ax4a = fig.add_subplot(nrows, ncols, 7) ax4b = fig.add_subplot(nrows, ncols, 8) for doy, grp in cycle1a: grp.index -= grp.index.floor('D') data = grp[colname] / max(grp[colname]) ax1a.plot(data.index, data) ax1a.set_title('5:10-5:16 (before 13:00 PST Oct 26th)') ax1a.set_xlim(min(data.index).value, max(data.index).value) ax1a.yaxis.grid(which='major') ax1a.xaxis.grid(which='both') ax1a.xaxis.set_major_locator(ticker.MultipleLocator(1e9*60*xmajor)) ax1a.xaxis.set_minor_locator(ticker.MultipleLocator(1e9*60*xminor)) ax1a.xaxis.set_major_formatter(lambda x,p: pd.Timestamp(x).strftime('%H:%M')) ax1a.axvspan(pd.Timedelta('05:10:00').value, # HINT requires hh:mm:ss format pd.Timedelta('05:16:00').value, alpha=0.5, color='pink') ax1a.axvspan(pd.Timedelta('05:16:00').value, pd.Timedelta('05:22:00').value, alpha=0.8, color='skyblue') for doy, grp in cycle1b: grp.index -= grp.index.floor('D') data = grp[colname] / max(grp[colname]) ax1b.plot(data.index, data) ax1b.set_title('6:10-6:16 (after 13:00 PST Oct 26th)') ax1b.set_xlim(min(data.index).value, max(data.index).value) ax1b.yaxis.grid(which='major') ax1b.xaxis.grid(which='both') ax1b.xaxis.set_major_locator(ticker.MultipleLocator(1e9*60*xmajor)) ax1b.xaxis.set_minor_locator(ticker.MultipleLocator(1e9*60*xminor)) ax1b.xaxis.set_major_formatter(lambda x,p: pd.Timestamp(x).strftime('%H:%M')) ax1b.axvspan(pd.Timedelta('06:10:00').value, # HINT requires hh:mm:ss format pd.Timedelta('06:16:00').value, alpha=0.5, color='pink') ax1b.axvspan(pd.Timedelta('06:16:00').value, pd.Timedelta('06:22:00').value, alpha=0.8, color='skyblue') for doy, grp in cycle2a: grp.index -= grp.index.floor('D') data = grp[colname] / max(grp[colname]) ax2a.plot(data.index, data) ax2a.set_title('11:10-11:16 (before 13:00 PST Oct 26th)') ax2a.set_xlim(min(data.index).value, max(data.index).value) ax2a.yaxis.grid(which='major') ax2a.xaxis.grid(which='both') ax2a.xaxis.set_major_locator(ticker.MultipleLocator(1e9*60*xmajor)) ax2a.xaxis.set_minor_locator(ticker.MultipleLocator(1e9*60*xminor)) ax2a.xaxis.set_major_formatter(lambda x,p: pd.Timestamp(x).strftime('%H:%M')) ax2a.axvspan(pd.Timedelta('11:10:00').value, # HINT requires hh:mm:ss format pd.Timedelta('11:16:00').value, alpha=0.5, color='pink') ax2a.axvspan(pd.Timedelta('11:16:00').value, pd.Timedelta('11:22:00').value, alpha=0.8, color='skyblue') #### XXXX this one doesn't plot correctly ############### for doy, grp in cycle2b: grp.index -= grp.index.floor('D') data = grp[colname] / max(grp[colname]) ax2b.plot(data.index, data) ax2b.set_title('12:10-12:16 (after 13:00 PST Oct 26th)') ax2b.set_xlim(min(data.index).value, max(data.index).value) ax2b.yaxis.grid(which='major') ax2b.xaxis.grid(which='both') ax2b.xaxis.set_major_locator(ticker.MultipleLocator(1e9*60*xmajor)) ax2b.xaxis.set_minor_locator(ticker.MultipleLocator(1e9*60*xminor)) ax2b.xaxis.set_major_formatter(lambda x,p: pd.Timestamp(x).strftime('%H:%M')) ax2b.axvspan(pd.Timedelta('12:10:00').value, # HINT requires hh:mm:ss format pd.Timedelta('12:16:00').value, alpha=0.5, color='pink') ax2b.axvspan(pd.Timedelta('12:16:00').value, pd.Timedelta('12:22:00').value, alpha=0.8, color='skyblue') ########################################################## for doy, grp in cycle3a: grp.index -= grp.index.floor('D') data = grp[colname] / max(grp[colname]) ax3a.plot(data.index, data) ax3a.set_title('17:10-17:16 (before 13:00 PST Oct 26th)') ax3a.set_xlim(min(data.index).value, max(data.index).value) ax3a.yaxis.grid(which='major') ax3a.xaxis.grid(which='both') ax3a.xaxis.set_major_locator(ticker.MultipleLocator(1e9*60*xmajor)) ax3a.xaxis.set_minor_locator(ticker.MultipleLocator(1e9*60*xminor)) ax3a.xaxis.set_major_formatter(lambda x,p: pd.Timestamp(x).strftime('%H:%M')) ax3a.axvspan(pd.Timedelta('17:10:00').value, # HINT requires hh:mm:ss format pd.Timedelta('17:16:00').value, alpha=0.5, color='pink') ax3a.axvspan(pd.Timedelta('17:16:00').value, pd.Timedelta('17:22:00').value, alpha=0.8, color='skyblue') for doy, grp in cycle3b: grp.index -= grp.index.floor('D') data = grp[colname] / max(grp[colname]) ax3b.plot(data.index, data) ax3b.set_title('18:10-18:16 (after 13:00 PST Oct 26th)') ax3b.set_xlim(min(data.index).value, max(data.index).value) ax3b.yaxis.grid(which='major') ax3b.xaxis.grid(which='both') ax3b.xaxis.set_major_locator(ticker.MultipleLocator(1e9*60*xmajor)) ax3b.xaxis.set_minor_locator(ticker.MultipleLocator(1e9*60*xminor)) ax3b.xaxis.set_major_formatter(lambda x,p: pd.Timestamp(x).strftime('%H:%M')) ax3b.axvspan(pd.Timedelta('18:10:00').value, # HINT requires hh:mm:ss format pd.Timedelta('18:16:00').value, alpha=0.5, color='pink') ax3b.axvspan(pd.Timedelta('18:16:00').value, pd.Timedelta('18:22:00').value, alpha=0.8, color='skyblue') for doy, grp in cycle4a: grp.index -= grp.index.floor('D') data = grp[colname] / max(grp[colname]) ax4a.plot(data.index, data) ax4a.set_title('23:10-23:16 (before 13:00 PST Oct 26th)') ax4a.set_xlim(min(data.index).value, max(data.index).value) ax4a.yaxis.grid(which='major') ax4a.xaxis.grid(which='both') ax4a.xaxis.set_major_locator(ticker.MultipleLocator(1e9*60*xmajor)) ax4a.xaxis.set_minor_locator(ticker.MultipleLocator(1e9*60*xminor)) ax4a.xaxis.set_major_formatter(lambda x,p: pd.Timestamp(x).strftime('%H:%M')) ax4a.axvspan(pd.Timedelta('23:10:00').value, # HINT requires hh:mm:ss format pd.Timedelta('23:16:00').value, alpha=0.5, color='pink') ax4a.axvspan(pd.Timedelta('23:16:00').value, pd.Timedelta('23:22:00').value, alpha=0.8, color='skyblue') for doy, grp in cycle4b: grp.index -= grp.index.floor('D') data = grp[colname] / max(grp[colname]) ax4b.plot(data.index, data) ax4b.set_title('00:10-0:16 (after 13:00 PST Oct 26th)') ax4b.set_xlim(min(data.index).value, max(data.index).value) ax4b.yaxis.grid(which='major') ax4b.xaxis.grid(which='both') ax4b.xaxis.set_major_locator(ticker.MultipleLocator(1e9*60*xmajor)) ax4b.xaxis.set_minor_locator(ticker.MultipleLocator(1e9*60*xminor)) ax4b.xaxis.set_major_formatter(lambda x,p: pd.Timestamp(x).strftime('%H:%M')) ax4b.axvspan(pd.Timedelta('00:10:00').value, # HINT requires hh:mm:ss format pd.Timedelta('00:16:00').value, alpha=0.5, color='pink') ax4b.axvspan(pd.Timedelta('00:16:00').value, pd.Timedelta('00:22:00').value, alpha=0.8, color='skyblue')
不幸的是,我受到环境的限制,仍然使用旧版本(例如matplotlib 3.4.1、panda 1.2.4、numpy 1.20.2)?
In [25]: pd.show_versions() INSTALLED VERSIONS ------------------ commit : 2cb96529396d93b46abab7bbc73a208e708c642e python : 3.8.9.final.0 python-bits : 64 OS : Windows OS-release : 7 Version : 6.1.7601 machine : AMD64 processor : Intel64 Family 6 Model 42 Stepping 7, GenuineIntel byteorder : little LC_ALL : None LANG : en LOCALE : English_United States.1252 pandas : 1.2.4 numpy : 1.20.2 pytz : 2021.1 dateutil : 2.8.1 pip : 23.0 setuptools : 56.0.0 Cython : 0.29.23 pytest : 6.2.3 hypothesis : 6.9.2 sphinx : 3.5.4 blosc : 1.10.2 feather : 0.4.1 xlsxwriter : 1.3.9 lxml.etree : 4.6.3 html5lib : 1.1 pymysql : None psycopg2 : None jinja2 : 2.11.3 IPython : 7.22.0 pandas_datareader: 0.9.0 bs4 : 4.9.3 bottleneck : 1.3.2 fsspec : 0.8.7 fastparquet : 0.5.0 gcsfs : None matplotlib : 3.4.1 numexpr : 2.7.3 odfpy : None openpyxl : 3.0.7 pandas_gbq : None pyarrow : 3.0.0 pyxlsb : None s3fs : None scipy : 1.6.2 sqlalchemy : 1.4.8 tables : 3.6.1 tabulate : None xarray : 0.17.0 xlrd : None xlwt : None numba : 0.53.1