3
votes

I have three traces, one of which I have in one subplot, and two of which are in another. I would like to have a distinct y-axis each of the traces in the subplot with 2 traces.

For example, I have

fig = plotly.tools.make_subplots(rows=2, cols=1, shared_xaxes=True)
fig.append_trace(trace1, 1, 1)
fig.append_trace(trace2, 1, 1)
fig.append_trace(trace3, 2, 1)
fig['layout'].update(height=200, width=400)

which produces

enter image description here

And when I have no subplots, I can get a second axis for the second trace with

layout = go.Layout(
    yaxis=dict(
        title='y for trace1'
    ),
    yaxis2=dict(
        title='y for trace2',
        titlefont=dict(
            color='rgb(148, 103, 189)'
        ),
        tickfont=dict(
            color='rgb(148, 103, 189)'
        ),
        overlaying='y',
        side='right'
    )
)
fig = go.Figure(data=data, layout=layout)

which produces

enter image description here

But I can't figure out how to get the first subplot in the first example to look like the plot in the second example: with a distinct axis for the second trace there.

How do I add an axis for a second trace in a Plotly subplot?

1

1 Answers

1
votes

This is a bit of a workaround, but it seems to work:

import plotly as py
import plotly.graph_objs as go
from plotly import tools
import numpy as np

left_trace = go.Scatter(x = np.random.randn(1000), y = np.random.randn(1000), yaxis = "y1", mode = "markers")
right_traces = []
right_traces.append(go.Scatter(x = np.random.randn(1000), y = np.random.randn(1000), yaxis = "y2", mode = "markers"))
right_traces.append(go.Scatter(x = np.random.randn(1000) * 10, y = np.random.randn(1000) * 10, yaxis = "y3", mode = "markers"))

fig = tools.make_subplots(rows = 1, cols = 2)
fig.append_trace(left_trace, 1, 1)
for trace in right_traces:
  yaxis = trace["yaxis"] # Store the yaxis
  fig.append_trace(trace, 1, 2)
  fig["data"][-1].update(yaxis = yaxis) # Update the appended trace with the yaxis

fig["layout"]["yaxis1"].update(range = [0, 3], anchor = "x1", side = "left")
fig["layout"]["yaxis2"].update(range = [0, 3], anchor = "x2", side = "left")
fig["layout"]["yaxis3"].update(range = [0, 30], anchor = "x2", side = "right", overlaying = "y2")

py.offline.plot(fig)

Produces this, where trace0 is in the first subplot plotted on yaxis1, and trace1 and trace2 are in the second subplot, plotted on yaxis2 (0-3) and yaxis3 (0-30) respectively: enter image description here

When traces are appended to subplots, the xaxis and yaxis seem to be overwritten, or that's my understanding of this discussion anyway.