Matplotlib "патч", как функция - PullRequest
0 голосов
/ 04 июля 2018

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

Я хотел бы знать, имеет ли MATPLOTLIB какую-либо функцию, например «PATCH» в Matlab, которая работает следующим образом:

x = [0.0, 0.5, 1.0, 1.0, 1.0, 0.5, 0.0, 0.0];
y = [0.0, 0.0, 0.0, 0.5, 1.0, 1.0, 1.0, 0.5];
v = [0.0, 0.0, 0.0, 0.5, 1.0, 1.0, 1.0, 0.5];
patch(x, y, v)

И выдает график, показанный ниже. Короче говоря, мне нужна простая функция построения патчей, а это значит, что я не хочу использовать для этого какую-либо специальную библиотеку. (Если кто-то спросит, зачем мне это нужно: я преподаю студентам старших курсов и использую Python3.6 для кодирования.)

Image created using Matlab PATCH function

1 Ответ

0 голосов
/ 04 июля 2018

Имея всего 8 точек для интерполяции, результирующий график не является четко определенным. То есть plt.scatter(x,y,c=v) будет выглядеть как

enter image description here

Использование tricontourf графика типа

plt.tricontourf(x,y,v)

будет выглядеть как

enter image description here

и, конечно, вы можете выбрать столько уровней, сколько захотите, например, 100

plt.tricontourf(x,y,v,100)

enter image description here

Хотя это выглядит как рассматриваемый сюжет, я не думаю, что он хорошо подходит для образовательных целей, где вы бы лучше научили людей проблеме интерполяции и различным методам ее выполнения.

В этом смысле хранение данных и построение графиков, вероятно, является лучшим выбором. Поэтому я предпочел бы сначала выполнить интерполяцию, а затем отобразить результат. Возможно, пример Contour нерегулярно расположенных данных является хорошей отправной точкой. И пример для случая здесь может выглядеть как

x = [0.0, 0.5, 1.0, 1.0, 1.0, 0.5, 0.0, 0.0];
y = [0.0, 0.0, 0.0, 0.5, 1.0, 1.0, 1.0, 0.5];
v = [0.0, 0.0, 0.0, 0.5, 1.0, 1.0, 1.0, 0.5];

import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt

xi = np.linspace(min(x), max(x), 100)
yi = np.linspace(min(y), max(y), 100)

zi = griddata((x, y), v, (xi[None,:], yi[:,None]), method='linear')

plt.pcolormesh(xi,yi,zi)

plt.show()

enter image description here

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

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