Plotly - การเพิ่มปุ่มแบบเลื่อนลง

Plotly ให้การโต้ตอบในระดับสูงโดยใช้การควบคุมที่แตกต่างกันในพื้นที่การวางแผนเช่นปุ่มดรอปดาวน์และแถบเลื่อนเป็นต้นการควบคุมเหล่านี้รวมเข้ากับ updatemenuแอตทริบิวต์ของโครงร่างพล็อต คุณสามารถadd button และพฤติกรรมของมันโดยระบุวิธีการที่จะเรียกใช้

มีสี่วิธีที่เป็นไปได้ที่สามารถเชื่อมโยงกับปุ่มดังต่อไปนี้ -

  • restyle - แก้ไขข้อมูลหรือคุณสมบัติของข้อมูล

  • relayout - แก้ไขแอตทริบิวต์เค้าโครง

  • update - แก้ไขข้อมูลและคุณลักษณะเค้าโครง

  • animate - เริ่มหรือหยุดภาพเคลื่อนไหวชั่วคราว

restyle ควรใช้วิธีการเมื่อ modifying the data and data attributesของกราฟ ในตัวอย่างต่อไปนี้ปุ่มสองปุ่มจะถูกเพิ่มโดยUpdatemenu() วิธีการจัดวางด้วย restyle วิธี.

go.layout.Updatemenu(
type = "buttons",
direction = "left",
buttons = list([
   dict(args = ["type", "box"], label = "Box", method = "restyle"),
   dict(args = ["type", "violin"], label = "Violin", method = "restyle" )]
))

มูลค่าของ type คุณสมบัติคือ buttonsโดยค่าเริ่มต้น. ในการแสดงรายการปุ่มแบบเลื่อนลงให้เปลี่ยนประเภทเป็นdropdown. การติดตามกล่องที่เพิ่มเข้าไปในออบเจ็กต์ Figure ก่อนอัปเดตโครงร่างตามด้านบน รหัสที่สมบูรณ์ที่แสดงผลboxplot และ violin plot ขึ้นอยู่กับปุ่มที่คลิกมีดังนี้ -

import plotly.graph_objs as go
fig = go.Figure()
fig.add_trace(go.Box(y = [1140,1460,489,594,502,508,370,200]))
fig.layout.update(
   updatemenus = [
      go.layout.Updatemenu(
         type = "buttons", direction = "left", buttons=list(
            [
               dict(args = ["type", "box"], label = "Box", method = "restyle"),
               dict(args = ["type", "violin"], label = "Violin", method = "restyle")
            ]
         ),
         pad = {"r": 2, "t": 2},
         showactive = True,
         x = 0.11,
         xanchor = "left",
         y = 1.1,
         yanchor = "top"
      ), 
   ]
)
iplot(fig)

ผลลัพธ์ของรหัสได้รับด้านล่าง -

คลิกที่ Violin ปุ่มเพื่อแสดงรายการที่เกี่ยวข้อง Violin plot.

ดังกล่าวข้างต้นมูลค่าของ type คีย์ Updatemenu() มีการกำหนดวิธีการ dropdownเพื่อแสดงรายการปุ่มแบบเลื่อนลง พล็อตปรากฏดังต่อไปนี้ -

updateควรใช้วิธีการเมื่อแก้ไขข้อมูลและส่วนเค้าโครงของกราฟ ตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการอัปเดตและการติดตามใดที่แสดงในขณะที่อัปเดตแอตทริบิวต์โครงร่างพร้อมกันเช่นชื่อแผนภูมิ สองร่องรอยการกระจายที่สอดคล้องกับsine and cos wave จะถูกเพิ่มไปที่ Figure object. ร่องรอยที่มองเห็นได้attribute เช่น True จะปรากฏบนพล็อตและร่องรอยอื่น ๆ จะถูกซ่อนไว้

import numpy as np
import math #needed for definition of pi

