Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

plotly: descending order in grouped bar chart

I'm trying to

  1. create a nice plot which is sorted by LABEL and then by Value inside each LABEL.
  2. If possible remove labels on the bottom of the chart because I have explanation in legend.

libraries:

from plotly import graph_objs as go
import plotly.express as px
import pandas as pd

My data looks like this:

df = pd.DataFrame({'LABEL': ['1', '1', '2', '2', '3', '3', '3', '3'],
                 'Cat2': ['a',  'b',  'a', 'b', 'c', 'a', 'e', 'f'],
                 'Value': [3, 2, 1, 4, 1, 3, 4, 1]})
df.sort_values(by=['LABEL', 'Value'], ascending=[True, False],inplace=True)

enter image description here

Here is my try:

COLOR_MAP = {str(i): c for i, c in enumerate(px.colors.qualitative.Light24)}

fig = go.Figure()

for i in df['LABEL'].unique():
    df_ = df[df['LABEL'] == i]
    fig.add_trace(go.Bar(
        x=[df_['LABEL'], df_['Cat2']],
        y=df_['Value'],
        marker=dict(color=COLOR_MAP[i]),
        name=f'{i}'))

fig.update_layout(legend_title='Cat1')

fig.update_layout(
    xaxis=dict(tickangle=45))

fig.update_layout(xaxis={'categoryorder': 'trace'}) # I tried: 'total descending', 'category descending', 'array'

Result: enter image description here

My expectation: enter image description here

Thanks in advance!!

like image 614
Mateusz Konopelski Avatar asked Oct 29 '25 00:10

Mateusz Konopelski


1 Answers

  • it's much simpler in plotly express
  • define a new column in dataframe that defines x
from plotly import graph_objs as go
import plotly.express as px
import pandas as pd

df = pd.DataFrame(
    {
        "LABEL": ["1", "1", "2", "2", "3", "3", "3", "3"],
        "Cat2": ["a", "b", "a", "b", "c", "a", "e", "f"],
        "Value": [3, 2, 1, 4, 1, 3, 4, 1],
    }
)
df.sort_values(by=["LABEL", "Value"], ascending=[True, False], inplace=True)

# define a concatenated column for x
df = df.assign(labx=df["LABEL"] + df["Cat2"])
px.bar(
    df,
    x="labx",
    y="Value",
    hover_data=["Cat2"],
    color="LABEL",
    color_discrete_sequence=px.colors.qualitative.Light24,
).update_layout(
    xaxis={"tickmode": "array", "tickvals": df["labx"], "ticktext": df["Cat2"]}
)

enter image description here

without plotly express

import plotly.graph_objects as go

fig = go.Figure()

fig.add_trace(
    go.Bar(
        x=df["labx"],
        y=df["Value"],
        marker_color=df["LABEL"]
        .map(
            {v: c for v, c in zip(df["LABEL"].unique(), px.colors.qualitative.Light24)}
        )
        .values,
    )
).update_layout(
    xaxis={"tickmode": "array", "tickvals": df["labx"], "ticktext": df["Cat2"]}
)

like image 144
Rob Raymond Avatar answered Oct 30 '25 22:10

Rob Raymond



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!