Лучший способ построить двухмерный контур с сетчатой ​​сеткой - PullRequest
2 голосов
/ 20 мая 2019

Я ищу лучший способ создать контурный график, используя сетчатую сетку.

У меня есть данные Excel в столбцах, просто выглядящих так:

x data values: -3, -2, -1, 0, 1, 2 ,3, -3, -2, -1, 0, 1, 2, 3
y data values:  1,  1,  1, 1, 1, 1, 1,  2,  2,  2, 2, 2, 2, 2
z data values:  7 , 5,  6, 5, 1, 0, 9,  5,  3,  8, 3, 1, 0, 4

Значения x и y определяют плоскость 2d с длиной (ось X) из 7 значений и глубиной (уОсь) из 2 значений.Значения z определяют цвет в соответствующих точках (более или менее по оси Z).

Я пробовал:

import matplotlib.pyplot as plt
import numpy as np

x = [-3,-2,-1,0,1,2,3]

y = [1,2]

z = [7,5,6,5,1,0,9,5,3,8,3,1,0,4]

x, y = np.meshgrid(x, y)

A = np.array(z)
B = np.reshape(A, (-1, 2))

fig = plt.figure()
ax1 = plt.contourf(x, y, B)

plt.show()

Я почти уверен, что не понимаю, как работает сетка.Должен ли я использовать весь список значений х и у, чтобы он работал?

Как создать прямоугольный двухмерный график с длиной (x), равной 7, и глубиной (y), равной 2, и значениями z, определяющими затенение / цвет при значениях x и y?

Заранее спасибо, ребята!

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Это один из способов использования формы сетки (X или Y) для изменения формы массива z. Кроме того, вы можете добавить цветную полосу, используя plt.colorbar()

import matplotlib.pyplot as plt
import numpy as np

x = [-3,-2,-1,0,1,2,3]
y = [1,2]
z = np.array([7,5,6,5,1,0,9,5,3,8,3,1,0,4])

X, Y = np.meshgrid(x, y)
print (X.shape, Y.shape)
# (2, 7) (2, 7) Both have same shape
Z = z.reshape(X.shape) # Use either X or Y to define shape

fig = plt.figure()
ax1 = plt.contourf(X, Y, Z)
plt.colorbar(ax1)
plt.show()

enter image description here

0 голосов
/ 20 мая 2019

Попробуйте

x_, y_ = np.meshgrid(x, y)
z_grid = np.array(z).reshape(2,7)
fig = plt.figure()
ax1 = plt.contourf(x_,y_,z_grid)
plt.show()

Редактировать: Если вы хотите сгладить, согласно вашему комментарию, вы можете попробовать что-то вроде scipy.ndimage.zoom(), как описано здесь , т.е. в вашем случае

from scipy import ndimage

z_grid = np.array(z).reshape(2,7)
z_grid_interp = ndimage.zoom(z_grid, 100)
x_, y_ = np.meshgrid(np.linspace(-3,3,z_grid_interp.shape[1]),np.linspace(1,2,z_grid_interp.shape[0]))

, а затем построите график, как раньше:

fig = plt.figure()
ax1 = plt.contourf(x_,y_,z_grid_interp)
plt.show()

image here

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