Seaborn:避免绘制缺失值(线图)

时间:2018-08-30 13:40:31

标签: python visualization seaborn

我想要一个线图来指示是否缺少一条数据,例如: enter image description here

但是,下面的代码填充了丢失的数据,从而创建了可能引起误解的图表: enter image description here

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

3 个答案:

答案 0 :(得分:4)

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

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

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

ax.set_xticklabels([])

plt.show()

enter image description here

3)如果需要seaborn并且需要lineplot:我已经看了源代码,看起来lineplot在绘制之前从DataFrame中删除了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()

enter image description here

不幸的是,markers参数当前似乎已损坏,因此,如果您想查看在两边都有nans的日期,则需要对其进行修复。

答案 1 :(得分:1)

尝试将NaN值设置为Changelog <- df %>% split(.$Date) %>% purrr::map_dfr(df_index+1 %>% dplyr::anti_join(df_index, by = c("Doc_ID", "Status", "Author"))) -Seaborn不会绘制这些点,并且不会将之前的点与之后的点连接起来。

答案 2 :(得分:0)

基于Denziloe的答案:

共有三个选项:

1)使用pandasmatplotlib

2)如果您需要seaborn:可以直接使用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

基于问题数据构建的图形如下所示: enter image description here

优点:

  • 易于实施
  • 在数据中被lineplot包围的异常值 在图形上很容易注意到

缺点:

  • 生成这样的图需要很长时间(与seaborn相比)
  • 当有很多点时,很难阅读此类图

3)如果您需要lineplot并且需要huefig, 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() 参数可用于将单独的部分放在单独的存储桶中。我们使用nans的出现对部分进行编号。

None

优点:

  • lineplot
  • 易于阅读
  • 生成速度快于点图

缺点:

  • 由{{1}} 包围的数据中的异常值不会绘制在图表上

图形将如下所示: enter image description here