Создание карт Spectral Heat или карт интенсивности из данных CDIP с использованием Ruby - PullRequest
2 голосов
/ 02 марта 2011

ПРЕДПОСЫЛКИ

В соответствии с программой данных береговой информации (CDIP) они создают карту спектральной интенсивности / интенсивности для волнения при http://cdip.ucsd.edu/?nav=recent&sub=observed&units=metric&tz=UTC&pub=public&map_stati=1,2,3&stn=100&stream=p1&xitem=dir_spectrum.

Этодинамически генерируется с данными, содержащими плотность энергии, продолжительность (в секундах) и направление (в градусах с 180 градусами, представляющими юг).

ОБРАЗЕЦ ДАННЫХ

Вот объяснениеданные: http://cdip.ucsd.edu/data_access/MEM_2dspectra.cdip

Вот образец данных для буя 100 (тот же буй, как показано на карте тепла / интенсивности / спектральной карты: http://cdip.ucsd.edu/data_access/MEM_2dspectra.cdip?100

ВОПРОС

Как мне взять эти 2-мерные данные и создать карту интенсивности / интенсивности, обеспечивающую ее наложение на карту полярных координат (и соответствующий масштаб), как пример URL-адреса на сайте КРИС?

В конечном счете, мне нужно, чтобы это было сделано в Ruby, предпочтительно с использованием ruby-gd или Rmagick, но я также был бы очень признателен за любые решения, не зависящие от языка.

Ответы [ 2 ]

3 голосов
/ 02 марта 2011

Я действительно спешу, поэтому не могу сейчас закончить, но, поскольку никто еще не ответил, вот первый подход:

Код в Mathematica (извините, как я уже говорил, сейчас нет времени):

a = Import["http://cdip.ucsd.edu/data_access/MEM_2dspectra.cdip?100", 
   "Table"];

Graphics@Flatten[Table[

    (*colors, dont mind*)
    {ColorData["CMYKColors"][(a[[r, t]] - .000007)/(.0003 - 0.000007)], 

    (*point size, dont mind*)
    PointSize[1/Sqrt[r]/10], 

    (*Coordinates for your points "a" is your data matrix *)
       Point[
            {(rr =Log[.025 + (.58 - .25)/64 r]) Cos@(tt = t 5 Degree), 
              rr Sin@tt}]
            }

     (*values for the iteration*)
     , {r, 7, 64}, {t, 1, 72}], 1] 

     (*Rotation, dont mind*)
     /. gg : Graphics[___] :> Rotate[gg, Pi/2]  

Я все еще не могу получить правильную цветовую шкалу:

enter image description here

2 голосов
/ 03 марта 2011

Chip, Я знаю, не используя Руби, но предполагая, что подсчет очков у Велизария в порядке, я бы вместо этого использовал ListContourPlot от Mathematica, так как это намного проще для понимания и дает более ясную картину.

(* Read in data, the web address can be specified *)
a = Import[<url of cpid data>, "Table"];

Import оставляет в теге pre в первом подсписке и в качестве отдельного подсписка элементов в конце это удаляет его

dat = a[[ ;; -2]][[All, -72;; ]];

сначала взяв все элементы, кроме последнего, а затем взяв последние 72 элемента каждого из оставшихся подсписков.

ListContourPlot ожидает список точек вида {{x, y, f}, ...}, поэтому нам нужно преобразовать dat в эту форму, как объяснено в другом месте :

pts =Flatten[
    Table[ {
          (rr =Log[.025 + (.58 - .25)/64 r]) Cos@(tt = t 5 Degree), (* x-coord *)
          rr Sin@tt, (* y-coord *)
          dat[[r,t]] (* function value *)
           },
           {r, 7, 64}, {t, 1, 72}
         ],
    1 ]

, а затем построить их

ListContourPlot[pts,
  ColorFunctionScaling -> False,
  ColorFunction -> (ColorData["CMYKColors"][(# - .000007)/(.0003 - 0.000007)]&)
  ]

Это дает:

ListContourPlot of cpid data supplied by OP

, который можно исправить, исправив отсечение и масштабирование ColorFunction. Кроме того, с некоторыми работами могут быть добавлены радиальные контуры.

...