【问题标题】:multi colored Heat Map error Python多色热图错误Python
【发布时间】:2015-07-16 01:50:58
【问题描述】:

我正在尝试通过从文件中读取数据来绘制具有多种颜色的热图。我可以很好地生成 2D 和正常的热图,但无法绘制像附加图像一样的图。当使用随机数时,我可以绘制它,但是在从文件中读取数据时它显示错误。

上面的热图是用随机数据生成的

输入:col[1]col[2]xy 坐标

00022d9064bc 819251 440006 1073260801 1073260803 2.0 
00022dba8f51 819251 440006 1073260801 1073260803 2.0 
00022de1c6c1 819251 440006 1073260801 1073260803 2.0 
003065f30f37 819251 440006 1073260801 1073260803 2.0 
00904b48a3b6 819251 440006 1073260801 1073260803 2.0 
00904b83a0ea 819213 439954 1073260803 1073260810 7.0 
00904b85d3cf 817526 439458 1073260803 1073261920 1117.0 
00904b14b494 817558 439525 1073260804 1073265410 4606.0 
00904b99499c 817558 439525 1073260804 1073262625 1821.0 
00904bb96e83 817558 439525 1073260804 1073265163 4359.0 
00904bf91b75 817558 439525 1073260804 1073263786 2982.0 
00022d36a6df 820428 438735 1073260807 1073260809 2.0 

代码:

from matplotlib import pyplot as plt 
from matplotlib import cm as CM
from matplotlib import mlab as ml
import numpy as np 

data = np.loadtxt('inputfile', unpack=True, dtype='str, int, int, int, int, float')

x  = data[1]
y  = data[2]

X, Y = np.meshgrid(x,y)

x = X.ravel()
y = Y.ravel()

gridsize = 30 
plt.subplot(111)

cb = plt.colorbar()
cb.set_label('density')
plt.show() 

错误:

Traceback (most recent call last):
  File "heat3.py", line 11, in <module>
    X, Y = np.meshgrid(x,y)
  File "/usr/lib/python2.7/dist-packages/numpy/lib/function_base.py", line 3106, in meshgrid
    mult_fact = np.ones(shape, dtype=int)
  File "/usr/lib/python2.7/dist-packages/numpy/core/numeric.py", line 178, in ones
    a = empty(shape, dtype, order)
MemoryError

任何有用的建议表示赞赏

【问题讨论】:

  • 请说明是否要在数据点之间进行插值(换句话说,数据文件中的列之一是“z”值),或者是否要制作 2D 直方图。
  • @chthonicdaemon 我可以将col[5] 保留为 Z 值

标签: python file numpy heatmap


【解决方案1】:

您看到的错误来自meshgrid 试图构建可能非常庞大的矩阵。如果您的数据包含N 行,则矩阵将为 N×N。根据您拥有的点数和它们的密集程度,您将需要热图中的两件事之一。要么

  1. 您想在相距很远的点之间进行插值以形成光滑的表面,或者
  2. 您希望通过计算特定区域中有多少落下的点来聚合密集点(二维直方图)。

我已经修改了下面的代码以适用于第二种情况(hexbin 会自动执行此操作),因为您似乎没有在数据中引用第三个值进行插值。

from matplotlib import pyplot as plt 
from matplotlib import cm as CM
from matplotlib import mlab as ml
import numpy as np 

data = np.loadtxt('inputfile', unpack=True, dtype='str, int, int, int, int, float')

x = data[1]
y = data[2]
z = data[5]

# These lines are completely unnecessary and perhaps come
# from a different solution which was interpolating between points
#X, Y = np.meshgrid(x,y)
#x = X.ravel()
#y = Y.ravel()

gridsize = 30 
#plt.subplot(111)  # <- You don't need this as it is one plot anyway
plt.hexbin(x, y, C=z)   # <- You need to do the hexbin plot
cb = plt.colorbar()
cb.set_label('density')
plt.show() 

我在上面注释掉的残留meshgrid 调用可能来自您在某处找到的执行第一个选项(在间隔点之间插值)的一段代码,也许是我使用griddata。如果这确实是你想要的,你可以看看这个cookbook entry关于网格化不规则间隔数据

【讨论】:

  • 我可以很好地绘制 2D 直方图 .. 但我需要绘制图像中显示的东西。数据文件有超过 3000 万个条目。我将有多个这样的文件,所以我的下一个计划是用不同的颜色绘制每个输入文件。
  • 我修改了代码以计算每个单元格中 z 值的平均值,这正是您想要的。如果这不是您想要的,我很乐意为您提供帮助,但您需要更具体地了解您想要绘制的内容(您发布的示例图片没有提供有关 how 的任何信息i> 它是开发出来的)
  • 非常感谢您的帮助.. 我会尝试代码并回复我得到的。但我真的很感激,因为我也知道我错过了哪一部分。
猜你喜欢
  • 2016-07-20
  • 2019-03-08
  • 2020-02-13
  • 2018-01-23
  • 2017-12-02
  • 2021-01-11
  • 2022-12-16
  • 2016-11-21
  • 2015-09-14
相关资源
最近更新 更多