Как сделать так, чтобы у граненых графиков в Plotly были свои собственные галочки YAxes? - PullRequest
0 голосов
/ 02 апреля 2020

Когда я использую Plotly express для построения различных параметров с разными диапазонами - в приведенном ниже примере, BloodPressureHigh, Рост (см), Вес (кг) и BloodPressureLow - с использованием аргумента facet_col, я не могу получить результирующий график для отображения уникальных YTicks для каждого из граненых графиков. Есть ли простой способ для объекта fig, чтобы показать каждый набор YTicks на результирующем граненом графике? В противном случае, как вы можете видеть на полученном изображении, неясно, что каждый прямоугольник имеет свой уникальный YAxis.

import plotly.express as px
import pandas as pd

temp = [
    {"Clinic": "A", "Subject": "Bill", "Height(cm)": 182, "Weight(kg)": 101, "BloodPressureHigh": 128, "BloodPressureLow": 90},
    {"Clinic": "A", "Subject": "Susie", "Height(cm)": 142, "Weight(kg)": 67, "BloodPressureHigh": 120, "BloodPressureLow": 70},
    {"Clinic": "B", "Subject": "John", "Height(cm)": 202, "Weight(kg)": 89, "BloodPressureHigh": 118, "BloodPressureLow": 85},
    {"Clinic": "B", "Subject": "Stacy", "Height(cm)": 156, "Weight(kg)": 78, "BloodPressureHigh": 114, "BloodPressureLow": 76},
    {"Clinic": "B", "Subject": "Lisa", "Height(cm)": 164, "Weight(kg)": 59, "BloodPressureHigh": 112, "BloodPressureLow": 74} 
]
df = pd.DataFrame(temp)

# Melt the dataframe so I can use plotly express to plot distributions of all variables
df_melted = df.melt(id_vars=["Clinic", "Subject"])
# Plot distributions, with different parameters in different columns
fig = px.box(df_melted, x="Clinic", y="value", 
       facet_col="variable", boxmode="overlay"
)
# Update the YAxes so that the faceted column plots no longer share common YLimits
fig.update_yaxes(matches=None)
# Last step needed: Add tick labels to each yaxis so that the difference in YLimits is clear?

enter image description here

1 Ответ

1 голос
/ 17 апреля 2020

Вам это помогает?

fig = px.box(df_melted, x="Clinic", y="value", 
             facet_col="variable", boxmode="overlay")

fig.update_yaxes(matches=None)
for i in range(len(fig["data"])):
    yaxis_name = 'yaxis' if i == 0 else f'yaxis{i + 1}'
    fig.layout[yaxis_name].showticklabels = True

fig.show()

enter image description here

...