xpoints = np.arange(0, math.pi*2, 0.05)
y1 = np.sin(xpoints)
y2 = np.cos(xpoints)
fig = go.Figure()
# Add Traces
fig.add_trace(
   go.Scatter(
      x = xpoints, y = y1, name = 'Sine'
   )
)
fig.add_trace(
   go.Scatter(
      x = xpoints, y = y2, name = 'cos'
   )
)
fig.layout.update(
   updatemenus = [
      go.layout.Updatemenu(
         type = "buttons", direction = "right", active = 0, x = 0.1, y = 1.2,
         buttons = list(
            [
               dict(
                  label = "first", method = "update",
                  args = [{"visible": [True, False]},{"title": "Sine"} ]
               ),
               dict(
                  label = "second", method = "update", 
                  args = [{"visible": [False, True]},{"title": Cos"}]
               )
            ]
         )
      )
   ]
)
iplot(fig)

เริ่มแรก Sine curveจะปรากฏขึ้น หากคลิกที่ปุ่มที่สองcos trace ปรากฏขึ้น

โปรดทราบว่า chart title ยังอัปเดตตามนั้น

เพื่อที่จะใช้ animate วิธีการเราต้องเพิ่มอย่างน้อยหนึ่งอย่าง Frames to the Figureวัตถุ. นอกจากข้อมูลและเลย์เอาต์แล้วยังสามารถเพิ่มเฟรมเป็นคีย์ในออบเจ็กต์รูปได้ คีย์เฟรมจะชี้ไปที่รายการของตัวเลขซึ่งแต่ละตัวจะถูกวนรอบเมื่อมีการเรียกใช้ภาพเคลื่อนไหว

คุณสามารถเพิ่มปุ่มเล่นและหยุดชั่วคราวเพื่อแนะนำภาพเคลื่อนไหวในแผนภูมิได้โดยการเพิ่มไฟล์ updatemenus array ไปยังเค้าโครง

"updatemenus": [{
   "type": "buttons", "buttons": [{
      "label": "Your Label", "method": "animate", "args": [frames]
   }]
}]

ในตัวอย่างต่อไปนี้ a scatter curveร่องรอยถูกพล็อตครั้งแรก จากนั้นเพิ่มframes ซึ่งเป็นรายการของ 50 Frame objectsแต่ละอันแสดงถึงไฟล์ red markerบนเส้นโค้ง โปรดทราบว่าไฟล์args แอตทริบิวต์ของปุ่มถูกตั้งค่าเป็นไม่มีเนื่องจากเฟรมทั้งหมดเป็นภาพเคลื่อนไหว

import numpy as np
t = np.linspace(-1, 1, 100)
x = t + t ** 2
y = t - t ** 2
xm = np.min(x) - 1.5
xM = np.max(x) + 1.5
ym = np.min(y) - 1.5
yM = np.max(y) + 1.5
N = 50
s = np.linspace(-1, 1, N)
#s = np.arange(0, math.pi*2, 0.1)
xx = s + s ** 2
yy = s - s ** 2
fig = go.Figure(
   data = [
      go.Scatter(x = x, y = y, mode = "lines", line = dict(width = 2, color = "blue")),
      go.Scatter(x = x, y = y, mode = "lines", line = dict(width = 2, color = "blue"))
   ],
   layout = go.Layout(
      xaxis=dict(range=[xm, xM], autorange=False, zeroline=False),
      yaxis=dict(range=[ym, yM], autorange=False, zeroline=False),
      title_text="Moving marker on curve",
      updatemenus=[
         dict(type="buttons", buttons=[dict(label="Play", method="animate", args=[None])])
      ]
   ),
   frames = [go.Frame(
      data = [
            go.Scatter(
            x = [xx[k]], y = [yy[k]], mode = "markers", marker = dict(
               color = "red", size = 10
            )
         )
      ]
   )
   for k in range(N)]
)
iplot(fig)

ผลลัพธ์ของรหัสระบุไว้ด้านล่าง -

เครื่องหมายสีแดงจะเริ่มเคลื่อนที่ไปตามเส้นโค้งเมื่อคลิก play ปุ่ม.