matplotlib поверхностный график meshgrid не остается верным x, y координатным векторам [дубликат]

Я предпочитаю, чтобы прослушиватели событий были развернуты модульной функцией, а не сценарием прослушивателя событий уровня document. Итак, мне нравится ниже. Обратите внимание: вы не можете переадресовать элемент с одним и тем же прослушивателем событий, поэтому не беспокойтесь о прикреплении слушателя более одного раза - только один палец.

var iterations = 4;
var button;
var body = document.querySelector("body");

for (var i = 0; i < iterations; i++) {
    button = document.createElement("button");
    button.classList.add("my-button");
    button.appendChild(document.createTextNode(i));
    button.addEventListener("click", myButtonWasClicked);
    body.appendChild(button);
}

function myButtonWasClicked(e) {
    console.log(e.target); //access to this specific button
}

3
задан Faser 4 March 2017 в 15:16
поделиться

2 ответа

Абразивные точки могут быть представлены как 1D массивы в matplotlib.Axes3D.plot_trisurf . Неважно, следуют ли они определенной структуре.

Другие методы, которые будут зависеть от структуры данных, будут

  • Интерполировать точки на регулярной прямоугольной сетке. Это можно выполнить с помощью griddata . См. Пример здесь
  • Измените входные массивы так, чтобы они находились на регулярной основе, а затем используйте plot_surface(). В зависимости от порядка, по которому поставлены точки, это может быть очень простым решением для сетки с «параллелограммной» формой. Как видно из примера сферы , plot_surface() также работает в случаях очень неравных форм сетки, если он структурирован в обычном режиме.

Вот несколько примеров:

Для полноты найдите здесь код, создающий изображение выше:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

f = lambda x,y: np.sin(x+0.4*y)*0.23+1

fig = plt.figure(figsize=(5,6))
plt.subplots_adjust(left=0.1, top=0.95,wspace=0.01)


ax0 = fig.add_subplot(322, projection="3d")

ma = 6*(np.random.rand(100)-0.5)
mb = 6*(np.random.rand(100)-0.5)
phi = np.pi/4
x = 1.7*ma*np.cos(phi) + 1.7*mb*np.sin(phi)
y = -1.2*ma*np.sin(phi) +1.2* mb*np.cos(phi)
z = f(x,y)
ax0.plot_trisurf(x,y,z)

ax1 = fig.add_subplot(321)
ax0.set_title("random plot_trisurf()")
ax1.set_aspect("equal")
ax1.scatter(x,y, marker="+", alpha=0.4)
for i  in range(len(x)):
    ax1.text(x[i],y[i], i  , ha="center", va="center", fontsize=6)


n = 10
a = np.linspace(-3, 3, n)
ma, mb = np.meshgrid(a,a)
phi = np.pi/4
xm = 1.7*ma*np.cos(phi) + 1.7*mb*np.sin(phi)
ym = -1.2*ma*np.sin(phi) +1.2* mb*np.cos(phi)
shuf = np.c_[xm.flatten(), ym.flatten()]
np.random.shuffle(shuf)
x = shuf[:,0]
y = shuf[:,1]
z = f(x,y)

ax2 = fig.add_subplot(324, projection="3d")
ax2.plot_trisurf(x,y,z)

ax3 = fig.add_subplot(323)
ax2.set_title("unstructured plot_trisurf()")
ax3.set_aspect("equal")
ax3.scatter(x,y, marker="+", alpha=0.4)
for i  in range(len(x)):
    ax3.text(x[i],y[i], i  , ha="center", va="center", fontsize=6)


x = xm.flatten()
y = ym.flatten()
z = f(x,y)

X = x.reshape(10,10)
Y = y.reshape(10,10)
Z = z.reshape(10,10)

ax4 = fig.add_subplot(326, projection="3d")
ax4.plot_surface(X,Y,Z)

ax5 = fig.add_subplot(325)
ax4.set_title("regular plot_surf()")
ax5.set_aspect("equal")
ax5.scatter(x,y, marker="+", alpha=0.4)
for i  in range(len(x)):
    ax5.text(x[i],y[i], i  , ha="center", va="center", fontsize=6)


for axes in [ax0, ax2,ax4]:
    axes.set_xlim([-3.5,3.5])
    axes.set_ylim([-3.5,3.5])
    axes.set_zlim([0.9,2.0])
    axes.axis("off")
plt.savefig(__file__+".png")
plt.show()
5
ответ дан ImportanceOfBeingErnest 18 August 2018 в 14:46
поделиться
  • 1
    Не для того, чтобы surface не нуждался в прямоугольной сетке, все, что ему нужно, это четырехугольная сетка. Поэтому, если правильно переставить данные OP, данные могут быть переданы прямо в surface без каких-либо численных изменений – Eric 4 March 2017 в 15:38
  • 2

Если ваши данные в порядке, и вы знаете размер паралграммы, вероятно, будет достаточно изменить форму:

ax.surface(x.reshape(10, 10), y.reshape(10, 10), z.reshape(10, 10))

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

2
ответ дан Eric 18 August 2018 в 14:46
поделиться
  • 1
    Спасибо Эрик, твой трюк тоже сделал это. Поскольку позже я рассматриваю поддержку сеток с еще более странными формами, я буду использовать trisurf. – Faser 4 March 2017 в 16:00
  • 2
    @Faser: Вы генерируете эти решетки? Кроме того, тот факт, что вы говорите «сетка», не "сетка" означает, что surface всегда должно быть достаточно – Eric 4 March 2017 в 17:56
Другие вопросы по тегам:

Похожие вопросы: