title: Plotly Buttons with Dependent Interactions (Python)
body: <p>I am attempting to construct a Plotly 3D scatterplot with a large number of traces and several sets of buttons that determine which subset of the traces is visible. I would like for the buttons to interact in a manner that depends on the state of the other buttons. For example, suppose Button 1 and Button 2 belong to one bar of buttons and Button A and Button B belong to another bar, and that only one button in each bar can be pressed at a time. I'd like pressing Button A while Button 1 is active to display a different subset of traces than pressing Button A while Button 2 is active.</p>
  
  <p>I've included a toy example below. It has a data set of three traces and two bars of buttons, but each button's behavior is currently independent of the other buttons. I'd like the buttons to behave in a dependent manner, for example,</p>
  
  <ul>
  <li>1 and A pressed: show trace 1</li>
  <li>1 and B pressed: show traces 1 and 2</li>
  <li>2 and A pressed: show trace 3</li>
  <li>2 and B pressed: show all traces</li>
  </ul>
  
  <pre><code>from plotly.offline import plot
  import plotly.plotly as py
  import plotly.graph_objs as go
  import numpy as np
  
  x, y, z = np.random.multivariate_normal(np.array([0,0,0]), np.eye(3), 20).transpose()
  trace1 = go.Scatter3d(
      x=x,
      y=y,
      z=z,
      mode='markers',
      marker=dict(
          color='rgb(124, 252, 0)',
          size=12,
          opacity=0.8
      )
  )
  
  x2, y2, z2 = np.random.multivariate_normal(np.array([0,0,0]), np.eye(3), 20).transpose()
  trace2 = go.Scatter3d(
      x=x2,
      y=y2,
      z=z2,
      mode='markers',
      marker=dict(
          color='rgb(30, 144, 255)',
          size=12,
          opacity=0.8
      )
  )
  
  x3, y3, z3 = np.random.multivariate_normal(np.array([0,0,0]), np.eye(3), 20).transpose()
  trace3 = go.Scatter3d(
      x=x3,
      y=y3,
      z=z3,
      mode='markers',
      marker=dict(
          color='rgb(220, 20, 60)',
          size=12,
          opacity=0.8
      )
  )
  
  data = [trace1, trace2, trace3]
  
  layout = go.Layout(
      margin=dict(
          l=0,
          r=0,
          b=0,
          t=0
      )
  )
  
  button_layer_1_height = 1.12
  button_layer_2_height = 1.065
  
  updatemenus=list([
      dict(
          buttons=list([
              dict(
                  args=[{'visible': [True, False, True]}],
                  label='Button 1',
                  method='restyle'
              ),
              dict(
                  args=[{'visible': [True, True, False]}],
                  label='Button 2',
                  method='restyle'
              ),
          ]),
          direction = 'left',
          pad = {'r': 10, 't': 10},
          showactive = True,
          type = 'buttons',
          x = 0.1,
          xanchor = 'left',
          y = button_layer_1_height,
          yanchor = 'top'
      ),
      dict(
          buttons=list([
              dict(
                  args=[{'visible': [False, True, False]}],
                  label='Button A',
                  method='restyle'
              ),
              dict(
                  args=['visible', [True, False, False]],
                  label='Button B',
                  method='restyle'
              )
          ]),
          direction = 'left',
          pad = {'r': 10, 't': 10},
          showactive = True,
          type = 'buttons',
          x = 0.1,
          xanchor = 'left',
          y = button_layer_2_height,
          yanchor = 'top'
      ),
  ])
  
  layout['updatemenus']=updatemenus
  fig = go.Figure(data=data, layout=layout)
  plot(fig, filename='localtest.html')
  </code></pre>