How to plot pie charts as subplots with custom size with Plotly in Python
<p>I've been trying to make a grid of subplots with custom size with Plotly(version 1.12.9) in Jupyter notebook(offline). There is nice examples in the Plotly website but all of them are with scattered plots. I modified one of them to make it look like the one I want to and it works with scatter plots:</p>

<pre><code>import plotly
import plotly.offline as py
import plotly.graph_objs as go
py.init_notebook_mode(connected=True)

labels = ['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen']
values = [4500,2500,1053,500]

trace0 = go.Scatter(x=[1, 2], y=[1, 2])
trace1 = go.Scatter(x=[1, 2], y=[1, 2])
trace2 = go.Scatter(x=[1, 2], y=[1, 2])
trace3 = go.Scatter(x=[1, 2], y=[1, 2])
trace4 = go.Scatter(x=[1, 2], y=[1, 2])
trace5 = go.Scatter(x=[1, 2], y=[1, 2])


fig = plotly.tools.make_subplots(
    rows=3,
    cols=3,
    specs=[[{}, {}, {}], [{}, {'colspan': 2, 'rowspan': 2}, None], [{} , None, None]],
    subplot_titles=('First Subplot','Second Subplot', 'Third Subplot')
)

fig.append_trace(trace0, 3, 1)
fig.append_trace(trace1, 2, 1)
fig.append_trace(trace2, 1, 1)
fig.append_trace(trace3, 1, 2)
fig.append_trace(trace4, 1, 3)
fig.append_trace(trace5, 2, 2)

py.iplot(fig)
</code></pre>

<p>And works as expected:
<a href="http://i.stack.imgur.com/BNiEh.png" rel="nofollow"><img src="http://i.stack.imgur.com/BNiEh.png" alt="Custom size scattered subplots"></a></p>

<p>But changing the traces for pie charts like this:</p>

<pre><code>labels = ['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen']
values = [4500,2500,1053,500]
trace0 = go.Pie(labels=labels,values=values)
trace1 = go.Pie(labels=labels,values=values)
trace2 = go.Pie(labels=labels,values=values)
trace3 = go.Pie(labels=labels,values=values)
trace4 = go.Pie(labels=labels,values=values)
trace5 = go.Pie(labels=labels,values=values)
</code></pre>

<p>Just throws this error:</p>

<pre><code>PlotlyDictKeyError: 'xaxis' is not allowed in 'pie'

Path To Error: ['xaxis']

Valid attributes for 'pie' at path [] under parents []:

    ['pullsrc', 'textfont', 'hoverinfo', 'domain', 'label0', 'legendgroup',
    'showlegend', 'scalegroup', 'textpositionsrc', 'pull', 'visible',
    'sort', 'name', 'outsidetextfont', 'dlabel', 'stream', 'hole',
    'textinfo', 'marker', 'labels', 'labelssrc', 'rotation', 'opacity',
    'values', 'insidetextfont', 'direction', 'textsrc', 'textposition',
    'type', 'valuessrc', 'text', 'uid']

Run `&lt;pie-object&gt;.help('attribute')` on any of the above.
'&lt;pie-object&gt;' is the object at []
</code></pre>

<p>Is only possible to do this with scattered plots? I didn't find anything in the plotly documentation.</p>

<p>I recently struggled with the same problem, and found nothing about whether we can use <code>plotly.tools.make_subplots</code> with <code>plotly.graph_objs.Pie</code>. As I understand this is not possible because these plots have no x and y axes. In the <a href="https://plot.ly/python/pie-charts/" rel="nofollow">original tutorial</a> for <code>Pie</code>, they do subplots with providing a <code>domain</code> dict, e.g. <code>{'x': [0.0, 0.5], 'y': [0.0, 0.5]}</code> defines an area in the bottom left quadrant of the total plotting space. Btw, this tutorial witholds the solution for annotation positioning at donut charts, what can be done with providing <code>xanchor = 'center'</code> and <code>yanchor = 'middle'</code> parameters. I found <a href="http://pycopy.com/plotly-a-pack-of-donuts/" rel="nofollow">one other tutorial</a> which gives a very nice example. Here I show it with your example:</p>

<pre><code>import plotly
import plotly.offline as py
import plotly.graph_objs as go
py.init_notebook_mode(connected=True)

labels = ['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen']
values = [4500,2500,1053,500]
domains = [
    {'x': [0.0, 0.33], 'y': [0.0, 0.33]},
    {'x': [0.0, 0.33], 'y': [0.33, 0.66]},
    {'x': [0.0, 0.33], 'y': [0.66, 1.0]},
    {'x': [0.33, 0.66], 'y': [0.0, 0.33]},
    {'x': [0.66, 1.0], 'y': [0.0, 0.33]},
    {'x': [0.33, 1.0], 'y': [0.33, 1.0]}
]
traces = []

for domain in domains:
    trace = go.Pie(labels = labels,
                   values = values,
                   domain = domain,
                   hoverinfo = 'label+percent+name')
    traces.append(trace)

layout = go.Layout(height = 600,
                   width = 600,
                   autosize = False,
                   title = 'Main title')
fig = go.Figure(data = traces, layout = layout)
py.iplot(fig, show_link = False)
</code></pre>

<p><a href="https://i.stack.imgur.com/IFUpB.jpg" rel="nofollow"><img src="https://i.stack.imgur.com/IFUpB.jpg" alt="Plotly pie charts subplots example"></a></p>

<p>p.s. Sorry, I realized afterwards that y coordinates start from the bottom, so I mirrored your layout vertically. Also you may want to add space between adjacent subplots (just give slightly smaller/greater numbers in layout, e.g. 0.31 instead 0.33 at right, and 0.35 instead of 0.33 at left corners).</p>

<p>And finally, before using pie charts for any purpose, please think about if they are really the best option, and consider critics like <a href="http://www.businessinsider.com/pie-charts-are-the-worst-2013-6?IR=T" rel="nofollow">this</a> and <a href="https://www.r-bloggers.com/how-to-replace-a-pie-chart/" rel="nofollow">this</a>.</p>

python jupyter-notebook plotly