美好的一天,
我试图绘制两个数组(timesin
和locations
)作为点的分散。但是,因为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()
解释为条件着色?
由于
更新
正如Hun所建议的那样,我实际上可以通过使用matplotlibs日期库将datetime对象转换为数字来在此上下文中使用pyplot.scatter()
。因此,找出如何使用pyplot.plot()
进行条件着色是不必要的。
答案 0 :(得分:2)
如果使用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()
答案 1 :(得分:0)
我认为不可能使用matplotlib.pyplot.plot立即执行此操作。但是,这是我的解决方案:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
def scatterplot(x,y,prop):
prop = cm.jet((prop-np.min(prop))/(np.max(prop)-np.min(prop)))
ax = plt.gca()
for i in xrange(len(x)):
ax.plot(x[i],y[i],color=prop[i], marker='o')
return
x = np.random.rand(100)
y = np.random.rand(100)
prop = -20+40*np.random.rand(100)
fig = plt.figure(1,figsize=(5,5))
ax = fig.add_subplot(111)
scatterplot(x,y,prop)
plt.show()
产生:
这种方法的唯一缺点是,如果你有几个粒子,那么遍历所有粒子的过程可能会相对较慢。
编辑(回应@Nathan Goedeke的评论:
我尝试了相同的实现,但使用了datetime对象:
import numpy as np
import matplotlib.pyplot as plt
import datetime as dt
x = np.array([dt.datetime(2016, 10, 19, 10, 0, 0),
dt.datetime(2016, 10, 19, 10, 0, 1),
dt.datetime(2016, 10, 19, 10, 0, 2),
dt.datetime(2016, 10, 19, 10, 0, 3)])
fig = plt.figure()
y = np.array([1, 3, 4, 2])
prop = np.array([2.,5.,3.,1.])
scatterplot(x,y,prop)
plt.show()
也可以。