Проецирование плоскости на новую систему координат - PullRequest
0 голосов
/ 19 декабря 2018

Скажем, у меня есть сетка

xGrid = np.linspace(0.1, 1, 10)
yGrid = np.linspace(5, 10, 5)

и некоторые данные в этой сетке:

X, Y = np.meshgrid(xGrid, yGrid, indexing='ij')
Z = X*Y + 1

Теперь я могу легко построить Z(x, y).Теперь есть преобразование t(x, y):

T = X+1+Y/2

, и я хотел бы вместо этого построить график Z(t(x, y), y).Для этого мне нужно спроецировать мои данные Z на плоскость t(x,y)-y.Каков наилучший способ сделать это?

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

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Если я понимаю вашу проблему, вы можете использовать pcolormesh, который можно использовать для нестандартных сеток

In [8]: import numpy as np 
   ...: import matplotlib.pyplot as plt 
   ...: from matplotlib.collections import PatchCollection, QuadMesh 
   ...: from matplotlib.patches import Rectangle 
   ...:  
   ...: np.random.seed(2018) 
   ...: xGrid = np.linspace(0.1, 1, 10) 
   ...: yGrid = np.linspace(5, 10, 6) 
   ...: X, Y = np.meshgrid(xGrid, yGrid, indexing='ij') 
   ...: Z = X*Y + 1 
   ...: T = X+1+Y/2 
   ...: Zt = T*Y + 1 
   ...: plt.pcolormesh(T, Y, Zt) 
   ...: plt.colorbar()                                                                           
Out[8]: <matplotlib.colorbar.Colorbar at 0x7fda83cd4ef0>

, который производит

enter image description here

Если полосы слишком безобразны, используйте plt.pcolormesh(T, Y, Zt, shading='gouraud')

enter image description here

0 голосов
/ 19 декабря 2018

Вы можете использовать интерполяцию для вычисления значений в проекции, например, с scipy.interpolate.RectBivariateSpline:

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

xGrid = np.linspace(0.1, 1, 10)
yGrid = np.linspace(5, 10, 5)
X, Y = np.meshgrid(xGrid, yGrid, indexing='ij')
Z = X * Y + 1
T = X + 1 + Y / 2
# Interpolate values
interp = scipy.interpolate.RectBivariateSpline(xGrid, yGrid, Z)
Zt = interp.ev(T.ravel(), Y.ravel()).reshape(Z.shape)
# Plot
fig = plt.figure(figsize=(8, 10))
ax1 = fig.add_subplot(211, projection='3d')
ax1.set_title('Original')
ax1.plot_surface(X, Y, Z)
ax2 = fig.add_subplot(212, projection='3d')
ax2.set_title('Projected')
ax2.plot_surface(T, Y, Zt)
fig.tight_layout()

Вывод:

Original and projected plot

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