matplotlib 2D数据切片

时间:2016-06-17 14:35:14

标签: python matplotlib plot scipy surface

我还没有找到任何相关的东西,也许是因为我没有正确的命名法(即我不知道如何要求它),但无论如何,我有一个3D numpy阵列" a"。我想识别并绘制a = 0的2D表面。为了清楚起见,数据是双精度浮点数在3D空间中平滑变化。表面a = 0很可能会在"之间穿线。数组的点,而不是完全位于它们中的任何一个。所以我需要一些可以插值来找到a = 0表面并绘制它的东西。 matplotlib是否有这样做的现成例程?

3 个答案:

答案 0 :(得分:4)

使用Plotly,您可以在体积数据中绘制平面和非线性切片: http://nbviewer.jupyter.org/github/empet/Plotly-plots/blob/master/Plotly-Slice-in-volumetric-data.ipynb

答案 1 :(得分:2)

要“识别并绘制a = 0的2D表面”,您只需将a=0和绘图(如下所示)的数据进行子集化如果您正在寻找将数据投影到该平面上,然后这有点复杂。

threeD = np.array([(x,y,z) for x in [0,1] for y in [1,2] for z in [5,6]])
twoD = np.array([(y,z) for (x,y,z) in threeD if x==0])
y,z = zip(*twoD)
plt.plot(y,z, 'o')
plt.xlim(0,3)
plt.ylim(0,7)

enter image description here

答案 2 :(得分:0)

体积切片操作通常依赖于插值的概念,最常见的是:Nearest neighborLinearCubic。请注意,这些方法适用于更多维度(例如参见BilinearTrilinear插值)。

在这种情况下,你说你有一个卷,你可以从中检索X,Y,Z(或混合中的切片),但不要考虑这种情况,因为它是一个新的整体问题,只会带来混乱。 / p>

因此,例如,考虑切片X = 5和X = 6,您想知道如何获得X = 5.5。看看这个例子:

def linear_interpolation(p1, p2, x0):
    """
    Function that receives as arguments the coordinates of two points (x,y)
    and returns the linear interpolation of a y0 in a given x0 position. This is the
    equivalent to obtaining y0 = y1 + (y2 - y1)*((x0-x1)/(x2-x1)).
    Look into https://en.wikipedia.org/wiki/Linear_interpolation for more
    information.

    Parameters
    ----------
    p1     : tuple (floats)
        Tuple (x,y) of a first point in a line.
    p2     : tuple (floats)
        Tuple (x,y) of a second point in a line.
    x0     : float
        X coordinate on which you want to interpolate a y0.

    Return float (interpolated y0 value)
    """
    return p1[1] + (p2[1] - p1[1]) * ((x0 - p1[0]) / (p2[0] - p1[0]))

X, Y, Z = np.meshgrid(range(10), range(10), range(10))
vol = np.sqrt((X-5)**2 + (Y-5)**2 + (Z-5)**2)

Slice5dot5 = linear_interpolation((Y[5, :, :], vol[5, :, :]), (Y[6, :, :], vol[6, :, :]), 5.5)

f, (ax1, ax2, ax3) = plt.subplots(1, 3, sharey=True)
ax1.imshow(vol[5, :, :], interpolation='nearest', origin='lower', vmin=vol.min(), vmax=vol.max())
ax1.set_title("vol[5, :, :]")
ax2.imshow(Slice5dot5, interpolation='nearest', origin='lower', vmin=vol.min(), vmax=vol.max())
ax2.set_title("vol[5.5, :, :]")
ax3.imshow(vol[6, :, :], interpolation='nearest', origin='lower', vmin=vol.min(), vmax=vol.max())
ax3.set_title("vol[6, :, :]")
plt.show()

该函数出现在文档中(它是我做过的一个旧项目的一部分)与数字一起使用,但它也可以与numpy 2D切片一样好(并且它比循环所有这些单元要快得多)。

结果如下:

Volume slicing matplotlib

你会注意到颜色从左到右变得苍白。中间的切片是完全插值的,之前不存在。