Customizing Color Gradient for non-sorted Ordinal Variables using plotly.express

31 Views Asked by At

I have a dataset that I would like to visualize using a line plot sorted by date. Each line in the plot represents a distinct variable, and I intend to assign a gradient of colors to these lines.

Below, is a sample code snippet (ref here):

import pandas as pd
import plotly.express as px

data = {'date': ['2024-01-01', '2024-01-01', '2024-01-02', '2024-01-02','2024-01-02', '2024-01-03','2024-01-03'],
        'color': [1, 3, 2, 3, 1, 3, 2],
        'sample': [0.5, 0.2, 0.8, 0.7, 0.4, 0.9, 0.3]}
df1 = pd.DataFrame(data)
myscale = px.colors.sample_colorscale(colorscale=px.colors.sequential.Blues,
                                      samplepoints=len(df1['color'].unique()),
                                      low=0.0, high=1.0, colortype="rgb",
                                      )

px.line(df1, x="date", y="sample", markers=True, color='color', color_discrete_sequence=myscale,).show()

enter image description here

As you can see in the provided visualization, the colors assigned to the lines follow a cyclic pattern. However, since my variables are ordinal, I would like to customize the color gradient such that each line corresponds to a distinct shade of blue, with:

Desired output

the first line being light blue for (color = 1),

the second line slightly darker for (color = 2),

and the third line being the darkest for (color = 3).

Current output

the first line being light blue for (color = 1),

the second line slightly darker for (color = **3**),

and the third line being the darkest for (color = **2**).

1

There are 1 best solutions below

1
DataSciRookie On BEST ANSWER

Are you looking for that ? :

import pandas as pd
import plotly.express as px

data = {
    'date': ['2024-01-01', '2024-01-01', '2024-01-02', '2024-01-02', '2024-01-02', '2024-01-03', '2024-01-03'],
    'color': [1, 3, 2, 3, 1, 3, 2],
    'sample': [0.5, 0.2, 0.8, 0.7, 0.4, 0.9, 0.3]
}
df1 = pd.DataFrame(data)

# Defining a custom color scale
color_scale = {
    1: 'lightblue',  # Light blue for color = 1
    2: 'deepskyblue',  # Slightly darker for color = 2
    3: 'royalblue'  # Darkest for color = 3
}

fig = px.line(df1, x="date", y="sample", markers=True,
              color='color',
              color_discrete_map=color_scale  # Using the custom color scale
             )
fig.show()