Saltar al contenido

Plotly: ¿Cómo ocultar los títulos de los ejes en una figura gráfica con facetas?

No dudes en compartir nuestro espacio y códigos con tus amigos, danos de tu ayuda para aumentar esta comunidad.

Solución:

Esta respuesta tiene cinco partes:

  1. Oculte los títulos de las tramas secundarias (aunque no estoy 100% seguro de querer hacerlo…)
  2. Oculte los valores de marca del eje y usando fig.layout[axis].tickfont = dict(color = 'rgba(0,0,0,0)')
  3. Establezca etiquetas de un solo eje usando go.layout.Annotation(xref="paper", yref="paper")
  4. la figura tramada
  5. Fragmento de código completo al final

Una conclusión muy importante aquí es que puede editar cualquier elemento producido con un px función usando plotly.graph_object referencias, como go.layout.XAxis.


1. Ocultar títulos de subtramas

Si por lo demás está satisfecho con la forma en que configuró su figsolo puedes incluir

for anno in fig['layout']['annotations']:
    anno['text']=''
    
fig.show()

2. Ocultar el texto del eje y

Puede configurar el tickfont del eje y en transparente usando lo siguiente en un bucle

fig.layout[axis].tickfont = dict(color = 'rgba(0,0,0,0)')

Esa línea exacta se incluye en el fragmento a continuación que también elimina el título del eje y para cada subtrama.

3. Etiquetas de un solo eje

La eliminación de las etiquetas de los ejes y la inclusión de una sola etiqueta requiere un poco más de trabajo, pero aquí hay una configuración muy flexible que hace exactamente lo que necesita y más si desea editar sus nuevas etiquetas de alguna manera:

# hide subplot y-axis titles and x-axis titles
for axis in fig.layout:
    if type(fig.layout[axis]) == go.layout.YAxis:
        fig.layout[axis].title.text = ''
    if type(fig.layout[axis]) == go.layout.XAxis:
        fig.layout[axis].title.text = ''
        
# keep all other annotations and add single y-axis and x-axis title:
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=16, color = 'blue'
            ),
            showarrow=False,
            text="single y-axis title",
            textangle=-90,
            xref="paper",
            yref="paper"
        )
    ] +
    [go.layout.Annotation(
            x=0.5,
            y=-0.08,
            font=dict(
                size=16, color = 'blue'
            ),
            showarrow=False,
            text="Dates",
            textangle=-0,
            xref="paper",
            yref="paper"
        )
    ]
)

fig.show()

4. Trama

ingrese la descripción de la imagen aquí

5. Código completo:

import pandas as pd
import numpy as np
import plotly.express as px
import string
import plotly.graph_objects as go

# create a dataframe
cols = list(string.ascii_letters)
cols[0]='zzz'
n = 50

df = pd.DataFrame('Date': pd.date_range('2021-01-01', periods=n))

# create data with vastly different ranges
for col in cols:
    start = np.random.choice([1, 10, 100, 1000, 100000])
    s = np.random.normal(loc=0, scale=0.01*start, size=n)
    df[col] = start + s.cumsum()

# melt data columns from wide to long
dfm = df.melt("Date")

fig = px.line(
    data_frame=dfm,
    x = 'Date',
    y = 'value',
    facet_col = 'variable',
    facet_col_wrap=6,
    #facet_col_spacing=0.05,
    #facet_row_spacing=0.035,
    height = 1000,
    width = 1000,
    title = 'Value vs. Date'
)

fig.update_yaxes(matches=None, showticklabels=True, visible=True)
fig.update_annotations(font=dict(size=16))
fig.for_each_annotation(lambda a: a.update(text=a.text.split("=")[-1]))

# subplot titles
for anno in fig['layout']['annotations']:
    anno['text']=''

# hide subplot y-axis titles and x-axis titles
for axis in fig.layout:
    if type(fig.layout[axis]) == go.layout.YAxis:
        fig.layout[axis].title.text = ''
    if type(fig.layout[axis]) == go.layout.XAxis:
        fig.layout[axis].title.text = ''
        
# keep all other annotations and add single y-axis and x-axis title:
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=16, color = 'blue'
            ),
            showarrow=False,
            text="single y-axis title",
            textangle=-90,
            xref="paper",
            yref="paper"
        )
    ] +
    [go.layout.Annotation(
            x=0.5,
            y=-0.08,
            font=dict(
                size=16, color = 'blue'
            ),
            showarrow=False,
            text="Dates",
            textangle=-0,
            xref="paper",
            yref="paper"
        )
    ]
)


fig.show()

Como nota al margen sobre esto, encontré una forma aún más directa de eliminar las etiquetas de los ejes dentro de la llamada de plotly express usando el argumento de las etiquetas y proporcionándole un dict de etiquetas con valores de ” para las que quería eliminar.

Sin embargo, esto no da como resultado una sola etiqueta en el nivel general de la figura, pero si el título de la figura es lo suficientemente descriptivo de “Y vs. X”, entonces tal vez la falta de etiquetas de eje pueda “excusarse”. (o agregado como lo demostró @vestland)

Tenga en cuenta que puede “casi” eliminar los molestos títulos de facetas repetidos que tienen “=valor” en cada sublote. es decir, si agrega una entrada más al dictado de etiquetas:

‘variable’: ”

luego, en lugar de obtener “variable = nivel de variable”, solo obtiene el nivel de variable de faceta, precedido por “=” como en el gráfico a continuación.

Código completo

import pandas as pd
import numpy as np
import plotly.express as px
import string

# create a dataframe
cols = list(string.ascii_letters)
n = 50

df = pd.DataFrame('Date': pd.date_range('2021-01-01', periods=n))

# create data with vastly different ranges
for col in cols:
    start = np.random.choice([1, 10, 100, 1000, 100000])
    s = np.random.normal(loc=0, scale=0.01*start, size=n)
    df[col] = start + s.cumsum()

# melt data columns from wide to long
dfm = df.melt("Date")

# make the plot
fig = px.line(
    data_frame=dfm,
    x = 'Date',
    y = 'value',
    facet_col = 'variable',
    facet_col_wrap=6,
    facet_col_spacing=0.05,
    facet_row_spacing=0.035,
    height = 1000,
    width = 1000,
    title = 'Value vs. Date',
    labels = 
        'Date': '',
        'value': '',
        'variable': ''
    
)

# ensure that each chart has its own y rage and tick labels
fig.update_yaxes(matches=None, showticklabels=True, visible=True)

fig.show()

ingrese la descripción de la imagen aquí

valoraciones y reseñas

Si te gustó nuestro trabajo, tienes la habilidad dejar un enunciado acerca de qué le añadirías a esta crónica.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *