Создание спектральных тепловых карт или карт интенсивности из данных CDIP с использованием Ruby

ИСТОРИЯ

Согласно Программе прибрежных информационных данных (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

ВОПРОС

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

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


person Chip Castle    schedule 01.03.2011    source источник


Ответы (2)


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

Код в системе 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]  

Я до сих пор не могу подобрать нужную цветовую гамму:

введите описание изображения здесь

person Dr. belisarius    schedule 02.03.2011
comment
Спасибо за быстрый пример, но у меня нет опыта работы с Mathematica (и не с Matlab или gnuplot, как мне предлагали другие). Не могли бы вы прокомментировать код, чтобы я понял, что он делает? Спасибо! - person Chip Castle; 02.03.2011
comment
@Chip да, но не сейчас, так как я переполнен. На объяснение этого кода уходит больше времени, чем на его написание. Если вы можете подождать, я вернусь к этому, как только рабочий поток позволит мне. - person Dr. belisarius; 02.03.2011
comment
Или, если вы спешите, вы можете опубликовать код здесь под тегом mathematica, и я уверен, что кто-то придет вас спасти. Здесь есть приятное математическое сообщество. - person Dr. belisarius; 02.03.2011
comment
почему поворот на 90 градусов? что я не вижу в данных? - person rcollyer; 03.03.2011
comment
@rcollyer OP пытается воспроизвести этот график cdip.ucsd.edu/, как указано в вопросе. Мне удалось почти добраться туда, просто догадавшись ... - person Dr. belisarius; 03.03.2011
comment
@rcollyer Остерегайтесь, сюжет меняется каждый день, мой теперь история - person Dr. belisarius; 03.03.2011
comment
Если присмотреться к примеру, кажется, что ноль градусов - это + y с, а его возрастание по часовой стрелке полностью отличается от обычной практики. Это означает, что нужно поменять местами Sin и Cos. - person rcollyer; 03.03.2011
comment
@rcollyer Ops ... и теперь я увидел, что углы измеряются по часовой стрелке. Эти парни должны быть врачами. - person Dr. belisarius; 03.03.2011
comment
@rcollyer ага. Sin и Cos поменялись местами и повернулись, радиус в перевернутой шкале, центр с отверстием. Они определенно курили что-то действительно хорошее (И шкала журнала) - person Dr. belisarius; 03.03.2011
comment
@belisarius @rcollyer, вы, ребята, явно не были мальчишками - вы когда-нибудь видели компас: en.wikipedia.org/wiki/File:Compass_rose.png? ;П) - person Janus; 04.03.2011
comment
@Janus Эти вещи можно перенормировать? - person Dr. belisarius; 04.03.2011
comment
@belisarius Похоже, что в этом коде чего-то не хватает (после & @). - person Sjoerd C. de Vries; 04.01.2012
comment
@Sjoerd Нет. & @ Не понадобились, вероятно, остаток предыдущей версии. Кстати, вы видели это: stackoverflow.com/a/8694075/353410 - person Dr. belisarius; 04.01.2012

Чип, я знаю, не использует Ruby, но если предположить, что расчет точек Велисария в порядке, я бы использовал _ 1_ вместо этого, так как это намного проще для понимания и дает более ясную картину.

(* 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 данных cpid, предоставленных OP

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

person rcollyer    schedule 02.03.2011
comment
+1 снова ... но я не могу. Я никогда не видел Import [url, Table] .. это здорово. - person Dr. belisarius; 03.03.2011
comment
Я знал, что ММА может это сделать, и изначально я пробовал это с ReadList, но, увы, он не смог. Однако импорт ... Единственная загвоздка заключалась в том, чтобы убедиться, что он был импортирован правильно. - person rcollyer; 03.03.2011
comment
Очень жаль, что ОП не удосужился проверить ваш ответ. Иногда люди задают вопросы просто так :( - person Dr. belisarius; 24.04.2011