是否有可能在Mathematica中创建极地CountourPlot / ListCountourPlot / DensityPlot?

时间:2011-04-23 16:40:36

标签: wolfram-mathematica

我希望绘制类似于低语画廊模式的东西 - 极坐标中的2D圆柱对称图。像这样:

whispering gallery modes

我在Trott的符号指南中找到了以下代码片段。尝试在非常小的数据集上运行它;它吃了4 GB的内存并给我的内核灌了一把:

(* add points to get smooth curves *)
addPoints[lp_][points_, \[Delta]\[CurlyEpsilon]_] := 
Module[{n, l}, Join @@ (Function[pair,
       If[(* additional points needed? *)
          (l = Sqrt[#. #]&[Subtract @@ pair]) < \[Delta]\[CurlyEpsilon], pair, 
          n = Floor[l/\[Delta]\[CurlyEpsilon]] + 1; 
          Table[# + i/n (#2 - #1), {i, 0, n - 1}]& @@ pair]] /@ 
          Partition[If[lp === Polygon, 
                       Append[#, First[#]], #]&[points], 2, 1])]

(* Make the plot circular *)
With[{\[Delta]\[CurlyEpsilon] = 0.1, R = 10}, 
 Show[{gr /. (lp : (Polygon | Line))[l_] :> 
     lp[{#2 Cos[#1], #2 Sin[#1]} & @@@(* add points *)
       addPoints[lp][l, \[Delta]\[CurlyEpsilon]]], 
   Graphics[{Thickness[0.01], GrayLevel[0], Circle[{0, 0}, R]}]}, 
  DisplayFunction -> $DisplayFunction, Frame -> False]]

这里,gr是一个矩形的2D ListContourPlot,使用类似的东西生成(例如):

data = With[{eth = 2, er = 2, wc = 1, m = 4}, 
   Table[Re[
     BesselJ[(Sqrt[eth] m)/Sqrt[er], Sqrt[eth] r wc] Exp[
       I m phi]], {r, 0, 10, .2}, {phi, 0, 2 Pi, 0.1}]];
gr = ListContourPlot[data, Contours -> 50, ContourLines -> False, 
  DataRange -> {{0, 2 Pi}, {0, 10}}, DisplayFunction -> Identity, 
  ContourStyle -> {Thickness[0.002]}, PlotRange -> All, 
  ColorFunctionScaling -> False]

有没有直接的方法来做这样的圆柱形图?我觉得很难相信我必须转向Matlab来满足我的曲线坐标需求:)

2 个答案:

答案 0 :(得分:12)

删除了以前的代码段,因为这显然是我提出的最佳答案:

With[{eth = 2, er = 2, wc = 1, m = 4}, 
 ContourPlot[
  Re[BesselJ[(Sqrt[eth] m)/Sqrt[er], Sqrt[eth] r wc] Exp[I phi m]]/. 
                                         {r ->Norm[{x, y}], phi ->ArcTan[x, y]}, 
  {x, -10, 10}, {y, -10, 10}, 
  Contours -> 50, ContourLines -> False, 
  RegionFunction -> (#1^2 + #2^2 < 100 &), 
  ColorFunction -> "SunsetColors"
 ]
]

enter image description here

修改

ContourPlot替换Plot3D并删除不受支持的选项:

enter image description here

答案 1 :(得分:7)

这是一个相对简单的问题。关键是如果你可以参数化它,你可以绘制它。根据文档,ListContourPlotListDensityPlot接受两种形式的数据:高度值数组或坐标列表加上函数值({{x, y, f} ..})。第二种形式更容易处理,即使您的数据是第一种形式,我们也会将其转换为第二种形式。

简单地说,将表单{{r, t, f} ..}的数据转换为{{x, y, f} ..}表格N[{#[[1]] Cos[ #[[2]] ], #[[1]] Sin[ #[[2]] ], #[[3]]}]& /@ data的数据,当应用于从BesselJ[1, r/2] Cos[3 t]获取的数据时

code for and plot of numerical data

当您拥有一组数据时,如this guy?在这种情况下,您有一个2D数组,其中数组中的每个点都具有已知位置,并且为了绘制它,您必须将其转换为第二种形式。我偏爱MapIndexed,但还有其他方法可以做到这一点。假设您的数据存储在一个数组中,其中行对应于径向坐标,列是角度坐标。然后转换它,我会使用

R = 0.01;    (*radial increment*)
T = 0.05 Pi; (*angular increment*)
xformed = MapIndexed[ 
   With[{r = #2[[1]]*R, t = #2[[1]]*t, f = #1},
   {r Cos[t], r Sin[t], f}]&, data, {2}]//Flatten[#,1]&

给出相同的结果。


如果您有分析解决方案,那么您需要将其转换为笛卡尔坐标,如上所述,但您使用替换规则。例如,

ContourPlot[ Evaluate[
    BesselJ[1, r/2]*Cos[3 t ] /. {r -> Sqrt[x^2 + y^2], t -> ArcTan[x, y]}], 
   {x, -5, 5}, {y, -5, 5}, PlotPoints -> 50, 
   ColorFunction -> ColorData["DarkRainbow"], Contours -> 25]

给出

analytic plot of Bessel in cylindrical coordinates

需要注意的两件事:1)需要Evaluate才能确保正确执行替换,并且2)ArcTan[x, y]会考虑在{x,y}中找到点{{1}}的象限