Форматирование данных для использования в Streamplot - PullRequest
0 голосов
/ 31 октября 2018

У меня небольшая проблема, в основном из-за того, что мне немного сложно погрузиться в мир питонов для matplotlib.

У меня есть 4 1D массива следующим образом:

x -> x positions
y -> y positions
u -> x velocities
v -> y velocities

Что я описал в переменных Python следующим образом (они заполняются данными, которые я читаю, которые не имеют значения, каждый 1D массив равен по длине)

x_points : List[float] = []
y_points : List[float] = []
x_vel : List[float] = []
y_vel : List[float] = []

И мне трудно перевести эти 1D-массивы в формат, который можно использовать для построения обтекаемого графика. (Я пытаюсь последовать ответу на этот вопрос здесь , но все еще чешу голову) В настоящее время мой код выглядит так (я опустил заполнение данных)

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
import pandas as pd
x_points : List[float] = []
y_points : List[float] = []
x_vel : List[float] = []
y_vel : List[float] = []
#Data Population
#End Data Population
xi = np.linspace(-20, 20, len(x_points))
yi = np.linspace(-20, 20, len(z_points))
X, Y = np.meshgrid(xi, yi)
U = interpolate.griddata((x_points, y_points), x_vel, (X, Y), method='cubic')
V = interpolate.griddata((x_points, y_points), y_vel, (X, Y), method='cubic')
f, ax = plt.subplots(figsize=(6,6))
ax.streamplot(X,Y,U,V, density=[0.2,1])

который я уже знаю, не будет работать.

Могу ли я получить некоторую помощь, описывающую, как я должен преобразовать 4-мерные 1-мерные массивы во что-то, что устраивает streamplot?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Проблема заключалась в том, что python давал мне серию ошибок, связанных с несоответствием размеров массивов.

Я понял это, оказалось, что я был довольно близок, и ответ был довольно прост, но я получаю довольно странные результаты.

Первый ответ: при вызове np.linspace мне нужно использовать значения min / max для каждой оси, ниже я прикрепил правильный код (где min / max получают самые маленькие / самые большие значения в списке)

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
import pandas as pd
x_points : List[float] = []
y_points : List[float] = []
x_vel : List[float] = []
y_vel : List[float] = []
#Data Population
#End Data Population
x_min : float = min(x_vel)
y_min : float = min(y_vel)
x_max : float = max(x_vel)
y_max : float = max(y_vel)
xi = np.linspace(x_min, y_max, len(x_points))
yi = np.linspace(y_min, y_max, len(y_points))
X, Y = np.meshgrid(xi, yi)
U = interpolate.griddata((x_points, y_points), x_vel, (X, Y), method='cubic')
V = interpolate.griddata((x_points, y_points), y_vel, (X, Y), method='cubic')
f, ax = plt.subplots(figsize=(6,6))
plt.streamplot(X, Y, U, V, color=U**2+V**2, linewidth=1, cmap=plt.cm.autumn)

Результаты выглядят примерно так, как я ожидал, но чрезвычайно разбросаны / разнесены Я ожидал бы, что поток будет намного более плотным

Как я могу этого достичь?

Результаты

0 голосов
/ 31 октября 2018

В конце концов код работает, но я пропустил объявление списков (но это не обязательно).

Я должен был исправить незначительную опечатку -> z_points не существует, я думаю, вы хотите y_points вместо.

Я использовал некоторые фиктивные данные для проверки вашего кода:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
import pandas as pd
from scipy import interpolate

x_points = np.random.normal(3,5, size=1000)
y_points = np.random.normal(1,2, size=1000)
x_vel = np.random.exponential(size=1000)
y_vel = np.random.exponential(5,size=1000

xi = np.linspace(-20, 20, len(x_points))
yi = np.linspace(-20, 20, len(y_points))
X, Y = np.meshgrid(xi, yi)
U = interpolate.griddata((x_points, y_points), x_vel, (X, Y), method='cubic')
V = interpolate.griddata((x_points, y_points), y_vel, (X, Y), method='cubic')
f, ax = plt.subplots(figsize=(6,6))
ax.streamplot(X,Y,U,V, density=[0.2,1])

который выводит

Demo Plot

Так что, в конце концов, я думаю, что ваши входные данные имеют неправильный формат. Как вы заполняете свои данные? Возможно, преобразование данных из списка в пустой массив уже поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...