Я думаю, что вы правы - plt.boxplot
игнорирует маску, если отправляется массив с маской.Похоже, вам придется оказать boxplot
дополнительную помощь, отправив ему только те значения, которые не маскируются.Поскольку каждая строка массива может иметь различное количество немаскированных значений, вы не сможете использовать массив с пустыми значениями.Вам нужно будет сформировать последовательность векторов Python:
z = [[y for y in row if y] for row in x.T]
Например:
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
N=20
M=10
x = np.random.random((M,N))
mask=np.random.random_integers(0,1,N*M).reshape((M,N))
x = np.ma.array(x,mask=mask)
ax1=fig.add_subplot(2,1,1)
ax1.boxplot(x)
z = [[y for y in row if y] for row in x.T]
ax2=fig.add_subplot(2,1,2)
ax2.boxplot(z)
plt.show()
Вверху, первый субплот показывает блок-графикиз всех данных в x
(игнорируя маску), а на втором вспомогательном участке показан блок-график только тех значений, которые не маскируются.