2

I'm trying to plot some streamlines with Matplotlib.

I have this code so far, as an example to plot a 10 x 10 vector field:

def plot_streamlines(file_path, vector_field_x, vector_field_y):
    plt.figure()
    y, x = numpy.mgrid[-2:2:10j, -2:2:10j]
    plt.streamplot(x, y, vector_field_x, vector_field_y, color='y', cmap=plt.cm.autumn)
    plt.savefig(file_path + '.png')
    plt.close()

This works properly, but if I just change this line:

y, x = numpy.mgrid[-2:2:10j, -2:2:10j]

To that one:

x, y = numpy.mgrid[-2:2:10j, -2:2:10j]

I get some errors:

Traceback (most recent call last):
  File "Library/Python/2.7/lib/python/site-packages/matplotlib/pyplot.py", line 3224, in streamplot minlength=minlength, transform=transform)
  File "/Library/Python/2.7/lib/python/site-packages/matplotlib/axes.py", line 6861, in streamplot transform=transform)
  File "Library/Python/2.7/lib/python/site-packages/matplotlib/streamplot.py", line 67, in streamplot grid = Grid(x, y)
  File "Library/Python/2.7/lib/python/site-packages/matplotlib/streamplot.py", line 256, in __init__
    assert np.allclose(x_row, x)
AssertionError

I didn't understand how I can use the "standard" order x / y, since my mesh grid is squared. Moreover, I don't know how I get these erros if my x and y dimensions are the same.

Any help would be appreciated.

Thank you.

0

2 Answers 2

2

The pylab examples use Y,X then plot X,Y for streamplots using numpy.mgrid.

import numpy as np
import matplotlib.pyplot as plt

Y, X = np.mgrid[-3:3:100j, -3:3:100j]
U = -1 - X**2 + Y
V = 1 + X - Y**2
speed = np.sqrt(U*U + V*V)

plt.streamplot(X, Y, U, V, color=U, linewidth=2, cmap=plt.cm.autumn)
plt.colorbar()

f, (ax1, ax2) = plt.subplots(ncols=2)
ax1.streamplot(X, Y, U, V, density=[0.5, 1]    
lw = 5*speed/speed.max()
ax2.streamplot(X, Y, U, V, density=0.6, color='k', linewidth=lw)

plt.show()

Taken from here.

y,x = numpy.mgrid[-2:2:4j,-2:2:4j]
x = [[-2.         -0.66666667  0.66666667  2.        ]
    [-2.         -0.66666667  0.66666667  2.        ]
    [-2.         -0.66666667  0.66666667  2.        ]
    [-2.         -0.66666667  0.66666667  2.        ]]


y = [[-2.         -2.         -2.         -2.        ]
     [-0.66666667 -0.66666667 -0.66666667 -0.66666667]
     [ 0.66666667  0.66666667  0.66666667  0.66666667]
     [ 2.          2.          2.          2.        ]]

There seems a direct relation with how the data looks in regard to x and y axis, the -2,2 etc.. resembling an x-axis and y values resembling a y-axis.

Sign up to request clarification or add additional context in comments.

2 Comments

I imagine it has something to do with how the values of the columns in one x match rows in y on the other, basically an x and y axis relationship.
It is a bit strange but I suppose it is using a numpy method to plot not one of its own.
0

According to streamplot documentation:

x, y : 1d arrays
    an evenly spaced grid.

In your case a verbose equivalent to Y, X = np.mgrid[-3:3:100j, -3:3:100j] is:

x = np.linspace(-3, 3, 100)
y = np.linspace(-3, 3, 100)
X, Y = np.meshgrid(x, y)

and you can safely pass x, y or y, x to streamplot.

However, (a bit lenient ?) 2-d arrays seem to be accepted in case they are of the form X, Y = numpy.meshgrid(x_1d, y_1d). But unfortunately not Y, X = numpy.meshgrid(x_1d, y_1d).

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.