一个图上的四个箱图MathPlotLib

时间:2016-06-16 15:38:16

标签: python matplotlib python-xarray

所以我有多个数据文件,所有这些都使用数据帧来轻松处理信息。所有文件都是NetCDF文件。我试图在同一图上绘制4个箱线图,这样它们都可以很容易地进行比较(我正在观察同一时间选择的平均值在不同时间达到峰值)。它们将具有不同的X和Y值,因为这是在稍微不同的时间间隔采集的观测数据,并且不同的变量数对应于不同的时间相关变量。

我一直在尝试使用子图来使用matplotlib来实现这一点,但它只是吐出三个空图。我怎样才能做到这一点?

以下是代码:

plt.figure(1)
plt.subplot(2, 1, 1)
ds1=xr.open_dataset(lfile1)
one_day1 = ds1[variable1].sel(time=slice(monthofi+startday+' '+starttime,monthofi+endday+' '+endtime))
df1 = one_day1.to_pandas().to_frame(name=variable1)
df1.index=df1.index-pd.DateOffset(hours=7)
df1.boxplot(column=variable1, by=df1.index.time, whis= [10, 90], sym='')
plt.xlabel('Time')
plt.ylabel('Temperature [degF]')
plt.title('Daily Cycle')
plt.suptitle('')

plt.subplot(2, 1, 2)
ds2=xr.open_dataset(lfile2)
one_day2 = ds2[variable2].sel(time=slice(monthofi+startday+' '+starttime,monthofi+endday+' '+endtime))
df2 = one_day2.to_pandas().to_frame(name=variable2)
df2.index=df2.index-pd.DateOffset(hours=7)
df2.boxplot(column=variable2, by=df2.index.time, whis= [10, 90], sym='')
plt.xlabel('Time')
plt.ylabel('Average Wind Speed')
plt.title('Daily Cycle')
plt.suptitle('')

plt.subplot(2, 2, 1)
ds3=xr.open_dataset(lfile3)
one_day3 = ds3[variable3].sel(time=slice(monthofi+startday+' '+starttime,monthofi+endday+' '+endtime))
df3 = one_day3.to_pandas().to_frame(name=variable3)
df3.index=df1.index-pd.DateOffset(hours=7)
df3.boxplot(column=variable3, by=df3.index.time, whis= [10, 90], sym='')
plt.xlabel('Time')
plt.ylabel('Wind  Direction')
plt.title('Daily Cycle')
plt.suptitle('')

plt.subplot(2, 2, 2)
ds4=xr.open_dataset(lfile4)
one_day4 = ds4[variable4].sel(time=slice(monthofi+startday+' '+starttime,monthofi+endday+' '+endtime))
df4 = one_day4.to_pandas().to_frame(name=variable4)
df4.index=df4.index-pd.DateOffset(hours=7)
df4.boxplot(column=variable4, by=df4.index.time, whis= [10, 90], sym='')
plt.xlabel('Time')
plt.ylabel('Solar Radiation [W/m^2]')
plt.title('Daily Cycle')
plt.suptitle('')

plt.show()

到底发生了什么?

好吧,现在,我编辑了它,以便它如下:

plt.figure()
ax1=plt.subplot(2,2,1)
df1.boxplot(column=variable1, by=df1.index.time, whis= [10, 90], sym='')
ax1.set_title('Daily Cycle')


ax2=plt.subplot(2,2,2)
df2.boxplot(column=variable2, by=df2.index.time, whis= [10, 90], sym='')
ax2.set_title('Daily Cycle')



ax3=plt.subplot(2,2,3)
df3.boxplot(column=variable3, by=df3.index.time, whis= [10, 90], sym='')
ax3.set_title('Daily Cycle')


ax4=plt.subplot(2,2,4)
df4.boxplot(column=variable4, by=df4.index.time, whis= [10, 90], sym='')
ax4.set_title('Daily Cycle')


plt.show()

现在,我得到五个五位数的窗户。占据整个窗口的一个数字应该包含四个子图中的所有数据,而其他四个数字在我想要的位置各有一个子图,但是空的。

1 个答案:

答案 0 :(得分:2)

你只得到三张图,因为你给了subplot错误的参数并覆盖了你之前创建的轴。 来自文档:

subplot(nrows, ncols, plot_number)

nrows是图中子图的行数,ncols是图中的列数。

这是一个使用Pandas DataFrame boxplot方法的工作示例:

df1 = pd.DataFrame({'a':[1,2,3],'b':[6,8,2],'c':[9,1,7]})
df2 = pd.DataFrame({'a':[15,23,32],'b':[6,80,2],'c':[9,10,7]})
df3 = pd.DataFrame({'a':[0.2,0.5,0.5],'b':[18,5,2],'c':[9,7,7]})
df4 = pd.DataFrame({'a':[51,32,20],'b':[4,3,20],'c':[7,2,1]})

fig = plt.figure()
ax1 =fig.add_subplot(2,2,1)
df1.boxplot(ax = ax1)
ax2 =fig.add_subplot(2,2,2)
df2.boxplot(ax = ax2)
ax3 =fig.add_subplot(2,2,3)
df3.boxplot(ax = ax3)
ax4 =fig.add_subplot(2,2,4)
df4.boxplot(ax = ax4)
plt.show()

enter image description here 我不确定为什么你的情节都是空的。我要检查您正在绘制的DataFrame的内容。