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”。Pcolorimg
没有\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)