我已经有一天半了,我想是时候打电话求助了。以下代码给出了错误:
TypeError:
float()
参数必须是字符串或数字,而不是'datetime.datetime'
我尝试通过动画函数将函数frames1中生成的datetime
变量放在x轴上。
代码:
import random
import time
from matplotlib import pyplot as plt
from matplotlib import animation
import datetime
# Plot parameters
fig, ax = plt.subplots()
line, = ax.plot([], [], 'k-', label = 'ABNA: Price', color = 'blue')
legend = ax.legend(loc='upper right',frameon=False)
plt.setp(legend.get_texts(), color='grey')
ax.margins(0.05)
ax.grid(True, which='both', color = 'grey')
# Creating data variables
x = []
y = []
x.append(1)
y.append(1)
def init():
line.set_data(x[:1],y[:1])
return line,
def animate(args):
# Args are the incoming value that are animated
animate.counter += 1
i = animate.counter
win = 60
imin = min(max(0, i - win), len(x) - win)
x.append(args[0])
y.append(args[1])
xdata = x[imin:i]
ydata = y[imin:i]
line.set_data(xdata, ydata)
line.set_color("red")
plt.title('ABNA CALCULATIONS', color = 'grey')
plt.ylabel("Price", color ='grey')
plt.xlabel("Time", color = 'grey')
ax.set_facecolor('black')
ax.xaxis.label.set_color('grey')
ax.tick_params(axis='x', colors='grey')
ax.yaxis.label.set_color('grey')
ax.tick_params(axis='y', colors='grey')
ax.relim()
ax.autoscale()
return line, #line2
animate.counter = 0
def frames1():
# Generating time variable
x = 10
target_time = datetime.datetime.now().strftime("%d %B %Y %H:%M:%000")
# Extracting time
FMT = "%d %B %Y %H:%M:%S"
target_time = datetime.datetime.strptime(target_time, FMT)
target_time = target_time.time().isoformat()
# Converting to time object
target_time = datetime.datetime.strptime(target_time,'%H:%M:%S')
while True:
# Add new time + 60 seconds
target_time = target_time + datetime.timedelta(seconds=60)
x = target_time
y = random.randint(250,450)/10
yield (x,y)
time.sleep(random.randint(2,5))
anim = animation.FuncAnimation(fig, animate,init_func=init,frames=frames1)
plt.show()
我尝试了以下解决方案:
Plotting dates on the x-axis with Python's matplotlib
Changing the formatting of a datetime axis in matplotlib
到目前为止没有积极的结果。
我非常感谢你提前看到这个问题。
答案 0 :(得分:0)
不确定为什么首先将1
附加到数组中。我想你的意思是
# Creating data variables
x = []
y = []
x.append(datetime.datetime.now())
y.append(1)
然后在生成器功能中,有很多我不明白。对我来说,似乎你可以省略大部分的来回转换,只需使用now()
。
def frames1():
# Generating time variable
target_time = datetime.datetime.now()
while True:
# Add new time + 60 seconds
target_time = target_time + datetime.timedelta(seconds=60)
x = target_time
y = random.randint(250,450)/10
yield (x,y)
time.sleep(random.randint(2,5))
然而,您可以将轴格式化为显示时间而不是数字。在init
功能中,您可以添加
line.axes.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M:%S"))
您已将matplotlib.dates
导入为mdates
。
行imin = min(max(0, i - win), len(x) - win)
似乎没有多大意义,为什么不单独使用max(0, i - win)
?
总的来说,一个工作版本看起来像这样:
import random
import time
from matplotlib import pyplot as plt
import matplotlib.dates as mdates
from matplotlib import animation
import datetime
# Plot parameters
fig, ax = plt.subplots()
line, = ax.plot([], [], 'k-', label = 'ABNA: Price', color = 'blue')
legend = ax.legend(loc='upper right',frameon=False)
plt.setp(legend.get_texts(), color='grey')
ax.margins(0.05)
ax.grid(True, which='both', color = 'grey')
# Creating data variables
x = [datetime.datetime.now()]
y = [1]
def init():
line.set_data(x[:1],y[:1])
line.axes.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M:%S"))
return line,
def animate(args):
# Args are the incoming value that are animated
animate.counter += 1
i = animate.counter
win = 60
imin = max(0, i - win)
x.append(args[0])
y.append(args[1])
xdata = x[imin:i]
ydata = y[imin:i]
line.set_data(xdata, ydata)
line.set_color("red")
plt.title('ABNA CALCULATIONS', color = 'grey')
plt.ylabel("Price", color ='grey')
plt.xlabel("Time", color = 'grey')
ax.set_facecolor('black')
ax.xaxis.label.set_color('grey')
ax.tick_params(axis='x', colors='grey')
ax.yaxis.label.set_color('grey')
ax.tick_params(axis='y', colors='grey')
ax.relim()
ax.autoscale()
return line,
animate.counter = 0
def frames1():
# Generating time variable
target_time = datetime.datetime.now()
while True:
# Add new time + 60 seconds
target_time = target_time + datetime.timedelta(seconds=60)
x = target_time
y = random.randint(250,450)/10
yield (x,y)
time.sleep(random.randint(2,5))
anim = animation.FuncAnimation(fig, animate,init_func=init,frames=frames1)
plt.show()