Рисование стрелок на краях кривой

Вдохновленный этим вопросом на 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]}}]
  }]

arrow cos(12 x^2)

. Альтернативный метод - просто заменить объекты Line [] , созданные с помощью Plot [] , на 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]]

multiple plots

Но здесь есть проблема, заключающаяся в том, что любые разрывы в линиях генерируют стрелки там, где они вам не нужны (это часто можно исправить с помощью опции Исключения -> Нет ). Что еще более важно, этот подход безнадежен с CountourPlot s. Например, попробуйте

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} или с помощью соответствующих односторонних стрелок.).

Как видите, ни один из вышеперечисленных (быстрых приемов) не является особенно надежным или гибким. Кто-нибудь знает такой подход?

10
задан Simon 22 February 2011 в 06:42
поделиться