Search code examples
pythonpandasplotly

Plotly : Use px.strip in go.figure()


Question : Is it possible to do the strip with go.scatter ? If not, can you help me in transforming my code with px.strip function ?

Data generation :

import pandas as pd
import random

rows = []
for i in range(0, 130, 1):
     rows.append([i+57, i+39585, [random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100)]])
df_test = pd.DataFrame(rows, columns=['Measure Number', 'Timer', 'Values'])
display(df_test)

rows2 = []
for i in range(70, 200, 1):
     rows2.append([i+57, i+39585, [random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100)]])
df_test2 = pd.DataFrame(rows2, columns=['Measure Number', 'Timer', 'Values'])
display(df_test2)

rows3 = []
for i in range(170, 300, 1):
    rows3.append([i+57, i+39585, [random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100), random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100),random.randint(1,100)]])
df_test3 = pd.DataFrame(rows3, columns=['Measure Number', 'Timer', 'Values'])
display(df_test3)

Plotly plots :

from plotly.offline import init_notebook_mode, iplot
from plotly.graph_objs import *
import plotly.graph_objects as go
import plotly.express as px


init_notebook_mode(connected=True)         # initiate notebook for offline plot

fig = go.Figure()


for i in range(0, 130, 1):
    # Add traces
    fig.add_trace(
        go.Scatter(
            x=[j for j in range(15)],
            y=df_test['Values'][i],
            mode="markers",
            marker=dict(color="DarkOrange")
        )
    )
    
    fig.add_trace(
        go.Scatter(
            x=[j for j in range(15)],
            y=df_test2['Values'][i],
            mode="markers",
            marker=dict(color="Crimson")
        )
    )

    fig.add_trace(
        go.Scatter(
            x=[j for j in range(15)],
            y=df_test3['Values'][i],
            mode="markers",
            marker=dict(color="RebeccaPurple")
        )
    )


fig.show()

Plot output : (https://i.sstatic.net/65Mvr.png)

Image example to explain what I want : [From]2 [To]3

Source of the example : https://community.plotly.com/t/how-to-show-overlap-points-in-scatter-plot/24148/7


Solution

  • My approach was to check the structure of the example graphs in the reference, which can be found in fig.data. Next, I will add the px.strip configuration items from the boxplot example in the graph object. Simply put, we are just making the box color transparent on a boxplot with strip. I am creating the code with simplified data as your sample data was large and complex. To group them, see references.

    import pandas as pd
    import random
    
    rows = []
    for i in range(0, 20, 1):
         rows.append([i+57, i+39585,
                      random.randint(1,100),
                      random.randint(1,100),
                      random.randint(1,100),
                      random.randint(1,100),
                      random.randint(1,100)])
    
    cols = ['Col{}'.format(x) for x in range(5)]
    df_test = pd.DataFrame(rows, columns=['Measure Number', 'Timer']+cols)
    
    df_test.head()
    
        Measure Number  Timer   Col0    Col1    Col2    Col3    Col4
    0   57  39585   47  8   49  80  30
    1   58  39586   64  74  12  73  46
    2   59  39587   21  95  38  35  85
    3   60  39588   50  7   100     30  82
    4   61  39589   3   84  93  86  9
    
    import plotly.graph_objects as go
    import numpy as np
    
    fig = go.Figure()
    
    for i in df_test.columns[2:]:
        fig.add_trace(go.Box(
            y=df_test[i],
            boxpoints='all',
            hovertemplate='x=%{x}<br>y=%{y}<extra></extra>',
            hoveron='points',
            jitter=0.2,
            pointpos=0,
            fillcolor='rgba(255,255,255,0)',
            line=dict(color='rgba(255,255,255,0)'),
            marker=dict(color='#636efa'),
            alignmentgroup=True,
            showlegend=False)
                     )
    fig.update_xaxes(tickvals=np.arange(0,5,1), ticktext=[str(x) for x in np.arange(0,5,1)])
    fig.update_layout(height=500)
    fig.show()
    

    enter image description here