Multi-line chart with seaborn tsplot

2020-02-07 04:32发布

I want to create a smoothed line chart using matplotlib and seaborn.

This is my dataframe df:

hour    direction    hourly_avg_count
0       1            20
1       1            22
2       1            21
3       1            21
..      ...          ...
24      1            15
0       2            24
1       2            28
...     ...          ...

The line chart should contain two lines, one for direction equal to 1, another for direction equal to 2. The X axis is hour and Y axis is hourly_avg_count.

I tried this, but I cannot see the lines.

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

plt.figure(figsize=(12,8))
sns.tsplot(df, time='hour', condition='direction', value='hourly_avg_count')

2条回答
ゆ 、 Hurt°
2楼-- · 2020-02-07 04:38

The tsplot is a bit strange or at least strangly documented. If a dataframe is supplied to it, it assumes that there must be a unit and a time column present, as it internally pivots about those two. To use tsplot to plot several time series you would therefore need to supply an argument to unit as well; this can be the same as condition.

sns.tsplot(df, time='hour', unit = "direction", 
               condition='direction', value='hourly_avg_count')

Complete example:

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

hour, direction = np.meshgrid(np.arange(24), np.arange(1,3))
df = pd.DataFrame({"hour": hour.flatten(), "direction": direction.flatten()})
df["hourly_avg_count"] = np.random.randint(14,30, size=len(df))

plt.figure(figsize=(12,8))
sns.tsplot(df, time='hour', unit = "direction", 
               condition='direction', value='hourly_avg_count')

plt.show()

enter image description here

Also worth noting that tsplot is deprecated as of seaborn version 0.8. It might thus be worth to use some other way to plot the data anyways.

查看更多
别忘想泡老子
3楼-- · 2020-02-07 04:51

Try adding a dummy unit column. The first parts is to create some synthetic data, so please ignore.

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

df1 = pd.DataFrame({
"hour":range(24),
"direction":1,
"hourly_avg_count": np.random.randint(25,28,size=24)})

df2 = pd.DataFrame({
"hour":range(24),
"direction":2,
"hourly_avg_count": np.random.randint(25,28,size=24)})

df = pd.concat([df1,df2],axis=0)
df['unit'] = 'subject'

plt.figure()
sns.tsplot(data=df, time='hour', condition='direction',
unit='unit', value='hourly_avg_count')

enter image description here

查看更多
登录 后发表回答