[英]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) 使用pandas
或matplotlib
。
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) 使用pandas
或matplotlib
。
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.