我正在使用matplotlib绘制一个方框图,但是有一些缺失值(NaN)。然后我发现它没有显示具有NaN值的列中的方框图。你知道如何解决这个问题吗?这里是代码。
import numpy as np
import matplotlib.pyplot as plt
#==============================================================================
# open data
#==============================================================================
filename='C:\\Users\\liren\\OneDrive\\Data\\DATA in the first field-final\\ks.csv'
AllData=np.genfromtxt(filename,delimiter=";",skip_header=0,dtype='str')
TreatmentCode = AllData[1:,0]
RepCode = AllData[1:,1]
KsData= AllData[1:,2:].astype('float')
DepthHeader = AllData[0,2:].astype('float')
TreatmentUnique = np.unique(TreatmentCode)[[3,1,4,2,8,6,9,7,0,5,10],]
nT = TreatmentUnique.size#nT=number of treatments
#nD=number of deepth;nR=numbers of replications;nT=number of treatments;iT=iterms of treatments
nD = 5
nR = 6
KsData_3D = np.zeros((nT,nD,nR))
for iT in range(nT):
Treatment = TreatmentUnique[iT]
TreatmentFilter = TreatmentCode == Treatment
KsData_Filtered = KsData[TreatmentFilter,:]
KsData_3D[iT,:,:] = KsData_Filtered.transpose()iD = 4
fig=plt.figure()
ax = fig.add_subplot(111)
plt.boxplot(KsData_3D[:,iD,:].transpose())
ax.set_xticks(range(1,nT+1))
ax.set_xticklabels(TreatmentUnique)
ax.set_title(DepthHeader[iD])
这是最后的数字和一些治疗方法在框中缺失。
1条答案
按热度按时间jgwigjjp1#
您可以先从数据中删除
NaN
s,然后绘制过滤后的数据。为此,您可以首先使用
np.isnan(data)
找到NaN
s,然后使用~
执行该布尔数组的按位求逆:按位求逆运算符。使用它来索引数据数组,然后过滤掉NaN
s。在一个完整的例子中(改编自here)
在
python 3.10
、matplotlib 3.5.1
、seaborn 0.11.2
、numpy 1.21.5
、pandas 1.4.2
中测试一维数据:
二维数据:
对于2D数据,你不能简单地使用上面的掩码,因为数据数组的每一列都有不同的长度。相反,我们可以创建一个列表,列表中的每一项都是数据数组每一列的过滤数据。
一个列表解析可以在一行中做到这一点:
[d[m] for d, m in zip(data.T, mask.T)]
我将把它作为一个练习留给读者来扩展到3维或更多维,但你会得到这个想法。
上面的解决方案是如何单独使用
matplotlib
来实现这一点。其他替代方案(在后台使用matplotlib
)也可以内置此行为,因此不需要自己过滤数据。1.使用
seaborn
,这是matplotlib
的高级API。seaborn.boxplot
在后台过滤NaN
。1D
二维
1.使用
pandas
。如果从df.plot(kind='box')
打印pandas
,则NaN
也会被忽略,pandas
使用matplotlib
作为默认打印后端。1D
二维