Search code examples
scatter-plotplotly-python

Scatterplot with x axis only


I have a dataframe 'Spreads' where one of the columns is 'HY_OAS'. My goal is to draw a horizontal line (basically representing a range of values for 'HY_OAS') and plot the column mean on that line. In addition, I wanted the x axis min/max to be the min/max for that column and I'd like to include text boxes annotating the min/max. The problem is I'm not sure how to proceed because all I have is the below. Thanks for any and all help. The goal is the second image and the current code is the first image.

fig8 = px.scatter(x=[Spreads['HY_OAS'].mean()], y=[0])
fig8.update_xaxes(visible=True,showticklabels=False,range=[Spreads['HY_OAS'].min(),Spreads['HY_OAS'].max()])
fig8.update_yaxes(visible=True,showticklabels=False, range=[0,0])

Current

Goal


Solution

  • Following what you describe and what you have coded

    • generate some sample data in a dataframe
    • scatter values along x-axis and use constant for y-axis
    • add mean marker
    • format figure
    • add required annotations
    import numpy as np
    import plotly.express as px
    import pandas as pd
    
    # simulate some data
    Spreads = pd.DataFrame({"HY_OAS": np.sin(np.random.uniform(0, np.pi * 2, 50))})
    # scatter values along x-axis and and larger point for mean
    fig = px.scatter(Spreads, x="HY_OAS", y=np.full(len(Spreads), 0)).add_traces(
        px.scatter(x=[Spreads.mean()], y=[0])
        .update_traces(marker={"color": "red", "size": 20})
        .data
    )
    
    # fix up figure config
    fig.update_layout(
        xaxis_visible=False,
        yaxis_visible=False,
        showlegend=False,
        paper_bgcolor="rgba(0,0,0,0)",
        plot_bgcolor="rgba(0,0,0,0)",
    )
    
    # finally required annootations
    fig.add_annotation(x=Spreads["HY_OAS"].mean(), y=0, text=Spreads["HY_OAS"].mean().round(4))
    fig.add_annotation(x=Spreads["HY_OAS"].min(), y=0, text=Spreads["HY_OAS"].min().round(2), showarrow=False, xshift=-20)
    fig.add_annotation(x=Spreads["HY_OAS"].max(), y=0, text=Spreads["HY_OAS"].max().round(2), showarrow=False, xshift=20)
    

    enter image description here

    straight line

    • build base figure as follows
    • then same code to add annotations and configure layout
    fig = px.line(x=[Spreads["HY_OAS"].min(), Spreads["HY_OAS"].max()], y=[0,0]).add_traces(
        px.scatter(x=[Spreads.mean()], y=[0])
        .update_traces(marker={"color": "red", "size": 20})
        .data
    )
    

    enter image description here