Построение изолиний в python

Май 28, 2009

Понадобилось мне для матрицы значений получить координаты изолинии этих значений. Матрица, разумеется, с регулярным шагом. Так как основная моя программа написана на python, то и программу, реализующую это тоже хотелось бы на питоне. Однако стихийный поиск не навёл меня на уже готовое решение. Разумеется, это можно было бы реализовать при помощи PyNGL или тому подобного, но мне необходимы сами координаты этих изолиний.
В общем, после непродолжительных мытарств, решился написать свой велосипед. Задача решена в лоб, и примитивно. Но, может, кому пригодиться.

Пример использования:

import isolines

data = [[21, 35, 55, 41], \
[24, 47, 77, 56], \
[12, 46, 54, 27], \
[8, 70, 82, 38], \
[6, 81, 109, 63], \
[9, 56, 77, 47], \
[11, 27, 54, 46], \
[20, 38, 82, 70]]

# список интервалов, через которые будут проведены изолинии
intervals=range(0,100,10)

»’
prepared_matrix — подготовленные ячейки, для дальнейших расчетов
calculated_dots — точки пересечения граней квадратов с горизонтальной плоскостью
coords — результат. координаты отрезков изолиний.
»’
prepared_matrix=isolines.prepare_matrix(data)
calculated_dots=isolines.calculate_dots(prepared_matrix,intervals)
coords=isolines.calculate_coords(calculated_dots)

print coords

Результат выполнения:

[[[30, 1.1428571428571428, 0.5, 0.76086956521739135, 1.5], \
[40, 1.5, 0.91666666666666674, 1.1956521739130435, 1.5]], \
[[40, 1.75, 0.5, 1.5, 0.91666666666666674], \
[50, 2.25, 0.5, 1.6000000000000001, 1.5], \
[60, 2.5, 0.72727272727272729, 1.9333333333333333, 1.5], \
[70, 2.5, 1.1818181818181817, 2.2666666666666666, 1.5]], ….

Список, в котором отдельно для каждой ячейки и для каждой стороны этой ячейки содержатся координаты отрезков изолиний, и их значений в виде:
[значение изолинии, x1, y1, x2, y2]

А вот как это решение выглядит в графическом виде:
Изолинии
Не самая красивая диаграмма. Но характер распределения передает.

Может, у кого-то есть более изящное решение?

Реклама

комментария 2 to “Построение изолиний в python”

  1. sim Says:

    а как же наш старый добрый R?
    > library(sp)
    > library(gstat)
    > g p<-predict(g, newdata=grd)

    ну и т.д.
    PS: написал, а потом прочел что тебе нужно было в свою программу встроить, оставлю может кому пригодится.

    • fatune Says:

      Да. Хотелось бы на питоне. Но, R — штука стоящая, так что в случае чего, не стыдно и им воспользоваться.

      А что, эта строка мне массив координат выдаст?


Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: