美好的一天,

我正在尝试绘制两个数组(timesinlocations)作为点的散布。但是,由于timesin是日期时间对象(仅我想要时间),因此我发现只能使用pyplot.plot()而不是pyplot.scatter()正确绘制它。当我想用第三个变量idx为该绘图上的点着色时,问题就出现了。我知道pyplot.scatter()可以做到quite easily,但是我不知道如何使用pyplot.plot()做到这一点。

我的代码摘录:

import os
import tempfile
from datetime import datetime
import numpy as np
os.environ['MPLCONFIGDIR'] = tempfile.mkdtemp()

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages

pp = PdfPages('output.pdf')
names = ['WestHall', 'Elevator', 'EastHall', 'MathLounge']
locations = np.arange(4)+1
plt.scatter(timesin, locations, c=idx, marker="o")
plt.xlabel("Time of day")
plt.ylabel("Location")
plt.yticks(np.arange(4)+1, names)
plt.gcf().autofmt_xdate()
pp.savefig()
plt.close()
pp.close()


尝试此操作时,出现错误,因为它尝试将idx解释为rgba:

ValueError: to_rgba: Invalid rgba arg "[...]"
number in rbg sequence outside 0-1 range


如何在不使用idx的情况下将pyplot.scatter()解释为有条件的着色?

谢谢

更新:

正如洪恩建议的那样,实际上我可以在此上下文中使用pyplot.scatter(),方法是使用matplotlibs日期库将datetime对象转换为数字。因此,无需弄清楚如何使用pyplot.plot()进行条件着色。

最佳答案

如果使用plt.scatter()会更容易。但是您需要将日期时间转换为scatter()可以理解的内容。有一种方法可以做到。

>>> dt # datetime numpy array
array(['2005-02-01', '2005-02-02', '2005-02-03', '2005-02-04'], dtype='datetime64[D]')

>>> dt.tolist() # need to be converted to list
[datetime.date(2005, 2, 1), datetime.date(2005, 2, 2), datetime.date(2005, 2, 3), datetime.date(2005, 2, 4)]

# convert the list to internal time information for matplotlib. But this is float.
>>> dt1 = matplotlib.dates.date2num(dt.tolist())
array([ 731978.,  731979.,  731980.,  731981.])


通过此dt1,您可以使用plt.scatter()

关于python - 基于额外变量的matplotlib图(不分散)颜色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36534263/

10-12 21:13