Slider dengan kutu

Aug 21 2020

Saya tidak senang dengan tampilan slider "Berlabel" di Animate atau Manipulate. Sebagai gantinya, saya ingin mencentang dengan beberapa pi di bawah slider.

Animate[Plot[Sin[x + phi], {x, 0, 2 Pi}], {phi, 0, 2 Pi, 
Appearance -> "Labeled"}]

Apa cara terbaik untuk melakukannya? Idealnya akan terlihat seperti ini:

Saya tidak berpikir solusi diberikan https://mathematica.stackexchange.com/a/8264praktis atau bahkan elegan. Mengikuti logika penambahan sumbu tambahan ini, saya tidak dapat membuatnya terlihat seperti yang saya inginkan dan, secara umum, terlihat sangat "artifisial".

Jawaban

12 kglr Aug 21 2020 at 11:38

1. Anda dapat menggunakan HorizontalGaugesebagai kontrol di Manipulate:

Manipulate[Plot[Sin[x + phi], {x, 0, 2 Pi}], 
 {phi, 0, 2 Pi, Panel[HorizontalGauge[##, ScaleDivisions -> None, 
      Axes -> {True, False}, ImageSize -> 250, 
      Ticks -> {Transpose[{Subdivide[8], Subdivide[0, 2 Pi, 8]}], None}], #, Right] &}]

Untuk mengizinkan hanya nilai diskrit, katakan kelipatan dari Pi/4, untuk variabel kontrol phi:

Manipulate[Plot[Sin[x + phi], {x, 0, 2 Pi}], 
 {phi, 0, 2 Pi, Panel[HorizontalGauge[Dynamic[phi, (phi = Round[#, Pi/4]) &], ##2, 
      ScaleDivisions -> None, ImagePadding -> 15, 
      PlotRange -> {{0, 1}, Automatic}, 
      Axes -> {True, False}, ImageSize -> 250, 
      Ticks -> {Thread[{Subdivide[8], Subdivide[## & @@ #2, 8], {0, .05}}, 
          List, 2], None}], #, Right] &}]

2. Alternatifnya, Anda dapat menggunakan kontrol kustom orang miskin yang menggabungkan penggeser dan grafik kosong dengan sumbu horizontal:

Manipulate[Plot[Sin[x + phi], {x, 0, 2 Pi}], 
   {phi, 0, 2 Pi, Labeled[Panel @ Column[{Slider[##, ImageSize -> 250], 
       Graphics[{}, Axes -> {True, False}, 
        Ticks -> {Subdivide[## & @@ #2, 8], None}, ImageSize -> 250, 
        PlotRange -> {#2, {0, .05}}]}, Alignment -> Center, 
      Spacings -> 0], #, Right] &}]

3. Kita juga dapat memodifikasi fungsi ValueThumbSliderdari tutorial / AdvancedManipulateFunctionality >> Penampilan CustomControl untuk mendapatkan slider kustom dengan sumbu:

ClearAll[sliderWithAxis]
sliderWithAxis[Dynamic[var_], {min_, max_, d_}, o : OptionsPattern[]] := 
 LocatorPane[Dynamic[If[! NumberQ[var], var = min]; 
   {var, 0}, (var = First[#]) &],
  Panel[Graphics[{Dynamic[
      Polygon[Offset[#, {var, 0}] & /@ {{0, 5}, {-5, 15}, {5, 15}}]]},
    o, ImageSize -> 300, ImagePadding -> {{15, 15}, {30, 5}}, 
    Axes -> {True, False}, 
    Ticks -> {{#, #, {0, .025}} & /@ Range[min, max, d], None}, 
    PlotRange -> {{min, max}, {-1, 1}}, AspectRatio -> 1/10], 
   Dynamic[Style[Round[var, d], 16]], Right, Background -> LightBlue, 
   Alignment -> Center],
  {{min, 0}, {max, 0}, {d, 0}}, Appearance -> None]

Manipulate[ Plot[{Sin[x + phi], Cos[x + psi]}, {x, 0, 2 Pi}], 
 {phi, 0, 2 Pi, Pi/4, sliderWithAxis[##] &}, 
 {psi, 0, 2 Pi, Pi/2, sliderWithAxis[##] &}]