pythonnumpy:基于坐标创建二维值数组,并使用pcolormesh、heatplolt打印

pythonnumpy:基于坐标创建二维值数组,并使用pcolormesh、heatplolt打印,python,arrays,numpy,matplotlib,Python,Arrays,Numpy,Matplotlib,我有一个纬度(Lat)和一个Lonitude的数组,这两个数组都是1D数组,形状都是5。 然后我有另一个值为C的数组,这也是一个1D数组,形状为5。我想在最后用pcolormesh绘制洞的东西,这样一种热图图 以下是相应的代码: import numpy as np import matplotlib.pyplot as plt In [13]: # Data Lat = np.array([-65.62282562, -65.62266541, -65.62241364, -65.62398

我有一个纬度(Lat)和一个Lonitude的数组,这两个数组都是1D数组,形状都是5。 然后我有另一个值为C的数组,这也是一个1D数组,形状为5。我想在最后用pcolormesh绘制洞的东西,这样一种热图图

以下是相应的代码:

import numpy as np
import matplotlib.pyplot as plt
In [13]:

# Data
Lat = np.array([-65.62282562, -65.62266541, -65.62241364, -65.62398529, -65.62410736])
Lon = np.array([145.28251648, 145.38883972, 145.49528503, 121.4509201, 121.55738068, 121.66372681])
C = np.array([0., 0.5, 2, 3, 0])


# Plot
plt.pcolormesh(X, Y, C)
然后我得到以下错误

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-164126d430da> in <module>()
      1 # Plot
----> 2 plt.pcolormesh(X, Y, C)

/home/unix/anaconda2/lib/python2.7/site-packages/matplotlib/pyplot.pyc in pcolormesh(*args, **kwargs)
   3091         ax.hold(hold)
   3092     try:
-> 3093         ret = ax.pcolormesh(*args, **kwargs)
   3094     finally:
   3095         ax.hold(washold)

/home/unix/anaconda2/lib/python2.7/site-packages/matplotlib/__init__.pyc in inner(ax, *args, **kwargs)
   1810                     warnings.warn(msg % (label_namer, func.__name__),
   1811                                   RuntimeWarning, stacklevel=2)
-> 1812             return func(ax, *args, **kwargs)
   1813         pre_doc = inner.__doc__
   1814         if pre_doc is None:

/home/unix/anaconda2/lib/python2.7/site-packages/matplotlib/axes/_axes.pyc in pcolormesh(self, *args, **kwargs)
   5393         allmatch = (shading == 'gouraud')
   5394 
-> 5395         X, Y, C = self._pcolorargs('pcolormesh', *args, allmatch=allmatch)
   5396         Ny, Nx = X.shape
   5397 

/home/unix/anaconda2/lib/python2.7/site-packages/matplotlib/axes/_axes.pyc in _pcolorargs(funcname, *args, **kw)
   4993         if len(args) == 3:
   4994             X, Y, C = [np.asanyarray(a) for a in args]
