在搜索previous question的解决方案时(显然已经解决了),我遇到了另一个问题,但仍未解决。我非常感谢任何可以帮助我解决问题的人!
有人认为我使用的是matplotlib 1.5.1的过时版本,但我现在更新到2.1.1以及numpy到1.14.0,这对我没有帮助,唉。
所以,再一次。我有一个CSV文件作为输入:
16,59,55,51 13.8
17,00,17,27 13.7
17,00,39,01 13.6
17,01,01,06 13.4
我在上面运行这个python脚本:
import matplotlib.pyplot as plt
import csv
from datetime import time
x = []
y = []
with open('calibrated.csv','r') as csvfile:
plots = csv.reader(csvfile, delimiter=' ')
for row in plots:
hours,minutes,seconds,milliseconds = [int(s) for s in row[0].split(",")]
x.append(time(hours,minutes,seconds,milliseconds))
y.append(float(row[1]))
plt.plot(x,y, marker='o', label='brightness')
plt.gca().invert_yaxis()
plt.xlabel('time [UT]')
plt.ylabel('brightness [mag, CR]')
plt.legend()
plt.grid()
plt.show()
我得到了这个TypeError(而解决我之前问题的人没有它!):
Traceback (most recent call last):
File "lightcurve.py", line 16, in <module>
plt.plot(x,y, marker='o', label='brightness')
File "/usr/local/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 3154, in plot
ret = ax.plot(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/matplotlib/__init__.py", line 1812, in inner
return func(ax, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/matplotlib/axes/_axes.py", line 1425, in plot
self.add_line(line)
File "/usr/local/lib/python2.7/dist-packages/matplotlib/axes/_base.py", line 1708, in add_line
self._update_line_limits(line)
File "/usr/local/lib/python2.7/dist-packages/matplotlib/axes/_base.py", line 1730, in _update_line_limits
path = line.get_path()
File "/usr/local/lib/python2.7/dist-packages/matplotlib/lines.py", line 925, in get_path
self.recache()
File "/usr/local/lib/python2.7/dist-packages/matplotlib/lines.py", line 612, in recache
x = np.asarray(xconv, np.float_)
File "/usr/local/lib/python2.7/dist-packages/numpy/core/numeric.py", line 531, in asarray
return array(a, dtype, copy=False, order=order)
TypeError: float() argument must be a string or a number
我被困在那里。
答案 0 :(得分:2)
使用matplotlib 2.1和numpy 1.13,问题中的代码可以正常工作。
为什么大多数人能够无错误地运行代码的合理解释可能是matplotlib依赖于pandas来绘制datetime.time
个对象。如果未安装或未找到pandas,则会失败。
代码中隐含了一些假设,这可能会导致问题和错误。这就是单独的时间可能无法在matplotlib轴上很好地表示,这通常会期望日期时间(即包括日期)对象。
在轴上引入一些日期可能会解决问题。
import io
u = u"""16,59,55,51 13.8
17,00,17,27 13.7
17,00,39,01 13.6
17,01,01,06 13.4"""
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import csv
from datetime import datetime
x = []
y = []
plots = csv.reader(io.StringIO(u), delimiter=' ')
for row in plots:
hours,minutes,seconds,milliseconds = [int(s) for s in row[0].split(",")]
x.append(datetime(2018,1,1,hours,minutes,seconds,milliseconds))
y.append(float(row[1]))
plt.plot(x,y, marker='o', label='brightness')
plt.gca().invert_yaxis()
plt.xlabel('time [UT]')
plt.ylabel('brightness [mag, CR]')
plt.legend()
plt.grid()
hours = mdates.SecondLocator(bysecond=[0,30])
t_fmt = mdates.DateFormatter('%H:%M:%S')
plt.gca().xaxis.set_major_locator(hours)
plt.gca().xaxis.set_major_formatter(t_fmt)
plt.show()
答案 1 :(得分:0)
matplotlib 有一个名为 plot_date 的内置函数,可以帮到你。请注意,您的时间序列必须采用日期 - 时间格式(尽管您可以任意添加年,月和日,因为如果所有时间都在同一天,它们不会影响绘图。)
以下是代码:
import matplotlib.pyplot as plt
import csv
import datetime
x = []
y = []
with open('calibrated.csv','r') as csvfile:
plots = csv.reader(csvfile, delimiter=' ')
year = 2017
month = 1
day = 16
for row in plots:
hours,minutes,seconds,milliseconds = [int(s) for s in row[0].split(",")]
x.append(datetime.datetime(year,month,day,hours,minutes,seconds,milliseconds))
y.append(float(row[1]))
plt.plot_date(x,y, marker='o', label='brightness')
plt.gca().invert_yaxis()
plt.xlabel('time [UT]')
plt.ylabel('brightness [mag, CR]')
plt.legend()
plt.grid()
plt.show()
正如coldspeed指出,使用 pandas 可能会大大受益。
请注意,现在如果时间序列更长,则情节仍能正常运作。
感谢@ImportanceOfBeingErnest指出最初的误解。