Streamplot mgrid - Python

时间:2014-01-15 12:15:50

标签: python matplotlib grid

我在一个项目中工作,我必须创建一个方法来生成具有背景和矢量流的图像。所以,我正在使用 matplotlib 的流图。

class ImageData(object):

    def __init__(self, width=400, height=400, range_min=-1, range_max=1):
        """
        The ImageData constructor
        """
        self.width = width
        self.height = height
        #The values range each pixel can assume
        self.range_min = range_min
        self.range_max = range_max
        #self.data = np.arange(width*height).reshape(height, width)
        self.data = []
        for i in range(width):
            self.data.append([0] * height) 

    def generate_images_with_streamline(self, file_path, background):

        # Getting the vector flow
        x_vectors = []
        y_vectors = []
        for i in range(self.width):
            x_vectors.append([0.0] * self.height)
            y_vectors.append([0.0] * self.height)

        for x in range(1, self.width-1):
            for y in range(1, self.height-1):
                vector = self.data[x][y]
                x_vectors[x][y] = vector[0].item(0)
                y_vectors[x][y] = vector[1].item(0)

        u_coord = np.array(x_vectors)
        v_coord = np.array(y_vectors)

        # Static image size
        y, x = np.mgrid[-1:1:400j, -1:1:400j]

        # Background + vector flow
        mg = mpimg.imread(background)

        plt.figure()
        plt.imshow(mg, extent=[-1, 1, -1, 1])

        plt.streamplot(x, y, u_coord, v_coord, color='y', density=2, cmap=plt.cm.autumn)
        plt.savefig(file_path+'Streamplot.png')
        plt.close()

问题是'因为我的 np.mgrid 应该从-1到1不等,并且 self.width self.height 。但如果这样做:

y, x = np.mgrid[-1:1:self.width, -1:1:self.height]

它不起作用。并且也不知道这个 j 意味着什么,但这似乎很重要,因为如果我取消 j (即使是静态大小),它也不起作用。所以,我想知道如何按照自我大小动态执行 mgrid

提前谢谢。

1 个答案:

答案 0 :(得分:2)

简短回答

j是复数的虚部,并且numpy.mgridnumber of values to generate。在你的情况下,这是你要写的:

y, x = np.mgrid[-1:1:self.width*1j, -1:1:self.height*1j]

答案很长

step中的

np.mgrid[start:stop:step]值应理解如下:

  • 如果step是真的,那么它将被用作从开始到停止的步进,不包括在内。
  • 如果step是纯虚构的(例如5j),则会将其用作返回的步骤数,包括stop值。
  • 如果step很复杂,(例如1+5j),我必须说我不理解结果......

j是虚构的部分。

示例:

>>> np.mgrid[-1:1:0.5]  # values starting at -1, using 0.5 as step, up to 1 (not included)
array([-1. , -0.5,  0. ,  0.5]) 
>>> np.mgrid[-1:1:4j]  # values starting at -1 up to +1, 4 values requested
array([-1.        , -0.33333333,  0.33333333,  1.        ])
>>> np.mgrid[-1:1:1+4j]  # ???
array([-1.        , -0.3596118 ,  0.28077641,  0.92116461])