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ď č. 1Som 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:
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:
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.