2012-03-29 4 views
1

Я пытаюсь запустить 2D контурный график для сети потока, и у меня возникают проблемы с тем, чтобы начальная сетка отображалась правильно.Построение сетки в Python

Учитывая количество столбцов и количество строк, как я могу написать функцию, которая будет отображать сетку так, чтобы отображались все точки в данном диапазоне?

Я попытался черчения 4 столбцов и 3 строк точек, делая это:

r = 3 

c = 4 

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

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

plot(x,y,'ro') 

grid() 

show() 

и получить эту ошибку:

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

Так что я попытался тестирования его на сетке 4х4 и получил это и я приближаюсь к тому, что я хочу, однако он касается только точек (0,0), (1,1), (2,2) и (3,3)

Однако мне также нужны точки (0,0), (1,0), (2,0), (3,0), (1,0), (1,1) ... (3,2), (3,3) , Насколько я позже понадобится нарисовать векторы из этой точки, указывая направление потока для моей сети потоков.

Извините, я знаю, что моя терминология не так уж хороша. Кто-нибудь знает, как это сделать и как заставить его работать на сетки, которые не являются квадратными?

+0

0 Вам не нужно писать 'x = [i для i в диапазоне (c)]', вы можете написать 'x = range (c)' – YXD

+0

Спасибо, что указали это. Я много работал заранее, и я думаю, что у меня были c = 4.0 и r = 3.0, а функция range() не работала для поплавков. Если кто-то знает, как решить эту проблему для поплавков, это тоже здорово! – bang

+0

Ваш сюжет пытается построить линию, когда вектор X - это значения по оси x, а вектор Y - значения оси y. Значения двух векторов должны совпадать. И это, вероятно, не является желаемым выходом вашего кода. – Fenikso

ответ

2
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 

Дает:

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

При использовании рисовать график, как вы делали это дает желаемый результат.

2

Первые два аргумента определяют ваши компоненты x и y. Таким образом, количество очков должно совпадать. Я думаю, что вы хотите что-то вроде:

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() 
6
  • Вы можете использовать itertools.product для создания требуемых точек.
  • Используйте plt.scatter, чтобы рассчитать точки
  • Используйте plt.quiver, чтобы построить векторное поле. (Соответствующий код взят из these SO answers)

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

Смежные вопросы