bang
bang

Reputation: 181

Plotting a grid in Python

I'm trying to start 2D contour plot for a flow net and I'm having trouble getting the initial grid to show up properly.

Given the number of columns and the number of rows, how can I write a function that will plot a grid so that all points in the given range appear?

I tried plotting for 4 columns and 3 rows of points by doing this:

r = 3

c = 4

x = [i for i in range(c)]

y = [i for i in range(r)]

plot(x,y,'ro')

grid()

show()

and get this error:

'ValueError: x and y must have same first dimension'

So I tried testing it on a 4x4 grid and got this and I get close to what I want, however it only plots points (0,0), (1,1), (2,2), and (3,3)

However, I also want the points (0,0), (1,0), (2,0), (3,0), (1,0), (1,1)...(3,2), (3,3) to appear, as I will later need to plot vectors from this point indicating the direction of flow for my flow net.

Sorry, I know my terminology isn't that great. Does anyone know how to do this and how to make it work for grids that aren't square?

Upvotes: 2

Views: 22080

Answers (3)

unutbu
unutbu

Reputation: 880717


import numpy as np
import matplotlib.pyplot as plt
import itertools
r = 3
c = 4
x = np.linspace(0, c, c+1)
y = np.linspace(0, r, r+1)

pts = itertools.product(x, y)
plt.scatter(*zip(*pts), marker='o', s=30, color='red')

X, Y = np.meshgrid(x, y)
deg = np.arctan(Y**3 - 3*Y-X)
QP = plt.quiver(X, Y, np.cos(deg), np.sin(deg))
plt.grid()
plt.show()

enter image description here

Upvotes: 7

Fenikso
Fenikso

Reputation: 9451

r = 3
c = 4

x = [i % c for i in range(r*c)]
y = [i / c for i in range(r*c)]

print x
print y

Gives:

[0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]
[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2]

When used to draw graph as you did it produces desired result.

Upvotes: 3

YXD
YXD

Reputation: 32521

The first two arguments specify your x and y components. So the number of points must match. I think what you want is something like:

from itertools import product
import matplotlib.pyplot as plt

points = np.array(list(product(range(3),range(4))))

plt.plot(points[:,0],points[:,1],'ro')
plt.show()

Upvotes: 2

Related Questions