我正在尝试使用plt.subplots()
在一个图上制作两个箱图。我已多次成功完成此操作,结果如下:
我已经弄乱了比例,因为我正在绘制多组数据,范围从0.0001到100,这取决于在图形化过程中循环的数据帧,我需要有一个科学格式的比例易读性或浮点数精度约为小数点后两位数。为了解决这个问题,我制作了以下代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
mindex=pd.date_range('07/01/2012', periods=96, freq='H')
data00=np.random.rand(96)*20
data01=np.random.rand(96)*0.01
data10=np.random.rand(96)*20
data11=np.random.rand(96)*0.01
df00=pd.DataFrame({'Observed': data00},index=mindex)
df01=pd.DataFrame({'Observed': data01},index=mindex)
df10=pd.DataFrame({'WRF': data10},index=mindex)
df11=pd.DataFrame({'WRF': data11},index=mindex)
df0list=[df00,df01]
df1list=[df10,df11]
for k in xrange(len(df0list)):
#Graphing
df0list[k]['Hour']=pd.Series(df0list[k].index.hour,index=df0list[k].index)
df1list[k]['Hour']=pd.Series(df1list[k].index.hour,index=df1list[k].index)
if df0list[k]['Observed'].max() >= df1list[k]['WRF'].max():
ymax=df0list[k]['Observed'].max()
else:
ymax=df1list[k]['WRF'].max()
if df0list[k]['Observed'].min() <= df1list[k]['WRF'].min():
ymin=df0list[k]['Observed'].min()
else:
ymin=df1list[k]['WRF'].min()
yscale=np.arange(ymin-ymin*0.1,ymax+ymax*0.005,((ymax+ymax*0.005)-(ymin-ymin*0.1))/10.)
if ymin > 0.01:
ybounds=['{:.2f}'.format(i) for i in yscale]
else:
ybounds=['{:.2e}'.format(i) for i in yscale]
fig,axes=plt.subplots(ncols=1,nrows=2, figsize=(28,20))
df0list[k].boxplot(ax=axes[0],by='Hour', whis= [10, 90], sym='')
axes[0].set_yticks(ybounds)
df1list[k].boxplot(ax=axes[1],by='Hour', whis= [.10, .90], sym='')
axes[1].set_yticks(ybounds)
plt.show()
这样生成的图形仅显示顶部图形,其边界不合适。我不确定matplotlib如何处理显示格式,并认为通过使set_yticks()
函数接受预先格式化的numpy数组,它将显示在格式化的数组中。但是,现在图表甚至不会保存给我TypeError: cannot perform reduce with flexible type
。我需要以不同的方式格式化吗?