在异常值移除前后绘制 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)
链接这个已解决的问题(再次感谢@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)