X轴上日历周YYYYWW的Seaborn多个线图

时间:2019-12-06 15:05:49

标签: python seaborn

我对seaborn线图的x轴值有一些疑问:

import pandas as pd
import seaborn as sns

# data
df = pd.DataFrame(columns=['calendar_week', 'product_name', 'value'],
                  data=[['201850', 'product01', 1], ['201905', 'product01', 10], ['201910', 'product01', 7],
                       ['201840', 'product02', 4], ['201911', 'product02', 9], ['201917', 'product02', 17], ['201918', 'product02', 12]])

# plot
sns.lineplot(data=df, x='calendar_week', y='value', hue='product_name');

如果calendar_week值是字符串,它将在第一个图形之后绘制第二个图形。如果calendar_week值为整数,它将自动填充从201852到201899的数据。用给定的calendar_week值在一个排序的x轴上绘制两个图的最佳方法是什么?

这是带有calendar_week作为字符串的图: plot with x-axis values as string

以下是calendar_week为int的情节: plot with x-axis values as int

感谢帮助。

2 个答案:

答案 0 :(得分:1)

有点round回旋,但是我认为您首先需要将周数转换为真实日期,然后绘图,然后在x轴上使用自定义格式器来再次显示周数。

df = pd.DataFrame(columns=['calendar_week', 'product_name', 'value'],
                  data=[['201850', 'product01', 1], ['201905', 'product01', 10], ['201910', 'product01', 7],
                       ['201840', 'product02', 4], ['201911', 'product02', 9], ['201917', 'product02', 17], ['201918', 'product02', 12]])

df['date'] = pd.to_datetime(df.calendar_week+'0', format='%Y%W%w')
# plot
fig, ax = plt.subplots()
sns.lineplot(data=df, x='date', y='value', hue='product_name', ax=ax)
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%Y-%W"))
fig.autofmt_xdate()

enter image description here

答案 1 :(得分:0)

我来自德国,我必须处理ISO周,所以我最终这样做了:

import pandas as pd
import seaborn as sns
import datetime
import matplotlib
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

# data
df = pd.DataFrame(columns=['calendar_week', 'product_name', 'value'],
                  data=[['201850', 'product01', 1], ['201905', 'product01',     10], ['201910', 'product01', 7],
                       ['201840', 'product02', 4], ['201911', 'product02', 9], ['201917', 'product02', 17], ['201918', 'product02', 12]])

# convert calendar weeks to date
df['date'] = df['calendar_week'].apply(lambda x: datetime.datetime.strptime(x + '-1', '%G%V-%u'))

# plot
fig, ax = plt.subplots()
sns.lineplot(data=df, x='date', y='value', hue='product_name', ax=ax)
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%G%V'))
fig.autofmt_xdate()
plt.show();