Matplotlib неструктурированные четырехугольники вместо треугольников

У меня есть два файла netcdf, содержащие обе неструктурированные сетки. Первая сетка имеет 3 вершины на грань, а вторая - 4 вершины на грань.

Для сетки, содержащей 3 вершины на грань, я могу использовать matplotlib.tri для визуализации (например, triplot_demo.py:

import matplotlib.pyplot as plt
import matplotlib.tri as tri
import numpy as np
xy = np.asarray([
    [-0.101, 0.872], [-0.080, 0.883], [-0.069, 0.888], [-0.054, 0.890],
    [-0.045, 0.897], [-0.057, 0.895], [-0.073, 0.900], [-0.087, 0.898],
    [-0.090, 0.904], [-0.069, 0.907], [-0.069, 0.921], [-0.080, 0.919],
    [-0.073, 0.928], [-0.052, 0.930], [-0.048, 0.942], [-0.062, 0.949],
    [-0.054, 0.958], [-0.069, 0.954], [-0.087, 0.952], [-0.087, 0.959],
    [-0.080, 0.966], [-0.085, 0.973], [-0.087, 0.965], [-0.097, 0.965],
    [-0.097, 0.975], [-0.092, 0.984], [-0.101, 0.980], [-0.108, 0.980],
    [-0.104, 0.987], [-0.102, 0.993], [-0.115, 1.001], [-0.099, 0.996],
    [-0.101, 1.007], [-0.090, 1.010], [-0.087, 1.021], [-0.069, 1.021],
    [-0.052, 1.022], [-0.052, 1.017], [-0.069, 1.010], [-0.064, 1.005],
    [-0.048, 1.005], [-0.031, 1.005], [-0.031, 0.996], [-0.040, 0.987],
    [-0.045, 0.980], [-0.052, 0.975], [-0.040, 0.973], [-0.026, 0.968],
    [-0.020, 0.954], [-0.006, 0.947], [ 0.003, 0.935], [ 0.006, 0.926],
    [ 0.005, 0.921], [ 0.022, 0.923], [ 0.033, 0.912], [ 0.029, 0.905],
    [ 0.017, 0.900], [ 0.012, 0.895], [ 0.027, 0.893], [ 0.019, 0.886],
    [ 0.001, 0.883], [-0.012, 0.884], [-0.029, 0.883], [-0.038, 0.879],
    [-0.057, 0.881], [-0.062, 0.876], [-0.078, 0.876], [-0.087, 0.872],
    [-0.030, 0.907], [-0.007, 0.905], [-0.057, 0.916], [-0.025, 0.933],
    [-0.077, 0.990], [-0.059, 0.993]])
x = np.degrees(xy[:, 0])
y = np.degrees(xy[:, 1])

triangles = np.asarray([
    [65, 44, 20],
    [65, 60, 44]])

triang = tri.Triangulation(x, y, triangles)

plt.figure()
plt.gca().set_aspect('equal')
plt.triplot(triang, 'go-', lw=1.0)
plt.title('triplot of user-specified triangulation')
plt.xlabel('Longitude (degrees)')
plt.ylabel('Latitude (degrees)')

plt.show()

Matplotlib неструктурированные четырехугольники вместо треугольников

- индексы соответствующей точки, аннотируемые впоследствии

НО как визуализировать неструктурированную сетку, содержащую 4 вершины на грань (четырехугольники)? Следуя предыдущему примеру, мои лица выглядят так:

quatrang = np.asarray([
    [65, 60, 44, 20]])

Очевидно, что попытка tri.Triangulation не работает:

quatr = tri.Triangulation(x, y, quatrang)

ValueError: triangles must be a (?,3) array

Я не могу найти ничего в библиотеках matplotlib относительно 4 вершин на грань. Любая помощь приветствуется.

Обновлено: изменен вопрос на основе минимального, полного и проверяемого примера.

Поскольку нет Quatrangulation или simiar, нет стандартного способа построить их в matplotlib. Конечно, вы можете снова триангулировать вашу сетку, чтобы получить 2 треугольника на четырехугольник. Или вы можете построить PolyCollection фигур с учетом их координат в пространстве. Чтобы помочь с этим, вам нужно будет предоставить работающий пример (минимальный воспроизводимый пример).

ImportanceOfBeingErnest 04.04.2018 01:29

Спасибо @ImportanceOfBeingErnest. Я изменил свой вопрос на основе ваших комментариев, чтобы включить в него работоспособный пример.

Mattijn 04.04.2018 12:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
1 206
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как уже отмечалось, поскольку нет Quatrangulation или simiar, нет стандартного способа построить аналогичный график, как триплот, с четырьмя точками на фигуру в matplotlib. Конечно, вы можете снова триангулировать вашу сетку, чтобы получить 2 треугольника на четырехугольник. Или вы можете построить PolyCollection фигур с учетом их координат в пространстве. Ниже показано последнее, определяющее функцию quatplot, которая принимает координаты и индексы вершин в качестве входных данных и рисует их PolyCollection по осям.

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.collections

xy = np.asarray([
    [-0.101, 0.872], [-0.080, 0.883], [-0.069, 0.888], [-0.054, 0.890],
    [-0.090, 0.904], [-0.069, 0.907], [-0.069, 0.921], [-0.080, 0.919],
    [-0.080, 0.966], [-0.085, 0.973], [-0.087, 0.965], [-0.097, 0.965],
    [-0.104, 0.987], [-0.102, 0.993], [-0.115, 1.001], [-0.099, 0.996],
    [-0.052, 1.022], [-0.052, 1.017], [-0.069, 1.010], [-0.064, 1.005],
    [-0.045, 0.980], [-0.052, 0.975], [-0.040, 0.973], [-0.026, 0.968],
    [ 0.017, 0.900], [ 0.012, 0.895], [ 0.027, 0.893], [ 0.019, 0.886],
    [ 0.001, 0.883], [-0.012, 0.884], [-0.029, 0.883], [-0.038, 0.879],
    [-0.030, 0.907], [-0.007, 0.905], [-0.057, 0.916], [-0.025, 0.933],
    [-0.077, 0.990], [-0.059, 0.993]])
x = np.degrees(xy[:, 0])
y = np.degrees(xy[:, 1])

quatrang = np.asarray([
    [19,13,10,22], [35,7,3,28]])

def quatplot(x,y, quatrangles, ax=None, **kwargs):
    if not ax: ax=plt.gca()
    xy = np.c_[x,y]
    verts=xy[quatrangles]
    pc = matplotlib.collections.PolyCollection(verts, **kwargs)
    ax.add_collection(pc)
    ax.autoscale()


plt.figure()
plt.gca().set_aspect('equal')

quatplot(x,y, quatrang, ax=None, color = "crimson", facecolor = "None")
plt.plot(x,y, marker = "o", ls = "", color = "crimson")

plt.title('quatplot of user-specified quatrangulation')
plt.xlabel('Longitude (degrees)')
plt.ylabel('Latitude (degrees)')

for i, (xi,yi) in enumerate(np.degrees(xy)):
    plt.text(xi,yi,i, size=8)

plt.show()

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

ImportanceOfBeingErnest 06.09.2018 16:35

Другие вопросы по теме