/ / Vytváranie spektrálnych tepelných máp alebo máp intenzity z údajov CDIP pomocou programu Ruby - ruby, map, heat, spectral

Vytváranie spektrálnych tepelných máp alebo intenzívnych máp z údajov CDIP pomocou Ruby - rubín, mapa, teplo, spektrálne

POZADIE

Podľa programu Coastal Information Data Program (CDIP) generujú mapu spektrálneho tepla / intenzity pre vlnové zväčšenie 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.

Toto sa dynamicky generuje údajmi obsahujúcimi hustotu energie, trvanie (v sekundách) a smer (v stupňoch, pričom 180 stupňov predstavuje juh).

VZORKA ÚDAJOV

Tu je vysvetlenie údajov: http://cdip.ucsd.edu/data_access/MEM_2dspectra.cdip

Tu je vzorka údajov pre bóju 100 (rovnaká bója, ako je znázornená na mape tepla / intenzity / spektra: http://cdip.ucsd.edu/data_access/MEM_2dspectra.cdip?100

OTÁZKA

Ako vezmem tieto 2-rozmerné údaje a vytvorím mapu tepla / intenzity, ktorá zabezpečí, že bude prekrytá na mape Polar Coordinate (a má príslušnú mierku), rovnako ako príklad adresy URL na webe CDIP?

Nakoniec to musím urobiť v Ruby, najlepšie pomocou ruby-gd alebo Rmagick, ale tiež by som veľmi ocenil akékoľvek jazykovo-agnostické riešenia.

odpovede:

3 pre odpoveď č. 1

Som naozaj v zhone, takže teraz nemôžem skončiť, ale ako zatiaľ nikto neodpovedal, tu je prvý prístup:

Kód v Mathematica (prepáčte, ako som povedal, že teraz nemám čas):

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]

Stále nemôžem získať správnu farebnú škálu:

tu zadajte popis obrázku


1 pre odpoveď č. 2

Čip, Viem, že nepoužívam Ruby, ale za predpokladu, že výpočet bodu Belisariusa je v poriadku, použijem Mathematicu ListContourPlot namiesto toho je to oveľa jednoduchšie pochopiť a poskytuje to čistejší obraz.

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

Import listy v a pre značka v prvom podzoznamu a ako podzoznam jedného prvku na konci ju to odstráni

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

tak, že najskôr zoberiete všetky prvky okrem posledného a potom z posledných 72 podzostáv vyberiete posledných 72 prvkov.

ListContourPlot očakáva zoznam bodov formulára {{x, y, f}, ...}, takže sa musíme transformovať dat do tejto formy, ako je vysvetlené inde:

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 ]

a potom ich vykresliť

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

To dáva:

ListContourPlot údajov cpid poskytnutých OP

ktorých je možné sa dotknúť pripevnením sponky a ColorFunction škálovanie. K niektorým pracovným miestam je možné pridať radiálne kontúry.