簡體   English   中英

Seaborn:避免繪制缺失值(線圖)

[英]Seaborn: Avoid plotting missing values (line plot)

我想要一個線圖來指示是否缺少一條數據,例如: 在此處輸入圖片說明

但是,下面的代碼填充了缺失的數據,從而創建了一個潛在的誤導性圖表: 在此處輸入圖片說明

import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt

# load csv
df=pd.read_csv('data.csv')
# plot a graph
g = sns.lineplot(x="Date", y="Data", data=df)
plt.show()

我應該在代碼中更改哪些內容以避免填充缺失值?

csv 如下所示:

Date,Data
01-12-03,100
01-01-04,
01-02-04,
01-03-04,
01-04-04,
01-05-04,39
01-06-04,
01-07-04,
01-08-04,53
01-09-04,
01-10-04,
01-11-04,
01-12-04,
01-01-05,28
   ...
01-04-18,14
01-05-18,12
01-06-18,8
01-07-18,8

.csv 鏈接: https : //drive.google.com/file/d/1s-RJfAFYD90m4SrFDzIba7EQP4C-J0yO/view? usp =sharing

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

# Make example data
s = """2018-01-01
2018-01-02,100
2018-01-03,105
2018-01-04
2018-01-05,95
2018-01-06,90
2018-01-07,80
2018-01-08
2018-01-09"""
df = pd.DataFrame([row.split(",") for row in s.split("\n")], columns=["Date", "Data"])
df = df.replace("", np.nan)
df["Date"] = pd.to_datetime(df["Date"])
df["Data"] = df["Data"].astype(float)

三個選項:

1) 使用pandasmatplotlib

2)如果您需要seaborn :不是它的用途,而是對於像您這樣的常規日期,您可以pointplot使用pointplot

fig, ax = plt.subplots(figsize=(10, 5))

plot = sns.pointplot(
    ax=ax,
    data=df, x="Date", y="Data"
)

ax.set_xticklabels([])

plt.show()

在此處輸入圖片說明

3)如果您需要seaborn並且需要lineplot :我查看了源代碼,看起來 lineplot 在繪圖之前從lineplot刪除了 nans 。 所以不幸的是,不可能正確地做到這一點。 不過,您可以使用一些高級技巧並使用hue參數將單獨的部分放在單獨的存儲桶中。 我們使用 nans 的出現對部分進行編號。

fig, ax = plt.subplots(figsize=(10, 5))

plot = sns.lineplot(
    ax=ax,
    data=df, x="Date", y="Data",
    hue=df["Data"].isna().cumsum(), palette=["black"]*sum(df["Data"].isna()), legend=False, markers=True
)
ax.set_xticklabels([])

plt.show()

在此處輸入圖片說明

不幸的是,標記參數目前似乎已損壞,因此如果您想查看兩邊都有 nans 的日期,則需要修復它。

嘗試將 NaN 值設置為np.inf -- Seaborn 不會繪制這些點,並且不會將之前的點與之后的點連接起來。

基於 Denziloe 的回答:

有三個選項:

1) 使用pandasmatplotlib

2)如果您需要seaborn :不是它的用途,但對於像上面pointplot常規日期, pointplot可以開箱即用。

fig, ax = plt.subplots(figsize=(10, 5))

plot = sns.pointplot(
    ax=ax,
    data=df, x="Date", y="Data"
)

ax.set_xticklabels([])

plt.show()

基於問題數據構建的圖表如下所示: 在此處輸入圖片說明

優點:

  • 易於實施
  • 在數據異常值是由包圍None很容易通知在圖表上

缺點:

  • 生成這樣的圖需要很長時間(與lineplot相比)
  • 當有很多點時,很難閱讀這樣的圖表

3) 如果您需要seaborn並且需要lineplot :可以使用hue參數將單獨的部分放在單獨的桶中。 我們使用 nans 的出現對部分進行編號。

fig, ax = plt.subplots(figsize=(10, 5))

plot = sns.lineplot(
    ax=ax
    , data=df, x="Date", y="Data"
    , hue=df["Data"].isna().cumsum()
    , palette=["blue"]*sum(df["Data"].isna())
    , legend=False, markers=True
)

ax.set_xticklabels([])

plt.show()

優點:

  • 線圖
  • 易於閱讀
  • 生成速度比點圖快

缺點:

  • 數據中被None包圍的異常值將不會繪制在圖表上

該圖將如下所示: 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM