我希望绘制类似于低语画廊模式的东西 - 极坐标中的2D圆柱对称图。像这样:
我在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来满足我的曲线坐标需求:)
答案 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"
]
]
修改强>
按ContourPlot
替换Plot3D
并删除不受支持的选项:
答案 1 :(得分:7)
这是一个相对简单的问题。关键是如果你可以参数化它,你可以绘制它。根据文档,ListContourPlot和ListDensityPlot接受两种形式的数据:高度值数组或坐标列表加上函数值({{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]
获取的数据时
当您拥有一组数据时,如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]
给出
需要注意的两件事:1)需要Evaluate
才能确保正确执行替换,并且2)ArcTan[x, y]
会考虑在{x,y}
中找到点{{1}}的象限