-> 4995             numRows, numCols = C.shape
   4996         else:
   4997             raise TypeError(

ValueError: need more than 1 value to unpack
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
1#图
---->2 plt.pcolormesh(X,Y,C)
/pcolormesh中的home/unix/anaconda2/lib/python2.7/site-packages/matplotlib/pyplot.pyc(*args,**kwargs)
3091斧头保持(保持)
3092尝试:
->3093 ret=ax.pcolormesh(*args,**kwargs)
3094最后:
3095斧头保持(洗旧)
/home/unix/anaconda2/lib/python2.7/site packages/matplotlib/__init__.pyc在内部(ax,*args,**kwargs)
1810警告。警告(消息%(标签名称,功能名称),
1811运行时警告,堆栈级别=2)
->1812返回函数(ax,*args,**kwargs)
1813预付款单=内部付款单__
1814如果pre_doc为无:
/pcolormesh(self,*args,**kwargs)中的home/unix/anaconda2/lib/python2.7/site-packages/matplotlib/axes//u axes.pyc
5393 allmatch=(着色='gouraud')
5394
->5395 X,Y,C=self.\u pcolorargs('pcolormesh',*args,allmatch=allmatch)
5396 Ny,Nx=X.shape
5397
/home/unix/anaconda2/lib/python2.7/site-packages/matplotlib/axes//u axes.pyc in\u pcolorargs(funcname,*args,**kw)
4993如果len(args)==3:
4994 X,Y,C=[np.asanyarray(a)表示args中的a]
->4995个numRows,numCols=C.shape
4996其他:
4997上升类型错误(
ValueError:需要超过1个值才能解包

所以我想给每个X-Y对一个C值,所以有5个XY对和5个C值。理论上这应该没有问题,但我真的找不到解决方案!

pcolormesh
用于绘制网格。网格是值的网格(对于
lat
lon
C
),和
pcolormesh
将绘制连接网格内相邻值的线和四边形


您没有网格(2d),最多只能有一条多段线(1d)。该多段线包含的信息不足以生成唯一的热图。

您有两个问题,一个是逻辑问题,另一个是调用
pcolormesh
时的问题:

第一个是
C
Lat
包含5个值,但是
Lon
包含6个值。这意味着你没有5个XY值和5个C值,所以你应该解决这个问题

但如果正确展开坐标,则可以创建具有多个不同坐标的pcolormesh:

import numpy as np
import matplotlib.pyplot as plt

plt.figure()

# Data
Lat = np.array([-65.62282562, -65.62266541, -65.62241364, -65.62398529, -65.62410736])
Lon = np.array([145.28251648, 145.38883972, 145.49528503, 121.4509201, 121.55738068])
C = np.array([0., 0.5, 2, 3, 0])

# Plot
plt.pcolormesh(np.expand_dims(Lat, 0), np.expand_dims(Lon, 1), C*np.eye(5))
expand_dims
将使尺寸正确地相互传播,而
np.eye
确保正确的值将具有您在
C
中指定的值,并且所有其他坐标将为零

但是输出可能不会很好,因为这是一个非常稀疏的坐标帧

除了pcolormesh,还有其他替代方法,特别是加权直方图可能是感兴趣的或轮廓:

Lat = np.random.normal(-65, 2, 50000)
Lon = np.random.normal(130, 5, 50000)
C = np.random.randint(0, 10, 50000)

plt.figure()
plt.hexbin(Lat, Lon, C=C, cmap=plt.cm.hot)

Pcolormesh旨在与2D变量一起使用。如果将np.eye用于具有大量数据的变量(如实际情况),则可能会遇到内存问题。 可以通过以下方式使用散射来获得类似于具有1D数组的pcolormesh的结果,该一维数组具有与两个数组相同的形状,并且其值出现在两个数组的每对值上

import numpy as np
import matplotlib.pyplot as plt

# Data
Lat = np.array([-65.62282562, -65.62266541, -65.62241364, -65.62398529, -65.62410736])
Lon = np.array([145.28251648, 145.38883972, 145.49528503, 121.4509201, 121.55738068])
X=np.array(Lat[:]).tolist()
Y=np.array(Lon[:]).tolist()
C = np.array([0., 0.5, 2, 3, 0])
C = np.array(C[:]).tolist()
# Plot
plt.scatter(X, Y, c=C, s=10)

因此,这意味着我一般不能用pcolormesh来绘制它?我是用多段线来绘制它还是怎样绘制它?是的,我很抱歉Lon也应该只包含5个值!稀疏坐标系是因为我的真实示例有更多的Lat和Lon值以及相应的C值(7933值)。因此我从(-65.62282562到-65.62416077),我有从(145.28251648到121.66372681)的Lon值,两者的形状都是(7933)。-->“稀疏坐标系”复制原始数组有点不好,抱歉!您提供的示例适用于我的(7933值)数据使用pcolormesh,但这需要很长时间!最终是否有其他方法不需要那么长时间?我在答案中包含了一个
hexbin
的示例。如果您想要快速图像,您可能需要存储您的值。谢谢,我使用pcolormesh创建了存储箱,其范围约为200个值,效果非常好!