Python 我可以用seaborn在x轴上绘制日期时间的线性回归吗?

Python 我可以用seaborn在x轴上绘制日期时间的线性回归吗?,python,pandas,dataframe,matplotlib,seaborn,Python,Pandas,Dataframe,Matplotlib,Seaborn,我的DataFrame对象看起来像 amount date 2014-01-06 1 2014-01-07 1 2014-01-08 4 2014-01-09 1 2014-01-14 1 我想要一种散点图,沿x轴显示时间,y轴显示数量,通过数据线引导观众的眼睛。如果我使用panadas plotdf.plot(style=“o”)它不太正确,因为没有线。我想要一些类似的例子。由于Seaborn在日期方面有问题,我将创建一个解决方案。 首先,我将日期列

我的DataFrame对象看起来像

            amount
date    
2014-01-06  1
2014-01-07  1
2014-01-08  4
2014-01-09  1
2014-01-14  1

我想要一种散点图,沿x轴显示时间,y轴显示数量,通过数据线引导观众的眼睛。如果我使用panadas plot
df.plot(style=“o”)
它不太正确,因为没有线。我想要一些类似的例子。

由于Seaborn在日期方面有问题,我将创建一个解决方案。 首先,我将日期列作为索引:

# Make dataframe
df = pd.DataFrame({'amount' : [1,
                               1,
                               4,
                               1,
                               1]},
                  index = ['2014-01-06',
                           '2014-01-07',
                           '2014-01-08',
                           '2014-01-09',
                           '2014-01-14'])
其次,将索引转换为pd.DatetimeIndex:

# Make index pd.DatetimeIndex
df.index = pd.DatetimeIndex(df.index)
并将原始文件替换为:

# Make new index
idx = pd.date_range(df.index.min(), df.index.max())
第三,使用新索引(idx)重新编制索引:

这将为您没有数据的日期生成一个带有NaN值的新数据框:

第四,由于Seaborn不能很好地处理日期和回归线,我将创建一个行计数列,我们可以将其用作x轴:

# Insert row count
df.insert(df.shape[1],
          'row_count',
          df.index.value_counts().sort_index().cumsum())
第五,我们现在应该能够使用“row_count”作为x变量,“amount”作为y变量绘制回归线:

# Plot regression using Seaborn
fig = sns.regplot(data = df, x = 'row_count', y = 'amount')
第六,如果希望日期沿x轴而不是行数,可以将x记号标签设置为索引:

# Change x-ticks to dates
labels = [item.get_text() for item in fig.get_xticklabels()]

# Set labels for 1:10 because labels has 11 elements (0 is the left edge, 11 is the right
# edge) but our data only has 9 elements
labels[1:10] = df.index.date

# Set x-tick labels
fig.set_xticklabels(labels)

# Rotate the labels so you can read them
plt.xticks(rotation = 45)

# Change x-axis title
plt.xlabel('date')

plt.show();

希望这有帮助

注意:这与伊恩·汤普森的答案有很多共同之处,但方法不同,足以将其作为一个单独的答案。我使用问题中提供的数据帧格式,避免更改索引

Seaborn和其他库不能像您希望的那样很好地处理日期时间轴。下面是我如何解决这个问题的:

首先添加一列日期序号 Seaborn处理这些比处理日期更好。这是一个方便的技巧,可以用日期和不喜欢日期的库做各种各样的数学事情

from datetime import date

df['date_ordinal'] = pd.to_datetime(df['date']).apply(lambda date: date.toordinal())

用日期轴上的序号进行绘图 用清晰易读的日期替换顺序X轴标签


塔达阿

一般来说,日期在seaborn中没有很好的支持。也就是说,你可能会通过一些好的方法间接得到一些答案。是的,我注意到,
df.plot(style=“o”)
在x轴上给了我很好的日期标签,但是
sns.tsplot
没有。你的示例链接已经失效:“|这太棒了!我要补充的是,我必须为ax.getxticks()]中的项使用
new_标签=[dt.date.fromordinal(int(item))
,因为我在脚本顶部有
import datetime as dt
。我猜这个答案假设用户已经完成了从datetime导入日期开始的
from datetime import date

df['date_ordinal'] = pd.to_datetime(df['date']).apply(lambda date: date.toordinal())
ax = seaborn.regplot(
    data=df,
    x='date_ordinal',
    y='amount',
)
# Tighten up the axes for prettiness
ax.set_xlim(df['date_ordinal'].min() - 1, df['date_ordinal'].max() + 1)
ax.set_ylim(0, df['amount'].max() + 1)
ax.set_xlabel('date')
new_labels = [date.fromordinal(int(item)) for item in ax.get_xticks()]
ax.set_xticklabels(new_labels)