I think I am totally lost when it comes to Plotly Express
, Plotly_figure_factory
etc.
I cannot figure how to make subplots with Plotly ternary plots out.
First of all, I tried using Plotly Graph Objects, for example I take the ternary plot from ternary scatter plot with Plotly Graph Objects and try to make subplots as detailed here. Putting it all together I end up with
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.graph_objects as go
rawData = [
{'journalist':75,'developer':25,'designer':0,'label':'point 1'},
{'journalist':70,'developer':10,'designer':20,'label':'point 2'},
{'journalist':75,'developer':20,'designer':5,'label':'point 3'},
{'journalist':5,'developer':60,'designer':35,'label':'point 4'},
{'journalist':10,'developer':80,'designer':10,'label':'point 5'},
{'journalist':10,'developer':90,'designer':0,'label':'point 6'},
{'journalist':20,'developer':70,'designer':10,'label':'point 7'},
{'journalist':10,'developer':20,'designer':70,'label':'point 8'},
{'journalist':15,'developer':5,'designer':80,'label':'point 9'},
{'journalist':10,'developer':10,'designer':80,'label':'point 10'},
{'journalist':20,'developer':10,'designer':70,'label':'point 11'},
];
def makeAxis(title, tickangle):
return {
'title': {'text': title, 'font': { 'size': 20}},
'tickangle': tickangle,
'tickfont': { 'size': 15 },
'tickcolor': 'rgba(0,0,0,0)',
'ticklen': 5,
'showline': True,
'showgrid': True
}
fig = go.Figure(go.Scatterternary({
'mode': 'markers',
'a': [i for i in map(lambda x: x['journalist'], rawData)],
'b': [i for i in map(lambda x: x['developer'], rawData)],
'c': [i for i in map(lambda x: x['designer'], rawData)],
'text': [i for i in map(lambda x: x['label'], rawData)],
'marker': {
'symbol': 100,
'color': '#DB7365',
'size': 14,
'line': { 'width': 2 }
}
}))
fig.update_layout({
'ternary': {
'sum': 100,
'aaxis': makeAxis('Journalist', 0),
'baxis': makeAxis('<br>Developer', 45),
'caxis': makeAxis('<br>Designer', -45)
},
'annotations': [{
'showarrow': False,
'text': 'Simple Ternary Plot with Markers',
'x': 0.5,
'y': 1.3,
'font': { 'size': 15 }
}]
})
fig.show()
my_ternary_plot = go.Scatterternary({
'mode': 'markers',
'a': [i for i in map(lambda x: x['journalist'], rawData)],
'b': [i for i in map(lambda x: x['developer'], rawData)],
'c': [i for i in map(lambda x: x['designer'], rawData)],
'text': [i for i in map(lambda x: x['label'], rawData)],
'marker': {
'symbol': 100,
'color': '#DB7365',
'size': 14,
'line': { 'width': 2 }
}})
figure = make_subplots(rows=1, cols=2)
figure.add_trace(my_ternary_plot,
row=1, col=1
)
figure.add_trace(
my_ternary_plot,
row=1, col=2
)
figure.update_layout(height=600, width=800, title_text="Side By Side Subplots")
figure.show()
But I get the error
ValueError: Trace type 'scatterternary' is not compatible with subplot type 'xy'
at grid position (1, 1)See the docstring for the specs argument to
plotly.subplots.make_subplots
for more information on subplot types
On top of this, I cannot find references to how to get subplots using plotly express plots, e.g. an object like this
data_rand = pd.DataFrame(data=np.random.uniform(0,1,size=((20,4))), columns = ["a","b", "c", "d"])
data_rand["size"] = 35
import plotly.graph_objects as go
import plotly.express as px
plot_ter = px.scatter_ternary(data_rand, a="a", b = "b", c="c",
color="d", size="size")
fig.show()
I would like to have subplots, not only with plotly.express
plots, also containing other matplotlib
plots, cannot find any hint anywhere. Is there not a simple way to pass i do not know ax objects to matplotlib
figures?
Thank you very much
You need to specify the sublot type(s) when initializing the figure :
By default, the
make_subplots
function assumes that the traces that will be added to all subplots are 2-dimensional cartesian traces [...]. Traces with other subplot types [...] are supported by specifying the type subplot option via thespecs
argument.
figure = make_subplots(rows=1, cols=2,
specs=[[{"type": "ternary"}, {"type": "ternary"}]])
Some plotly.express functions are able to create subplots in one call using the facet_*
arguments (see Facet Plots). However, at the time of writing, px.scatter_ternary
does not provide such arguments.