在异常值移除前后绘制 DataFrame

Plot DataFrame before and after outlier removal

链接这个已解决的问题(再次感谢@mozway 和 jezrael!)

我想绘制离群值去除图。 我想要的:一个散点图,由 7 个子图组成,所有行(x 轴应该是第一行的时间,其他行应该分别是 y 轴)。删除的值应突出显示。我该怎么做?

我考虑过在删除前后绘制并将两者插入一个图中。

我有两种绘图方法:

Ni60 = data[['60Ni']]
Ni61 = data[['61Ni']]
Ni62 = data[['62Ni']]
Cu63 = data[['63Cu']]
Ni64 = data[['64Ni']]
Cu65 = data[['65Cu']]
Zn66 = data[['66Zn']]
Time = data[['Time']]

fig, ax = plt.subplots(2, 2, sharex = True, figsize = (13, 8))
plt.rcParams['figure.dpi'] = 100 
fig.suptitle(basename)

ax[0, 0].scatter(Time, Ni60)
ax[0, 1].scatter(Time, Ni61)
ax[1, 0].scatter(Time, Cu63)
ax[1, 1].scatter(Time, Cu65)

for axis in ax.flat: axis.set_xlim(0, 32)
ax[0, 0].set_ylim(0, 0.02)
ax[1, 0].set_ylim(0, 0.02)
ax[0, 1].set_ylim(0, 0.002)
ax[1, 1].set_ylim(0, 0.02)


ax[0, 0].set_xlabel('Time (s)')
ax[0, 1].set_xlabel('Time (s)')
ax[1, 0].set_xlabel('Time (s)')
ax[1, 1].set_xlabel('Time (s)')
ax[0, 0].set_ylabel('Spannung (V)')
ax[0, 1].set_ylabel('Spannung (V)')
ax[1, 0].set_ylabel('Spannung (V)')
ax[1, 1].set_ylabel('Spannung (V)')

ax[0, 0].set_title('$^{60}$Ni', color = 'b')
ax[0, 1].set_title('$^{61}$Ni', color = 'b')
ax[1, 0].set_title('$^{63}$Cu', color = 'b')
ax[1, 1].set_title('$^{65}$Cu', color = 'b')

fig.savefig(outfile + "blank.png", dpi=150)

f = sns.relplot(data=data.melt(id_vars='Time', value_name='Spannung (V)'), x='Time', y='Spannung (V)', col='variable', col_wrap=2, kind='line', marker='o')
f.fig.savefig("out.png")

但是这些将在异常值移除之后 and/or 之前生成。我想用蓝色绘制数据,用红色绘制异常值。

异常值被移除:

from scipy import stats
cols = list(df.drop(columns='Time').columns)
# or
# cols = ['60Ni', '61Ni', '62Ni', '63Cu', '64Ni', '65Cu', '66Zn']

df[cols] = df[cols].where(np.abs(stats.zscore(df[cols])) < 2)

虽然逻辑上不是最好的方法,但如果用红色绘制异常值排除前的数据,然后用蓝色绘制异常值,则异常值不会被覆盖,仍然是红色。

from scipy import stats
cols = list(df.drop(columns='Time').columns)
dfo = pd.DataFrame({'Time':df['Time']})
dfo[cols] = df[cols].mask(np.abs(stats.zscore(df[cols])) >= 2)

import matplotlib.pyplot as plt

cols = ['60Ni', '61Ni', '62Ni', '63Cu', '64Ni', '65Cu', '66Zn']

fig, axes = plt.subplots(2, 2, sharex=True, figsize=(12, 8), dpi=100)
fig.suptitle('Outlier graph')

for idx, (c,ax) in enumerate(zip(cols, axes.flatten())):
    ax.scatter(df['Time'], df[c], color='r')
    ax.scatter(dfo['Time'], dfo[c], color='b')    
    ax.set(xlim=(0,32), ylim=(0,0.01))
    ax.set_xlabel('Time (s)')
    ax.set_ylabel('Spannung (V)')
    ax.set_title('${}${}'.format(c[:2], c[2:]), color='b')

#fig.savefig(outfile + "blank.png", dpi=150)
plt.show()

读入数据文件并创建图表

for c in cols:
    data = pd.read_csv(c+'.csv', ...)
    for ax in axes.flatten():
    ...
    fig.savefig(c+'_blank.png',dpi=150)