0
votes

I’m trying to make subplots with these two plots and cannot make it work. I need the output to be a “div” with the two plots stacked vertically as subplots. Normally I would just use Matplotlib -- but I need the 3D ribbon plot from Plotly.

Like this:

plot 1

plot 2

Thank you for your help!

Eric

import plotly.graph_objs as go
import plotly.plotly as py
import plotly.figure_factory as ff
import plotly.offline as offline
from plotly import tools
import numpy as np

data0 = list(np.random.normal(-5,.5,25))
data1 = list(np.random.normal(-3.5,1,25))
data2 = list(np.random.normal(0,2,25))
data3 = list(np.random.normal(1,1,25))
data4 = list(np.random.normal(5,3,25))
data5 = list(np.random.normal(7,5,25))
index = list(range(0,len(data0),1))

spectra = [
index,
data0,
data1,
data2,
data3,
data4,
data5
]

spectra = np.transpose(spectra)

traces1 = []
y_raw = spectra[:, 0] # wavelength
sample_size = spectra.shape[1]-1
for i in range(1, sample_size):
z_raw = spectra[:, i]
x = []
y = []
z = []
ci = int(255/sample_size*i) # ci = “color index”
for j in range(0, len(z_raw)):
    z.append([z_raw[j], z_raw[j]])
    y.append([y_raw[j], y_raw[j]])
    x.append([i*2, i*2+1])
    traces1.append(dict(
    z=z,
    x=x,
    y=y,
    colorscale=[ [i, 'rgb(100,%d,255)'%ci] for i in np.arange(0, 1.1, 0.1)],
    showscale = False,
    showlegend = True,
    type='surface',
))

# First subplot
fig1 = {'data':traces1, 'layout':{'title':'Ribbon Plot'}}
div1 = offline.plot(fig1, filename='Distplot with Multiple Datasets',show_link=False, include_plotlyjs=False, output_type='div')

traces2 = [data0, data1, data2, data3, data4, data5]

group_labels = ['a0', 'a1', 'a2', 'a3', 'a4', 'a5']
# Second subplot

fig2 = ff.create_distplot(traces2, group_labels, bin_size=.2)
div2 = offline.plot(fig2, filename='Distplot with Multiple Datasets', show_link=False, include_plotlyjs=False, output_type='div')
1
plot 1 and 2 are produced via the 'fig1', 'fig2' commands along with the 'div1' and 'div2' commands.EricJohnson
OK, one more thing: you are using ‘ and ’ instead of ' like ‘Blackbody’ replace by 'Blackbody', also could you please fix indentation problems in your code?emecas
Fixed intents and removed 'commented out' code for clarity.EricJohnson
there are still indentation issues as well as ‘ and ’ . On the other hand, which layout you would like? plot.ly/python/subplots .. maybe Stacked Subplots?emecas
Yes, stacked subplots. I don't know what you mean by ' and '.EricJohnson

1 Answers

1
votes

User Empet from Plotly posted a solution to my question here: https://plot.ly/~empet/14824

I added some custom coloring to make the plots look better together.

Very helpful! Thank you Empet!

import plotly.plotly as py
import plotly.graph_objs as go
import plotly.offline as offline
import plotly.plotly as py
import plotly.figure_factory as ff
import plotly.offline as offline
from plotly import tools
import numpy as np

fig = tools.make_subplots(specs=[[{'is_3d': True}], [{'is_3d':False}], [{'is_3d':False}]], vertical_spacing=0.005, rows=3, cols=1)

data0 = list(np.random.normal(-5,.5,25))
data1 = list(np.random.normal(-3.5,1,25))
data2 = list(np.random.normal(0,2,25))
data3 = list(np.random.normal(1,1,25))
data4 = list(np.random.normal(5,3,25))
data5 = list(np.random.normal(7,5,25))
index = list(range(0,len(data0),1))

spectra = [
    index,
    data0,
    data1,
    data2,
    data3,
    data4,
    data5
]

spectra = np.transpose(spectra)

y_raw = spectra[:, 0] # wavelength
sample_size = spectra.shape[1]-1
for i in range(1, sample_size):
    z_raw = spectra[:, i]
    x = []
    y = []
    z = []
    ci = int(255/sample_size*i) # ci = “color index”
    for j in range(0, len(z_raw)):
        z.append([z_raw[j], z_raw[j]])
        y.append([y_raw[j], y_raw[j]])
        x.append([i*2, i*2+1])
    fig.append_trace(dict(
                z=z,
                x=x,
                y=y,
                colorscale=[ [i, 'rgb(100,{}, 255)'.format(ci)] for i in np.arange(0, 1.1, 0.1)],
                showscale = False,
                showlegend = True,
                type='surface',
                ), 1, 1)


colors = ['rgb(100,000,255)', 'rgb(100,50,255)','rgb(100,100,255)','rgb(100,150,255)','rgb(100,200,255)','rgb(100,250,255)']

traces2 = [data0, data1, data2, data3, data4, data5]

group_labels = ['a0', 'a1', 'a2', 'a3', 'a4', 'a5']

# Second subplot
fig2 = ff.create_distplot(traces2, group_labels, bin_size=.2,colors =.  colors)

for mydata in fig2['data']:
    if mydata['yaxis']=='y1':
        fig.append_trace(mydata, 2, 1)
    else:
        fig.append_trace(mydata, 3, 1)

fig['layout']['scene1'].update(camera=dict(eye=dict(x=.25, y=.25, z=.25)))
fig['layout']['scene1']['domain'].update(y=[0.6, 1])

fig['layout']['yaxis2'].update(domain=[0, 0.1375])
fig['layout']['yaxis1'].update(domain=[0.1575, 0.55])
fig['layout']['xaxis2'].update(zeroline=False)#remove the line x=0 in the lower cell

fig['layout'].update(height=900, width=1000, autosize=True, legend=dict(x=1.1, y=0.40), barmode='overlay')

my_div = offline.plot(fig, filename='Distplot with Multiple Datasets', show_link=False, include_plotlyjs=False, output_type='div')

print(my_div)