4

I just learn Plotly and I am trying to make my python code better. This is my dataframe: enter image description here

To visualize, this is my code but I think it could be done with For loop:

fig = go.Figure()

fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,0], mode ='lines', name = 'Australian Capital Territory'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,1], mode ='lines', name = 'New South Wales'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,2], mode ='lines', name = 'Northern Territory'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,3], mode ='lines', name = 'Queensland'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,4], mode ='lines', name = 'South Australia'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,5], mode ='lines', name = 'Tasmania'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,6], mode ='lines', name = 'Victoria'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,7], mode ='lines', name = 'Western Australia'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,8], mode ='lines', name = 'New Zealand'))

annotations = []

annotations.append(dict(xref='paper', yref='paper', x=0.0, y=1.05,
                              xanchor='left', yanchor='bottom',
                              text="Covid 19 Death Cases between Australian' states vs New Zealand",
                              font=dict(family='Arial',
                                        size=18,
                                        color='rgb(37,37,37)'),
                              showarrow=False))

fig.update_layout(legend=dict(y=0.5, traceorder='reversed', font_size=16), 
                  plot_bgcolor='white',
                  annotations=annotations,
                  xaxis_title="Date",
                  yaxis_title="Number of Death"
                 )

fig.show()

I am trying to use For loop for this part:

fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,0], mode ='lines', name = 'Australian Capital Territory'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,1], mode ='lines', name = 'New South Wales'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,2], mode ='lines', name = 'Northern Territory'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,3], mode ='lines', name = 'Queensland'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,4], mode ='lines', name = 'South Australia'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,5], mode ='lines', name = 'Tasmania'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,6], mode ='lines', name = 'Victoria'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,7], mode ='lines', name = 'Western Australia'))
fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,8], mode ='lines', name = 'New Zealand'))

Any thought on how to use For loop for this, will be much appreciated. This is an example from Plotly:

import plotly.graph_objects as go
import numpy as np

title = 'Main Source for News'
labels = ['Television', 'Newspaper', 'Internet', 'Radio']
colors = ['rgb(67,67,67)', 'rgb(115,115,115)', 'rgb(49,130,189)', 'rgb(189,189,189)']

mode_size = [8, 8, 12, 8]
line_size = [2, 2, 4, 2]

x_data = np.vstack((np.arange(2001, 2014),)*4)

y_data = np.array([
    [74, 82, 80, 74, 73, 72, 74, 70, 70, 66, 66, 69],
    [45, 42, 50, 46, 36, 36, 34, 35, 32, 31, 31, 28],
    [13, 14, 20, 24, 20, 24, 24, 40, 35, 41, 43, 50],
    [18, 21, 18, 21, 16, 14, 13, 18, 17, 16, 19, 23],
])

fig = go.Figure()

for i in range(0, 4):
    fig.add_trace(go.Scatter(x=x_data[i], y=y_data[i], mode='lines',
        name=labels[i],
        line=dict(color=colors[i], width=line_size[i]),
        connectgaps=True,
    ))

    # endpoints
    fig.add_trace(go.Scatter(
        x=[x_data[i][0], x_data[i][-1]],
        y=[y_data[i][0], y_data[i][-1]],
        mode='markers',
        marker=dict(color=colors[i], size=mode_size[i])
    ))

fig.update_layout(
    xaxis=dict(
        showline=True,
        showgrid=False,
        showticklabels=True,
        linecolor='rgb(204, 204, 204)',
        linewidth=2,
        ticks='outside',
        tickfont=dict(
            family='Arial',
            size=12,
            color='rgb(82, 82, 82)',
        ),
    ),
    yaxis=dict(
        showgrid=False,
        zeroline=False,
        showline=False,
        showticklabels=False,
    ),
    autosize=False,
    margin=dict(
        autoexpand=False,
        l=100,
        r=20,
        t=110,
    ),
    showlegend=False,
    plot_bgcolor='white'
)

annotations = []

# Adding labels
for y_trace, label, color in zip(y_data, labels, colors):
    # labeling the left_side of the plot
    annotations.append(dict(xref='paper', x=0.05, y=y_trace[0],
                                  xanchor='right', yanchor='middle',
                                  text=label + ' {}%'.format(y_trace[0]),
                                  font=dict(family='Arial',
                                            size=16),
                                  showarrow=False))
    # labeling the right_side of the plot
    annotations.append(dict(xref='paper', x=0.95, y=y_trace[11],
                                  xanchor='left', yanchor='middle',
                                  text='{}%'.format(y_trace[11]),
                                  font=dict(family='Arial',
                                            size=16),
                                  showarrow=False))
# Title
annotations.append(dict(xref='paper', yref='paper', x=0.0, y=1.05,
                              xanchor='left', yanchor='bottom',
                              text='Main Source for News',
                              font=dict(family='Arial',
                                        size=30,
                                        color='rgb(37,37,37)'),
                              showarrow=False))
# Source
annotations.append(dict(xref='paper', yref='paper', x=0.5, y=-0.1,
                              xanchor='center', yanchor='top',
                              text='Source: PewResearch Center & ' +
                                   'Storytelling with data',
                              font=dict(family='Arial',
                                        size=12,
                                        color='rgb(150,150,150)'),
                              showarrow=False))

fig.update_layout(annotations=annotations)

fig.show()
4
  • Hi S3DEV, thanks for your help but I still have issue as shown below. Did I miss something? as I am still learning. Thanks heap. Commented Mar 30, 2020 at 10:08
  • I got it and it's working now. Thanks @S3DEV. Commented Mar 30, 2020 at 11:17
  • Excellent, glad to help! Commented Mar 30, 2020 at 11:21
  • Does this answer your question? How to make a multiple trace plot as a reusable code? Commented Mar 30, 2020 at 12:36

1 Answer 1

4

Here is the line you're after to create all traces in a for loop:

for idx, col in enumerate(anz_d_df.columns, 0):
    fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,idx], mode ='lines', name = col))

Explanation:

This loop uses the enumerate function which takes an iterable (in this case, list of column names) and returns a tuple of (index, string). For example:

(0, 'Australian Capital Territory')
(1, 'New South Wales')
...
(8, 'New Zealand')

Then, these values are passed into each add_trace() call.

Context Code:

Below is the code used to create a dataset to replicate yours (albeit, a zero DataFrame), as well as the loop to create the traces.

# Build dataset
cols = ['Australian Capital Territory',
        'New South Wales',
        'Northern Territory',
        'Queensland',
        'South Australia',
        'Tasmania',
        'Victoria',
        'Western Australia',
        'New Zealand']
index = pd.date_range(start='2020-01-22', periods=10)

# Create working DataFrame.
anz_d_df = pd.DataFrame(0,columns=cols, index=index)

# Add all traces.
for idx, col in enumerate(anz_d_df.columns, 0):
    fig.add_trace(go.Scatter(x = anz_d_df.index , y = anz_d_df.iloc[:,idx], mode ='lines', name = col))

Hope this helps!

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.