基于额外变量的matplotlib绘图(非散点)颜色

2024-09-30 19:36:04 发布

您现在位置:Python中文网/ 问答频道 /正文

再见

我试图绘制两个数组(timesinlocations)作为散点。但是,由于timesin是一个日期时间对象(我只需要时间),我发现我只能使用pyplot.plot()而不是{}来正确地绘制它。当我想用第三个变量idx给这个图上的点着色时,这个问题就会出现。我知道pyplot.scatter()能够做到这一点{a1},但我不知道如何用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:

^{pr2}$

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

谢谢

更新:

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


Tags: 对象importdatetimeplotmatplotlibnp时间绘制
2条回答

如果你用散开(). 但您需要将日期时间转换为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,您可以使用散开()

我认为这是不可能同时做这件事的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()

产生:

enter image description here

这种方法的唯一缺点是,如果有几个粒子,则遍历所有粒子的过程可能相对较慢。在

编辑(针对@Nathan Goedeke的评论

我尝试了相同的实现,但是使用了一个datetime对象:

^{pr2}$

它也起作用。在

相关问题 更多 >