Search code examples
pythonseabornhistogram

Choosing hue based on column


Having a DF of predicted (column) an actual (column) values. I would like to plot an overlaid histogram that have the same look as when using the hue property. I couldn't find a way of doing so without reconstructing my original data.

Here is an example of what I'm trying to do:

df = pd.DataFrame({'A':np.random.uniform(low=0.0, high=9.0, size=(150,)),'P':np.random.uniform(low=0.0, high=9.0, size=(150,))})
actual = df.A.to_frame()
predicted = df.P.to_frame()

print(df.head())

actual.columns = ['value']
actual['t'] = 'A'

predicted.columns = ['value']
predicted['t'] = 'P'
tmp = pd.concat([actual,predicted])

print(tmp.head())

sns.histplot(data=tmp,x='value' ,hue="t")

Output:
Original DF
          A         P
0  2.546046  2.503833
1  4.797077  2.306720
2  1.358222  4.839675
3  7.063206  8.828486
4  3.010978  7.406337

Manipulated DF
      value  t
0  2.546046  A
1  4.797077  A
2  1.358222  A
3  7.063206  A
4  3.010978  A
<matplotlib.axes._subplots.AxesSubplot at 0x7fd657112fd0>

enter image description here

Q: How can I get similar results without manipulating my original DF?


Solution

  • Unless I am misunderstanding what you're asking.

    From the docs:

    If neither x nor y is assigned, the dataset is treated as wide-form, and a histogram is drawn for each numeric column

    df = pd.DataFrame(
        {
            "A": np.random.uniform(low=0.0, high=9.0, size=(150,)),
            "P": np.random.uniform(low=0.0, high=9.0, size=(150,)),
        }
    )
    ax = sns.histplot(df)
    

    enter image description here