Построение контуров для параметра 1D z в терминах параметра 1D x и y с использованием Pythons matplotlib [duplicate]

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

Также подумал, что кто-то должен также упомянуть, что вам следует делать, чтобы избежать нарезка ... Получите копию стандартов кодирования C ++, 101 правила и рекомендации.

Он предлагает несколько сложный шаблон, чтобы полностью решить проблему: иметь защищенный экземпляр копии, защищенный чистый виртуальный DoClone и публичный клон с утверждением, которое скажет вам если (далее) производный класс не смог правильно выполнить DoClone. (Метод Clone делает правильную глубокую копию полиморфного объекта.)

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

12
задан Yann 12 September 2013 в 14:21
поделиться

3 ответа

23
ответ дан elyase 21 August 2018 в 07:22
поделиться

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

import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
import numpy.ma as ma
from numpy.random import uniform, seed
# make up some randomly distributed data
seed(1234)
npts = 200
x = uniform(-2,2,npts)
y = uniform(-2,2,npts)
z = x*np.exp(-x**2-y**2)
# define grid.
xi = np.linspace(-2.1,2.1,100)
yi = np.linspace(-2.1,2.1,100)
# grid the data.
zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')
# contour the gridded data, plotting dots at the randomly spaced data points.
CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k')
CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet)
plt.colorbar() # draw colorbar
# plot data points.
plt.scatter(x,y,marker='o',c='b',s=5)
plt.xlim(-2,2)
plt.ylim(-2,2)
plt.title('griddata test (%d points)' % npts)
plt.show()

Обратите внимание, что я бесстыдно украл этот код из превосходной поваренной книги matplotlib

6
ответ дан David Zwicker 21 August 2018 в 07:22
поделиться
  • 1
  • 2
    Это, конечно, зависит от ваших данных, которые вы не указали в своем первоначальном сообщении. Вы должны обязательно попробовать сыграть с аргументом method в griddata. Попробуйте method="nearest", который должен дать самую быструю интерполяцию. – David Zwicker 12 September 2013 в 15:00

Решение будет зависеть от того, как организованы данные.

Данные о регулярной сетке

Если данные x и y уже определяют сетку, их можно легко преобразовать в четырехугольную сетку. Например,

#x  y  z
 4  1  3
 6  1  8
 8  1 -9
 4  2 10
 6  2 -1
 8  2 -8
 4  3  8
 6  3 -9
 8  3  0
 4  4 -1
 6  4 -8
 8  4  8 

может отображаться как contour , используя

import matplotlib.pyplot as plt
import numpy as np
x,y,z = np.loadtxt("data.txt", unpack=True)
plt.contour(x.reshape(4,3), y.reshape(4,3), z.reshape(4,3))

Произвольные данные

(a) В случае данные не живут на четырехсторонней сетке, можно интерполировать данные по сетке. Один из способов сделать это - сам matplotlib, используя matplotlib.mlab.griddata.

import matplotlib.mlab
xi = np.linspace(4, 8, 10)
yi = np.linspace(1, 4, 10)
zi = matplotlib.mlab.griddata(x, y, z, xi, yi, interp='linear')
plt.contour(xi, yi, zi)

(b) Наконец, можно конструировать контур полностью без использования четырехсторонней сетки. Это можно сделать, используя tricontour .

plt.tricontour(x,y,z)

Пример сравнения последних двух методов находится на странице matplotlib .

3
ответ дан ImportanceOfBeingErnest 21 August 2018 в 07:22
поделиться
Другие вопросы по тегам:

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