интерполяция с помощью matplotlib pcolor

У меня есть два массива numpy, первый (30, 365) и содержит значения для 30 глубин в течение года, второй массив (30, 1) и содержит фактическую глубину (в метрах), соответствующую глубинам в первый массив. Я хочу построить первый массив, чтобы глубины масштабировались в соответствии со вторым массивом, но я также хочу, чтобы данные были интерполированы (первые несколько глубин относительно близки друг к другу, а более низкие глубины расположены далеко друг от друга, что придает изображению pcolor блочный вид). .)

Вот что я делаю:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 365, 1)
X, Y = np.meshgrid(x, depth)    #depth is the (30, 1) array

plt.pcolor(X, -Y, data)         #data is the (30, 365) array

что приводит к блочному виду, есть идеи о том, как я могу получить более плавный график?


person pter    schedule 22.08.2012    source источник


Ответы (2)


Находятся ли ваши глубины на регулярной сетке (т. е. с постоянным интервалом)? Если это так, вы можете использовать imshow и установить диапазон с помощью ключевого слова extent и aspect='auto'. В противном случае у вас есть два варианта.

Вместо этого вы можете использовать pcolormesh и использовать shading='gouraud'. Это поможет с четким квантованием цвета, но не так хорошо, как интерполяция.

Второй вариант — интерполировать данные в новую обычную сетку глубины, поэтому вы можете использовать imshow и другие параметры интерполяции. Например, для интерполяции только по направлению глубины вы можете использовать interpolate.interp1d scipy:

from scipy.interpolate import interp1d

fint = interp1d(depth, data.T, kind='cubic')
newdata = fint(newdepth).T

.T были добавлены, потому что интерполяция должна быть по последнему индексу, а глубина — это первый индекс ваших данных. Вы можете заменить kind на 'linear', если хотите.

person tiago    schedule 22.08.2012
comment
Это не на обычной сетке. У pcolormesh был интересный результат, но он казался слишком нечетким. Я думаю, что интерполяция в обычную сетку, а затем использование imshow - это путь, но я не совсем смог понять, как это сделать. - person pter; 23.08.2012
comment
Я только что обновил свой ответ простым примером интерполяции. - person tiago; 23.08.2012

нет, pcolor не выполняет интерполяцию. Вместо этого вы можете попробовать NonUniformImageили даже imshow. Ознакомьтесь с примерами здесь

person nye17    schedule 22.08.2012
comment
Я думаю, проблема не столько в том, что я застрял на pcolor, сколько в том, что я не знаю, как создать график, который будет придерживаться одной и той же оси (если это имеет смысл) - person pter; 23.08.2012
comment
@pter Если я правильно вас понял на этот раз, вам нужна цветовая шкала, которая более растянута для больших глубин и меньше для низких? - person nye17; 23.08.2012
comment
Хм, я не уверен, хочу ли я этого. На моем графике pcolor верхние глубины плавно переходят друг в друга, верхний 1 - это всего лишь пиксель, и они постепенно становятся выше оттуда, поэтому очень легко увидеть линию, где встречаются нижняя и вторая по глубине глубины. Я хотел бы добавить изображение моего участка. - person pter; 23.08.2012
comment
@pter сюжет поможет, почему бы и нет? - person nye17; 23.08.2012
comment
@pter звучит так, как будто вы хотите растянуть свою ось, почему бы не сделать логарифмическую шкалу для вашей глубины? - person nye17; 23.08.2012
comment
Я действительно изо всех сил пытаюсь понять, как загрузить это изображение. Мне нужно, чтобы шкала оставалась неизменной, иначе логарифмическая шкала определенно решила бы проблему. - person pter; 23.08.2012
comment
@pter у тебя готово изображение или нет? если да, вы можете просто щелкнуть значок изображения в верхней части окна редактирования после того, как вы нажмете кнопку редактирования под своим сообщением. - person nye17; 23.08.2012
comment
@pter, тем не менее, вы можете выполнить преобразование для своей переменной глубины, что-то вроде z = log (15.0 - depth), чтобы выделить более высокие глубины. А для цветовой полосы вы можете вручную изменить метки осей, чтобы они были фактическими значениями глубины, а не z, хотя вы будете использовать z на графике pcolor. - person nye17; 23.08.2012
comment
Извините, наверное, я запутался в том, что вы говорите. Что такое переменная z? - person pter; 23.08.2012