สไลเดอร์พร้อมเห็บ

Aug 21 2020

ฉันไม่พอใจกับลักษณะ "ติดป้ายกำกับ" ของแถบเลื่อนใน Animate หรือ Manipulate แต่ฉันต้องการให้ติ๊กด้วยหลาย pi ใต้แถบเลื่อน

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

วิธีที่ดีที่สุดจะทำอย่างไร? ตามหลักการแล้วควรมีลักษณะดังนี้:

ฉันไม่คิดว่าวิธีแก้ปัญหาที่ให้มา https://mathematica.stackexchange.com/a/8264ใช้งานได้จริงหรือหรูหรา ตามตรรกะของการเพิ่มแกนเพิ่มเติมนี้ฉันไม่สามารถทำให้มันออกมาเป็นแบบที่ฉันต้องการได้และโดยทั่วไปแล้วมันดูเหมือน "เทียม" อย่างมาก

คำตอบ

12 kglr Aug 21 2020 at 11:38

1.คุณสามารถใช้HorizontalGaugeเป็นตัวควบคุมใน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] &}]

หากต้องการอนุญาตเฉพาะค่าที่ไม่ต่อเนื่องให้พูดทวีคูณPi/4สำหรับตัวแปรควบคุม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.หรือคุณสามารถใช้การควบคุมแบบกำหนดเองของคนยากจนที่รวมแถบเลื่อนและกราฟิกว่างเปล่าเข้ากับแกนแนวนอน:

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.เรายังสามารถปรับเปลี่ยนฟังก์ชั่นValueThumbSliderจากบทช่วยสอน / AdvancedManipulateFunctionality >> CustomControl Appearancesเพื่อรับแถบเลื่อนที่กำหนดเองพร้อมแกน:

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[##] &}]