Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib:`pcolormesh.get_array()`返回平坦数组-如何返回二维数据?_Python_Numpy_Matplotlib - Fatal编程技术网

Python Matplotlib:`pcolormesh.get_array()`返回平坦数组-如何返回二维数据?

Python Matplotlib:`pcolormesh.get_array()`返回平坦数组-如何返回二维数据?,python,numpy,matplotlib,Python,Numpy,Matplotlib,我试图沿着一条直线获取数据值(如中所示)。该示例使用了imshow(),但我目前正在使用pcolormesh()进行绘图 我发现从pcolormesh()获取打印数据的get_array()函数返回的是我的数据的一维平坦数组,而不是原始(或截断的)二维数据 例如: D = np.genfromtxt(DataFilePath, skip_header=4, delimiter=',', unpack=True) print( D.shape ) : (500, 500) ...more cod

我试图沿着一条直线获取数据值(如中所示)。该示例使用了
imshow()
,但我目前正在使用
pcolormesh()
进行绘图

我发现从
pcolormesh()
获取打印数据的
get_array()
函数返回的是我的数据的一维平坦数组,而不是原始(或截断的)二维数据

例如:

D = np.genfromtxt(DataFilePath, skip_header=4, delimiter=',', unpack=True)
print( D.shape )
: (500, 500)

...more code...

img = ax[0].pcolormesh( np.arange( len(D[0,:]) ), np.arange(len(D[:,0])), D)

>>> D
: array([[ 42.38,  41.93,  41.92, ...,  41.73,  41.74,  41.51],
       [ 41.88,  42.24,  42.21, ...,  41.88,  41.67,  41.64],
       [ 42.4 ,  41.47,  41.49, ...,  41.92,  42.07,  41.49],
       ..., 
       [ 44.24,  44.14,  44.17, ...,  40.2 ,  40.68,  40.67],
       [ 44.59,  44.24,  44.3 , ...,  40.91,  40.92,  40.95],
       [ 44.2 ,  44.27,  44.27, ...,  40.82,  40.91,  40.94]])
>>> img.get_array()
: array([ 42.38,  41.93,  41.92, ...,  40.85,  40.91,  40.92])
由于我试图抓取用户在绘图上的单击,然后使用单击的数据值(如中)重新绘图,因此我希望使用一个函数/类,该函数/类不具有对原始数据的全局访问权,但具有对
img
对象的访问权

知道我如何仅使用
img
(QuadMesh)对象从
pcolormesh()
获取二维数据吗?它甚至似乎没有x/y长度/形状值,对于我来说,从一维
get\u array()
重建数据


谢谢

是的,它会对输入进行解缠:

如果您知道所需的二维形状,则可以通过一个简单的
重塑
调用进行分解

如果结果应具有与
D
相同的形状,请使用:

img.get_array().reshape(D.shape)
如果展开的
C
的大小可以更改,则这将不起作用


如果我制作一个
D
数组,它是
(10,20)
,并绘制它

img = pyplot.pcolormesh(D)
img.\u A
是(200,),即
img.get\u array()
返回的数组

img._meshHeight, img._meshWidth
# 10, 20
因此,可以使用以下方法重塑阵列:

img._A.reshape(img._meshHeight, img._meshWidth)
img.\u坐标
是一个(11,21,2)数组,x和y方向的坐标加上一个点。因此,您也可以从
\u坐标
获得
C
整形信息。我没有看到任何用于检索这些属性的公共API方法,但这并不能阻止“认真的”Python程序员。在这个测试用例中,它从
D
的形状生成
坐标

Quadmesh
是通过以下方式创建的:

    coords = np.zeros(((Nx * Ny), 2), dtype=float)
    coords[:, 0] = X
    coords[:, 1] = Y

    collection = QuadMesh(
        Nx - 1, Ny - 1, coords, ...)
    ....
    collection.set_array(C)
matplotlib
github存储库中搜索
get\u array
不会得到很多点击


我仔细研究了一下
pcolor
代码。它返回一个
PolyCollections
img,而不是一个Quadmesh。它包含用于绘制四边形集合的信息

例如,在我使用10x20输入的测试用例中,
img.\u paths
是200个
Path
对象的列表

In [486]: img1._paths[0]
Out[486]: 
Path(array([[ 0.,  0.],
       [ 0.,  1.],
       [ 1.,  1.],
       [ 1.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]]), array([ 1,  2,  2,  2,  2, 79], dtype=uint8))
它有五个坐标对,即绘制四边形边界所需的
xy
点,该点的颜色值对应于
C[0]
(以折线形式)

因此,所有的
X
Y
网格信息现在都编码在这些
Path
对象中。它不绘制网格,而是绘制200个彩色正方形(四边形)。
PolyCollections
代码不假设这些方块以任何顺序排列,甚至不相互接触。大画面已经被一堆独立的小画面所取代


您可以将这些四边形重新组合到网格中,查找匹配的顶点等,但这将是一项大量工作。

数组的形状存储在私有属性中。然而,由于这些属性不是公共API的一部分,因此如果可能的话,保存原始数据的形状比依赖这些属性要好

import matplotlib.pyplot as plt
import numpy as np

D = np.random.uniform(0, 100, size=(5, 5))
fig, ax = plt.subplots()
h, w = D.shape
img = ax.pcolormesh( np.arange(h+1), np.arange(w+1), D)

D2 = img.get_array().reshape(img._meshWidth, img._meshHeight)
assert  np.array_equal(D, D2)

还请注意,如果要恢复原始数组
D
,则坐标数组
np.arange(h+1)
np.arange(w+1)
的长度必须大于
D
的形状。否则,
img.get_array()
D
具有shape
(500500)
时返回一个shape
(499499)
数组,就像
pcolormesh
在数据上运行
np.ravel()
并在
get_array()中选择它一样
-有什么方法可以解开
?您希望看到什么类型的用户更改?只想沿着用户单击的点之间的线获得绘制的数据值,然后放手-这将发生在事件处理程序类中,该类仅访问
img
(QuadMesh)对象,但是无法访问原始数据数组。那么@unutbu提到的
img
属性就到此为止了。在这里发布了整个函数:从
\u pcolorargs
看起来
pcolor
将删除
C
中的点,如果需要匹配
x
y
。啊,
\u meshWidth
\u meshHeight
值是我复制类似原始数组的内容所需的值。不幸的是,对这些属性进行编码使我的函数现在只适用于
pcolormesh
——如果有一个通用的API调用(如
get\u width()
/
get\u height()
),我的函数将适用于
pcolor
pcolormesh
,也可能适用于
tourf
和其他函数。也许应该提交一个功能请求…我添加了一些关于
pcolor
生成的内容的注释-它将网格划分为许多简单的四边形,因此它的
img
没有任何网格高度或宽度的概念。不幸的是,我的函数无法访问原始数据
D
。谢谢,这真的很有趣。在您的研究中,您是否遇到了一种适用于各种类型的曲面/二维绘图的方法?我还没有尝试过,但我想知道“_坐标”方法是否不仅适用于“Pcolormesh”,还适用于“Pcolor”或“ContorF”。Pcolor
img
没有
\u坐标
属性。我唯一能找到xy值的地方是
\u路径
。我查看了代码和示例
img
对象(通过
ipython
)。
import matplotlib.pyplot as plt
import numpy as np

D = np.random.uniform(0, 100, size=(5, 5))
fig, ax = plt.subplots()
h, w = D.shape
img = ax.pcolormesh( np.arange(h+1), np.arange(w+1), D)

D2 = img.get_array().reshape(img._meshWidth, img._meshHeight)
assert  np.array_equal(D, D2)