【问题标题】:matplotlib/seaborn scatter plot with datetime object on x-axis and days with multiple entriesmatplotlib/seaborn 散点图,x 轴上带有日期时间对象,天数带有多个条目
【发布时间】:2019-07-09 04:12:31
【问题描述】:

我有一个数据框,想绘制一个散点图,说明在 y 轴上完成请求所需的时间days 和提交请求的日期 (Received,这是日期时间对象)在 x 轴上。

“已接收”的某些值有两个条目,因为有时在同一天提交了两个请求。

这是我的一些数据和我尝试过的代码:

Received          Days
2012-08-01        41.0 
2014-12-31       692.0
2015-02-25       621.0
2015-10-15       111.0

sns.regplot(x=simple_denied["Received"], y=simple_denied["days"], marker="+", fit_reg=False)


plt.plot('Received','days', simple_denied, color='black')

【问题讨论】:

  • 我认为您可能想使用条形图、线图或热图而不是散点图,因为它需要两个连续变量。如果 Received 中有重复,请先尝试将 Days 聚合在一起,然后再进行规划,例如采取手段或其他方式。
  • 我想使用散点图来避免聚合数据。这些变量具有相同的 x 轴变量但不同的 y 轴变量。
  • 我不想要分组的折线图。而且我认为制作条形图可以通过按月分组来补充散点图,但这是一个单独的问题。

标签: python datetime matplotlib seaborn scatter-plot


【解决方案1】:

让我们从设置您的数据开始。实际上,我在您的示例数据集中添加了另一个日期“2014-12-31”,以便我们可以在同一天收到多个请求时验证我们的绘图例程是否有效:

import matplotlib.pyplot as plt
plt.style.use('seaborn')
import pandas as pd
import numpy as np

dates = np.array(['2012-08-01', '2014-12-31',
                  '2014-12-31', '2015-02-25',
                  '2015-10-15'], dtype='datetime64')

days = np.array([41, 692, 50, 621, 111])

df = pd.DataFrame({'Received' : dates, 'Days' : days})

创建的数据框应该与您拥有的数据相近。生成您想要的散点图现在很简单:

fig, ax = plt.subplots(1, 1)

ax.scatter(df['Received'], df['Days'], marker='+')
ax.set_xlabel("Receieved")
ax.set_ylabel("Days")

这给了我以下情节:

正如@ImportanceOfBeingErnest 在下面的 cmets 中所指出的,您需要最新版本的 pandas 才能使此例程正常工作。

【讨论】:

  • 有趣。这在 numpy 和 matplotlib 的哪些版本中有效?
  • 我用 (matplotlib 3.0.2, numpy 0.15.4), (2.2.3, 0.15.2), (2.0.2, 0.14.5) 进行了测试,但它失败了 TypeError: invalid type promotion错误。
  • 我正在运行 matplotlib 3.0.2 和 numpy 1.16.1。我也在运行 pandas 0.24.1。我认为这与 pandas 如何在 pandas 和 matplotlib 之间转换日期有关。
  • 您的 numpy 版本似乎很遥远。您的意思是您在 numpy 1.15.4, 1.15.2,... 而不是 0.15.4, 0.15.2,... 上进行测试?
  • 是的,将每个零替换为一。太好了,希望 1.16.1 足够稳定,可以很快添加到 conda 默认频道。
【解决方案2】:

您遇到了两个不起作用的情况。 sns.regplot 不适用于日期。而plt.plot 需要指定数据(它无法仅通过列名知道要使用哪些数据)。

因此,以下任何一项都会为您提供数据的散点图

  • sns.scatterplot(x="Received", y="days", data=simple_denied, marker="+")
  • sns.scatterplot(x=simple_denied["Received"], y=simple_denied["days"], marker="+")

  • plt.scatter(simple_denied["Received"].values, simple_denied["days"].values, marker="+")

  • plt.plot(simple_denied["Received"].values, simple_denied["days"].values, marker="+", ls="")

  • plt.plot("Received", "days", data=simple_denied, marker="+", ls="")

【讨论】:

  • 谢谢您,plt.scatter(simple_denied["Received"].values, simple_denied["days"].values, marker="+") 有效。即使我 pip 安装了最新的 seaborn 包,sns 图都给了我错误AttributeError: module 'seaborn' has no attribute 'scatterplot'。另外两个 plt.plot() 创建空白图。如果我遗漏了什么,请告诉我。
  • 关于 seaborn,是的,scatterplot 是相当新的。所以可能你的更新不成功。对于plot 命令,也许你的matplotlib 版本太旧了?
  • 坐标轴上的数字是否与您期望的数据值范围相对应?您可以尝试减少数据集以查看是否有所不同(例如,使用df.head() 而不是df)?您可以尝试使用不同的marker 吗?还要确保实际使用您认为使用的版本,方法是在代码print(<package>.__version__) 中打印并与您期望的进行比较。
猜你喜欢
  • 2020-09-03
  • 2018-04-13
  • 2018-07-01
  • 2018-08-10
  • 2020-04-10
  • 1970-01-01
  • 2018-04-24
  • 2014-06-02
  • 2021-09-19
相关资源
最近更新 更多