【发布时间】:2025-12-21 04:05:11
【问题描述】:
受this question at ask.sagemath 的启发,在Plot、ContourPlot 等产生的曲线末端添加箭头的最佳方法是什么?这些是高中时看到的图类型,表明曲线在页面末尾继续。
经过一番搜索,我找不到执行此操作的内置方式或最新包。 (有ArrowExtended,不过比较老了)。
ask.sagemath 问题中给出的解决方案依赖于函数及其端点的知识,以及(也许)求导的能力。它在 Mathematica 中的翻译是
f[x_] := Cos[12 x^2]; xmin = -1; xmax = 1; small = .01;
Plot[f[x],{x,xmin,xmax}, PlotLabel -> y==f[x], AxesLabel->{x,y},
Epilog->{Blue,
Arrow[{{xmin,f[xmin]},{xmin-small,f[xmin-small]}}],
Arrow[{{xmax,f[xmax]},{xmax+small,f[xmax+small]}}]
}]
另一种方法是简单地将Plot[] 生成的Line[] 对象替换为Arrow[]。例如
Plot[{x^2, Sin[10 x], UnitStep[x]}, {x, -1, 1},
PlotStyle -> {Red, Green, {Thick, Blue}},
(*AxesStyle -> Arrowheads[.03],*) PlotRange -> All] /.
Line[x__] :> Sequence[Arrowheads[{-.04, .04}], Arrow[x]]
但这有一个问题,即线条中的任何不连续性都会在您不想要它们的地方生成箭头(这通常可以通过选项Exclusions -> None 修复)。更重要的是,这种方法对CountourPlots 是没有希望的。比如试试
ContourPlot[x^2 + y^3 == 1, {x, -2, 2}, {y, -2, 1}] /.
Line[x__] :> Sequence[Arrowheads[{-.04, .04}], Arrow[x]]
(上述情况下的问题可以通过规则来解决,例如{a___, l1_Line, l2_Line, b___} :> {a, Line[Join[l2[[1]], l1[[1]]]], b}或使用适当的单头箭头。)。
如您所见,上述两种方法(快速技巧)都不是特别健壮或灵活的。有谁知道这种方法吗?
【问题讨论】:
-
我可以建议找到 Plot 上/下产生的点
-
@Alexey:我不太确定你在暗示什么......
-
@Simon 抱歉,句子不完整。在不连续的情况下,我可以建议找到位于
PlotRange边缘的点。例如:xmin = -2 Pi; xmax = Pi; Plot[Tan[x], {x, xmin, xmax}, Exclusions -> {Cos[x] == 0}] /. {x_Line?(Abs[#[[1, 1, 1]] - xmin] < 1*^-6 && Abs[#[[1, -1, 1]] - xmax] < 1*^-6 &) :> Sequence[Arrowheads[{-.04, .04}], Arrow[x]], x_Line?(Abs[#[[1, 1, 1]] - xmin] < 1*^-6 &) :> Sequence[Arrowheads[{-.04, 0}], Arrow[x]], x_Line?(Abs[#[[1, -1, 1]] - xmax] < 1*^-6 &) :> Sequence[Arrowheads[{0, .04}], Arrow[x]] }. -
@Alexey:我以为这就是你的意思。感谢您的代码-如果您将其放入答案中,我会投票赞成。这也是我想到的,但是如果绘图范围意味着一条线从顶部或底部而不是侧面退出绘图,会发生什么?您必须从生成的图中提取 PlotRange 并在规则中使用它...
-
@Simon 最近发现了这个users.dimi.uniud.it/~gianluca.gorni/Mma/Mma.html(未测试)