【问题标题】:matplotlib 3d scatter plot datematplotlib 3d 散点图日期
【发布时间】:2017-03-08 16:49:25
【问题描述】:

我有一个格式为15/10/2017的日期列表

我已经尝试了以下

from matplotlib import pyplot
import pandas as pd

dates = ['15/10/2016', '16/10/2016', "17/10/2015", "15/10/2014"]
dates_formatted = [pd.to_datetime(d) for d in dates ]
x = [1,2,3,4]
z = [5,6,7,8]

pyplot.scatter(x, dates_formatted, z)
pyplot.show()

它会抛出一个错误TypeError: ufunc 'sqrt' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

它显示它是否是 2D。例如pyplot.scatter(x, dates_formatted)

我也尝试了以下

ax = Axes3D(fig)
ax = fig.add_subplot(111,projection='3d')
ax.scatter(x, dates_formatted, y)
pyplot.show()

它会抛出一个错误Float() argument must be a string or number

【问题讨论】:

  • 我怀疑您实际上是在调用常规 Axes 对象的 scatter 方法。尝试使用ax = fig.add_subplot(111,projection='3d') 创建一个Axes3d 对象,然后执行您已完成的操作。
  • 试过了,更新了问题

标签: python matplotlib plot


【解决方案1】:

告诉matplotlib 如何将字符串转换为坐标系并非易事。为什么不简单地为轴设置自定义刻度标签?

import pandas as pd
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

fig = plt.figure('scatter dates')
ax = fig.add_subplot(111, projection='3d')
dates = ['15/10/2016', '16/10/2016', "17/10/2015", "15/10/2014"]
dates_formatted = [pd.to_datetime(d) for d in dates ]
x = [1,2,3,4]
y = [9,10,11,12]
z = [5,6,7,8]

ax.scatter(x, y, z)
ax.xaxis.set_ticks(x)
ax.xaxis.set_ticklabels(dates_formatted)
plt.show()

【讨论】:

  • 因此,如果我正确理解了解决方案,x 上的值列表只是任意数字,因此我们符合 scatter() 函数支持的值。此后,我们只需要为x 轴设置一个自定义标签(日期)来“替换”这些值。
  • @MaTaKazer 差不多,是的。原则上,您也可以直接从时间字符串中计算 x 值,这将是一种更有意义的方式。
【解决方案2】:

Scatter 需要一个数字。因此,您可以将日期转换为如下数字:

y = [ (d-min(dates_formatted)).days for d in dates_formatted]

现在您可以将数据绘制为

pyplot.scatter(x, y)

对于 3D 绘图,您可以尝试这样的操作...

import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

plt.ion()
x = [1,2,3,4]
z = [5,6,7,8]
dates = ['15/10/2016', '16/10/2016', "17/10/2015", "15/10/2014"]
dates_formatted = [pd.to_datetime(d) for d in dates]

y = [ (d-min(dates_formatted)).days for d in dates_formatted]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
plt.scatter(x, y, z)

现在的 y 轴以天为单位。您可以通过查找日期字符串并将其更改回来来更改它...

dt = [ pd.Timedelta(d) + min(dates_formatted)  for d in  ax.get_yticks()]

将这些转换成字符串 ...

dtStr = [d.isoformat() for d in dt]

然后放回去

ax.set_yticklabels(dtStr)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2021-10-21
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多