How to make Plotly Pie charts the same size always

Question:

I’m generating different Pie charts that have legends of different lengths. The problem is that when the legend is long, the Pie chart is smaller, I’d like to make the Pie chart always the same size.

This is my code:

pie_chart = go.Pie(labels=labels, values=y)
fig = go.Figure(data=[pie_chart])
fig.update_layout(legend={'font': {'size': 17}})
io_bytes = fig.to_image(format="png", scale=2.5, width=900, height=500)

These are the results:

Big pie chart, short legend:

Big Pie chart

Small pie chart, long legend:

enter image description here

Asked By: Genarito

||

Answers:

Given that you’ve forced your image to a particular size, a long label is going to force the graph to get smaller and smaller. You might be expecting the labels to word-wrap, but they don’t. You could attempt to implement some sort of word-wrapping capability to your labels, which might suit your needs.

import plotly.graph_objects as go

labels = ['This is a super long label name that would shrink your chart because there is not enough room','Hydrogen','Carbon_Dioxide','Nitrogen']
values = [4500, 2500, 1053, 500]


fig = go.Figure(data=[go.Pie(labels=labels, values=values)])
fig.update_layout(legend={'font': {'size': 17}, })
fig.update_layout(
    width=900,
    height=500
)
fig.show()

enter image description here

Adding the html break tag every n words to turn label into a multi-line label.

import numpy as np

new_labels = []
max_label_length = 6

for label in labels:
    l = label.split()
    if len(l)>5:
        l = np.array_split(l, int(len(l)/max_label_length))
        l = ['<br>'.join(' '.join(x for x in w) for w in l)]
    new_labels.append(l)


fig = go.Figure(data=[go.Pie(labels=new_labels, values=values)])
fig.update_layout(legend={'font': {'size': 17}, })
fig.update_layout(
    width=900,
    height=500
)
fig.show()

enter image description here

Answered By: Chris

As per the documentation, the plot will normally resize to accommodate the legend. But you can use specific anchor points to help adjust where the legend sits. And thus restrict how it impacts the chart.

Example code:

import plotly.graph_objects as go
from IPython.display import Image

labels = ['This is a very very very long label to illustrate the point, that you can have very long labels','This is just another label']
y = [62, 38]

pie_chart = go.Pie(labels=labels, values=y)
fig = go.Figure(data=[pie_chart])

fig.update_layout(legend=dict(
    font = dict(size=17),
    orientation="v",
    yanchor="bottom",
    y=1.1,
    xanchor="right",
    x=1
))

io_bytes = fig.to_image(format="png", scale=2.5, width=900, height=500)
Image(io_bytes)

Output:

Long labels

And one with short labels:

Short labels

Answered By: ScottC