繁体   English   中英

Plot 异常值使用 matplotlib 和 seaborn

[英]Plot outliers using matplotlib and seaborn

我已经对购物中心的一些入口传感器数据进行了异常值检测。 我想为每个入口创建一个 plot 并突出显示异常值的观察值(在数据框中的异常值列中由 True 标记)。

以下是两个入口和六天时间跨度的一小段数据:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame({"date": [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6],
                   "mall": ["Mall1", "Mall1", "Mall1", "Mall1", "Mall1", "Mall1", "Mall1", "Mall1", "Mall1", "Mall1", "Mall1", "Mall1"],
                   "entrance": ["West", "West","West","West","West", "West", "East", "East", "East", "East", "East", "East"],
                   "in": [132, 140, 163, 142, 133, 150, 240, 250, 233, 234, 2000, 222],
                   "outlier": [False, False, False, False, False, False, False, False, False, False, True, False]})

为了创建几个图(完整数据中有二十个入口),我在 seaborn 中遇到了 lmplot。

sns.set_theme(style="darkgrid")
for i, group in df.groupby('entrance'):
    sns.lmplot(x="date", y="in", data=group, fit_reg=False, hue = "entrance")
    #pseudo code
    #for the rows that have an outlier (outlier = True) create a red dot for that observation
plt.show()

我想在这里完成两件事:

  1. 线图而不是散点图。 我没有成功使用 sns.lineplot 为每个入口创建单独的图,因为 lmplot 似乎更适合这个。
  2. 对于每个入口 plot,我想显示哪些观察值是异常值,最好显示为红点。 我尝试在绘图尝试中编写一些伪代码。
  • seaborn.lmplot是一个Facetgrid ,我认为在这种情况下更难使用。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

for i, group in df.groupby(['entrance']):

    # plot all the values as a lineplot
    sns.lineplot(x="date", y="in", data=group)
    
    # select the data when outlier is True and plot it
    data_t = group[group.outlier == True]
    sns.scatterplot(x="date", y="in", data=data_t, c=['r'])

    # add a title using the value from the groupby
    plt.title(f'Entrance: {i}')
    
    # show the plot here, not outside the loop
    plt.show()

在此处输入图像描述

备用选项

  • 此选项将允许设置图形的列数和行数
import math

# specify the number of columns to plot
ncols = 2

# determine the number of rows, even if there's an odd number of unique entrances
nrows = math.ceil(len(df.entrance.unique()) / ncols)

fig, axes = plt.subplots(ncols=ncols, nrows=nrows, figsize=(16, 16))

# extract the axes into an nx1 array, which is easier to index with idx.
axes = axes.ravel()

for idx, (i, group) in enumerate(df.groupby(['entrance'])):

    # plot all the values as a lineplot
    sns.lineplot(x="date", y="in", data=group, ax=axes[idx])
    
    # select the data when outlier is True and plot it
    data_t = group[group.outlier == True]
    sns.scatterplot(x="date", y="in", data=data_t, c=['r'], ax=axes[idx])
    axes[idx].set_title(f'Entrance: {i}')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM