Как установить разные оси x и y для каждого подзаголовка?

#python #plotly #plotly-python

Вопрос:

У меня есть таблица с товарами и категориями. Я хочу создать подзаголовки для каждой категории.

 import plotly.express as px
import pandas as pd

data = {'Category':["Toys","Toys","Toys","Toys","Food","Food","Food","Food","Food","Food","Food","Food","Furniture","Furniture","Furniture"], 
        'Product':["AA","BB","CC","DD","SSS","DDD","FFF","RRR","EEE","WWW","LLLLL","PPPPPP","LPO","NHY","MKO"],
       'QTY':[100,200,300,50,20,800,300,450,150,320,400,1000,150,900,1150]}
df = pd.DataFrame(data)
fig = px.bar(df, x="Product", y="QTY", barmode="group",facet_col="Category")
fig.show()
 

введите описание изображения здесь

Но на диаграммах я получаю одни и те же оси x и y. Как я могу задать для каждого графика координатную ось для его данных?
То есть на оси x будут отображаться только продукты, относящиеся к одной и той же категории. Максимальное значение по оси y будет равно максимальному количеству в каждой категории..

Комментарии:

1. Я думаю, было бы лучше сделать три штриховых графика, а затем скорректировать их в подзаголовке. Здесь вы можете увидеть, как работают подзаголовки.

2. Привет, mosc9575. Эти данные являются лишь примером, реальные данные включают около 100 категорий. Так что не лучший способ сделать отдельно каждый столбик графика.

Ответ №1:

Используйте следующее, чтобы все оси для каждого подзаголовка соответствовали соответствующим значениям и диапазонам x и y:

 fig.for_each_xaxis(lambda t: t.update(fixedrange=True))
fig.for_each_yaxis(lambda t: t.update(fixedrange=True))
 

Участок 1

введите описание изображения здесь

Но, как вы можете видеть, yaxis2 и yaxis3 у вас не будет ярлыков на месте из коробки. Поэтому я бы включил facet_col_spacing = 0.075 в px.bar() и showticklabels=True) в fig.for_each_yaxis() .

Участок 2

введите описание изображения здесь

Полный код:

 import plotly.express as px
import pandas as pd

data = {'Category':["Toys","Toys","Toys","Toys","Food","Food","Food","Food","Food","Food","Food","Food","Furniture","Furniture","Furniture"], 
        'Product':["AA","BB","CC","DD","SSS","DDD","FFF","RRR","EEE","WWW","LLLLL","PPPPPP","LPO","NHY","MKO"],
       'QTY':[100,200,300,50,20,800,300,450,150,320,400,1000,150,900,1150]}
df = pd.DataFrame(data)
fig = px.bar(df, x="Product", y="QTY", barmode="group",facet_col="Category",
             facet_col_spacing = 0.075)

fig.for_each_xaxis(lambda x: x.update(fixedrange=True))
fig.for_each_yaxis(lambda y: y.update(fixedrange=True, showticklabels=True))
fig.show()
 

Комментарии:

1. Привет, @vestland. Я думаю, что вы ошибаетесь в коде, потому что он возвращает мне те же сюжеты, что и в начале. (с одинаковой осью x для всех графиков)

2. @Galat я только что перепроверил. Приведенный выше фрагмент кода возвращает предоставленный снимок экрана. Какова ваша сюжетная версия?

3. 5.3.1 в записной книжке Jupyter

4. @Галат Странно. Не могли бы вы просто убедиться, что код точно такой же, как у меня, и запустить его после перезапуска ядра?

5. смотрите здесь @vestland drive.google.com/file/d/1SWTgYVsGGQiuinABMJGGH0a85vs7_S2O/… все после перезапуска