2011-06-17 42 views
4

我的问题与this one几乎完全相似。 但是,我不满意答案,因为我想生成一个实际的热图,而没有明确地装箱数据。使用散点数据集在MatPlotLib中生成热图

准确地说,我想显示散点图数据和自定义内核(如1/x^2)之间卷积结果的函数。

我该如何使用matplotlib实现这个功能?

编辑:基本上,我所做的是this。结果是here。我想保留所有内容,轴,标题,标签等。基本上只是改变情节,就像我描述的那样,而尽可能少地重新实施。

+2

你想指导或实际的代码?你试过什么了? – Trufa

+0

你看过'scipy.stats.gaussian_kde'吗? http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.gaussian_kde.html它确实是你想要的。 (虽然它使用'exp(-x)'而不是'1/x^2')。你需要定制它来使用高斯内核以外的东西,但这并不难。 –

+0

@Trufa:查看我的编辑。 –

回答

13

使用matplotlib.dats.date2num将您的时间序列数据转换为数字格式。放下一个跨越你的x和y范围的矩形网格,并对该图进行卷积。制作卷积的伪彩色图,然后将x标签重新格式化为日期。

标签格式有点杂乱,但相当好documented。你只需要用DateFormatter和一个合适的格式化字符串替换AutoDateFormatter。

你需要调整数据卷积中的常量。

import numpy as np 
import datetime as dt 
import pylab as plt 
import matplotlib.dates as dates 

t0 = dt.date.today() 
t1 = t0+dt.timedelta(days=10) 

times = np.linspace(dates.date2num(t0), dates.date2num(t1), 10) 
dt = times[-1]-times[0] 
price = 100 - (times-times.mean())**2 
dp = price.max() - price.min() 
volume = np.linspace(1, 100, 10) 

tgrid = np.linspace(times.min(), times.max(), 100) 
pgrid = np.linspace(70, 110, 100) 
tgrid, pgrid = np.meshgrid(tgrid, pgrid) 
heat = np.zeros_like(tgrid) 

for t,p,v in zip(times, price, volume): 
    delt = (t-tgrid)**2 
    delp = (p-pgrid)**2 
    heat += v/(delt + delp*1.e-2 + 5.e-1)**2 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.pcolormesh(tgrid, pgrid, heat, cmap='gist_heat_r') 

plt.scatter(times, price, volume, marker='x') 

locator = dates.DayLocator() 
ax.xaxis.set_major_locator(locator) 
ax.xaxis.set_major_formatter(dates.AutoDateFormatter(locator)) 
fig.autofmt_xdate() 

plt.show() 

Script output

+0

非常感谢您的回答!我只关心你的答案:我如何保持我当前版本中的好轴标签? (请参阅我的编辑) –

+1

我会将时间序列数据转换为数字表示形式,例如datetime.date.today()。toordinal()或matplotlib.dates.date2num()。 pcolormesh()。然后弄清楚如何格式化x标签。这最后一部分让我难住了。 – matt

+0

非常感谢您的详细解答! –