Заголовок одной оси в графически выраженном фасетном графике - PullRequest
2 голосов
/ 30 сентября 2019

Я учусь использовать pyplot.express и борюсь со следующей проблемой проектирования: На граненых графиках заголовок оси повторяется для каждого подзадача (в примере «ширина лепестка (см)»). Есть ли способ получить одноосную метку для всех дочерних участков на граненых участках, используя pyplot.express?

спасибо, Майкл

Минимальный пример:

from sklearn.datasets import load_iris
import plotly.express as px
import pandas as pd
import numpy as np

# import iris-data
iris = load_iris()
df= pd.DataFrame(data= np.c_[iris['data'], iris['target']], columns= iris['feature_names'] + ['target'])
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)

# plot using pyplot.express
fig = px.bar(df, x="sepal length (cm)", y="petal width (cm)", color = 'petal length (cm)', facet_row="species")
fig.show()

Iris facet plot

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Спасибо @vestland, которая очень помогла!

Я нашел способ более гибкого дизайна (несколько facet_rows), основываясь на вашем ответе:

Сначала мне нужно было удалить все оси подзаговоров:

for axis in fig.layout:
    if type(fig.layout[axis]) == go.layout.YAxis:
        fig.layout[axis].title.text = ''

Следующим шагом было добавление аннотации вместо оси, так как атрибут yaxis в макете всегда изменяет масштабирование одной из осей и портит график. В поисках аннотаций я нашел ссылку , как добавить собственную ось. xref = 'paper' и yref = 'paper' необходимы для размещения этикетки независимо от вспомогательных участков.

fig.update_layout(
    # keep the original annotations and add a list of new annotations:
    annotations = list(fig.layout.annotations) + 
    [go.layout.Annotation(
            x=-0.07,
            y=0.5,
            font=dict(
                size=14
            ),
            showarrow=False,
            text="Custom y-axis title",
            textangle=-90,
            xref="paper",
            yref="paper"
        )
    ]
)

pyplot

2 голосов
/ 01 октября 2019

Для этого конкретного случая, после вашего примера фрагмента, просто запустите

fig['layout']['yaxis']['title']['text']=''
fig['layout']['yaxis3']['title']['text']=''
fig.show()

Сюжет:

enter image description here

...