'How to add secondary x-axes with plotly boxplot?

I have a dataframe with the following columns as shown below. I created a boxplot with plotly.express with the shown code using facets and I have embedded a sample of the plot produced by the code.

df.columns
 
>>> Index(['crops', 'category', 'sand', 'clay', 'soil_text_3', 'org_mat', 'org_mat_characterisations', 'pH', 'pH_characterisation', 'ca', 'ca_characterisation', 'N_ppm', 'N_ppm_characterisation',
       'N_dose', 'residual_coef', 'fev'],
      dtype='object')

import plotly.express as px
import plotly.io as pio
pio.renderers.default = 'browser'

fig = px.box(data_frame = df,
                 x = 'N_ppm', y = 'N_dose',
                 color = 'pH_characterisation',
                 points = False,
                 facet_row = 'soil_text_3',
                 facet_col = 'org_mat_characterisations')

fig.show()

enter image description here

My question is whether it is possible to have a second x-axes below the primary with the 'N_ppm_characterisation', to show at the same time both the numeric values and below them the categorical values.

I also provide a print of information of the dataframe with the current state of types in case it is necessary to perform any changes.

df.info()

>>>Output from spyder call 'get_namespace_view':
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 302016 entries, 0 to 302015
Data columns (total 16 columns):
 #   Column                     Non-Null Count   Dtype  
---  ------                     --------------   -----  
 0   crops                      302016 non-null  object 
 1   category                   302016 non-null  object 
 2   sand                       302016 non-null  int64  
 3   clay                       302016 non-null  int64  
 4   soil_text_3                302016 non-null  object 
 5   org_mat                    302016 non-null  float64
 6   org_mat_characterisations  302016 non-null  object 
 7   pH                         302016 non-null  float64
 8   pH_characterisation        302016 non-null  object 
 9   ca                         302016 non-null  float64
 10  ca_characterisation        302016 non-null  object 
 11  N_ppm                      302016 non-null  int64  
 12  N_ppm_characterisation     302016 non-null  object 
 13  N_dose                     302016 non-null  float64
 14  residual_coef              302016 non-null  float64
 15  fev                        302016 non-null  float64
dtypes: float64(6), int64(3), object(7)
memory usage: 36.9+ MB


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source