【问题标题】:seaborn axis range not fitting data range in Pythonseaborn 轴范围不适合 Python 中的数据范围
【发布时间】:2019-05-23 21:11:37
【问题描述】:

我正在尝试创建一个简单的散点图(我过去创建了几个),因为我想了解服务台创建的工单和服务台关闭的工单之间的关系比率。这两个特征是时间戳,但是当我绘制图表时,X 和 Y 轴的范围似乎比所需的范围大得多,因为我拥有的数据是从 2017 年到 2019 年,而图表是从 2000 年到 2020 年。我尝试过修改plt.xlim()plt.xlim(2016,2020) 但这会产生一个图,其中有问题的轴具有没有意义的值(见附图) 我的代码如下:

plt.figure(figsize=(10,5))
ax = sns.scatterplot(data=data, x=data['Created'], y=data['Closed'])

这会产生以下图表:

当我尝试修改 plt.xlim() 时,我得到以下图表:

这是我试图绘制的一些数据:

          Created                  Closed
13  2018-01-16 16:23:21     2018-01-21 16:23:55
14  2018-01-11 17:51:18     2018-01-16 17:55:15
15  2018-01-12 13:03:50     2018-01-22 14:01:12
16  2018-01-11 13:28:55     2018-01-21 15:11:04
17  2018-01-04 09:58:36     2018-01-09 10:01:34
18  2018-01-23 09:19:36     2018-02-22 15:00:06
20  2019-04-09 10:50:54     2019-04-14 10:56:27
21  2019-04-08 19:22:49     2019-04-14 14:25:26
22  2019-04-09 12:34:24     2019-04-15 14:37:47
23  2019-04-09 17:22:10     2019-04-17 17:00:20
24  2019-04-09 09:58:52     2019-04-17 11:30:13
25  2019-04-08 20:08:01     2019-04-09 22:01:30
26  2019-04-09 18:40:13     2019-04-10 22:26:45
27  2019-04-09 19:29:04     2019-04-15 10:00:48
28  2019-04-10 02:43:15     2019-04-15 02:46:54
29  2019-04-10 03:04:36     2019-04-15 03:07:27
30  2019-04-10 03:12:02     2019-04-15 03:14:33

要重现我面临的问题,请在绘图前运行以下命令:

data['Created']=pd.to_datetime(data['Created'])
data['Closed']=pd.to_datetime(data['Closed'])

我知道 seaborn 和绘制日期时间存在问题,但必须有一种方法可以正确绘制数据。 所以我的问题是,如何让绘图放大到创建数据的范围?

【问题讨论】:

标签: python python-3.x matplotlib jupyter-notebook seaborn


【解决方案1】:

问题是当你这样做时

plt.xlim(2016, 2020)

plt 将限制设置为 2016 年和 2020 年的 整数 值,转换为时间戳将从纪元时间开始大约 2000 纳秒,例如

Timestamp('1970-01-01 00:00:00.000002020')

这就是为什么你再也看不到你的散点图了。相反,将相应的时间戳传递给plt.xlim

plt.figure(figsize=(10,5))
ax = sns.scatterplot(data=data, x=data['Created'], y=data['Closed'])

plt.xlim(pd.to_datetime('2016-01-01'), # pd.to_datetime('2016') also works
        pd.to_datetime('2020-01-01'))
plt.show()

你可以得到:

【讨论】:

  • 这正是我想要的!我知道有一种方法可以使用 seaborn 和日期。感谢您加倍努力并使其符合我的要求。
【解决方案2】:

该问题是sns.scatterplot 中的一个已知问题。 您可以通过不同的方式解决您的问题,这里有两种:

使用简单的 matplotlib 绘图并设置线型和标记:

sns.set()
fig,ax= plt.subplots(1,1,figsize=(10,5))
plt.plot(df['Created'], df['Closed'],linestyle='None', marker='o')

或使用ax.plot_date

sns.set()
fig,ax= plt.subplots(1,1,figsize=(10,5))
ax.plot_date(df['Created'], df['Closed'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多