Rotar el texto de la etiqueta en el diagrama de factor marino

152

Tengo un diagrama de factor simple

import seaborn as sns
g = sns.factorplot("name", "miss_ratio", "policy", dodge=.2, 
    linestyles=["none", "none", "none", "none"], data=df[df["level"] == 2])

ingrese la descripción de la imagen aquí

El problema es que todas las etiquetas x se unen, lo que las hace ilegibles. ¿Cómo gira el texto para que las etiquetas sean legibles?

dan
fuente
29
import matplotlib.pylab as plt. plt.xticks(rotation=‌​45)
rafaelvalle
La biblioteca Dexplot tiene la capacidad de envolver etiquetas, establecer el tamaño de la figura, ppp todo sin usar matplotlib.
Ted Petrou

Respuestas:

137

Aman tiene razón en que puede usar los comandos normales de matplotlib, pero esto también está integrado en FacetGrid:

import seaborn as sns
planets = sns.load_dataset("planets")
g = sns.factorplot("year", data=planets, aspect=1.5, kind="count", color="b")
g.set_xticklabels(rotation=30)

ingrese la descripción de la imagen aquí

Hay algunos comentarios y otra respuesta afirmando que "no funciona", sin embargo, cualquiera puede ejecutar el código como está escrito aquí y ver que funciona. La otra respuesta no proporciona un ejemplo reproducible de lo que no está funcionando, lo que hace que sea muy difícil abordarlo, pero supongo que las personas están tratando de aplicar esta solución a la salida de funciones que devuelven un Axesobjeto en lugar de a Facet Grid. Estas son cosas diferentes, y el Axes.set_xticklabels()método requiere una lista de etiquetas y no puede simplemente cambiar las propiedades de las etiquetas existentes en el Axes. La lección es que es importante prestar atención a qué tipo de objetos está trabajando.

mwaskom
fuente
Me sale un error: IndexError: demasiados índices. ¡Mi código! g = sns.factorplot ("month_date", "num_proposals", "account", sorted_data, col = "account", col_wrap = 3, sharex = False); g.set_xticklabels (rotación = 30)
yoshiserry
10
@soupault: esto funcionó para mí, similar a lo que se le ocurrió, pero quizás un poco más limpio: para ax en g.axes.flatten (): ax.set_xticklabels (ax.get_xticklabels (), la rotación = 30)
odedbd
66
Utilícelo ha="right"para alinear las etiquetas del eje x con sus marcas de verificación. ieg.set_xticklabels([label1, label2], rotation=30, ha='right')
Manavalan Gajapathy
72
similar a un par de comentarios anteriores, esto me dio un error hasta que cambié g.set_xticklabels(rotation=30)a g.set_xticklabels(g.get_xticklabels(), rotation=30)gracias a esta respuesta: stackoverflow.com/a/39689464/1870832
Max Power
1
Algunos métodos de trazado Seaborn devuelven un FacetGridobjeto, algunos devuelven un Axesobjeto Matplotlib . Para el primero, no establecer las etiquetas funcionará, para el segundo, no. Puede ver cuáles son los FacetGridobjetos mirando la documentación: seaborn.pydata.org/api.html . Por ejemplo, si usa g = sns.catplot()esto funcionará, pero sns.barplot()no lo hará porque devuelve un Axesobjeto.
getup8
252

Tuve un problema con la respuesta de @mwaskorn, a saber, que

g.set_xticklabels(rotation=30)

falla, porque esto también requiere las etiquetas. Un poco más fácil que la respuesta de @Aman es simplemente agregar

plt.xticks(rotation=45)
Gijs
fuente
33
También puede obtener las etiquetas así g.set_xticklabels(g.get_xticklabels(), rotation=30). Asignarlo a una variable si desea suprimir la salida.
joelostblom
3
Creo que esto es correcto, cuando la configuración plt.xticsfuncionó para mí.
muammar
Probé todas las opciones anteriores para una trama de violín y plt.xticks (rotación = n) es solo una que pude poner a trabajar
A Rob4
29

Este sigue siendo un objeto matplotlib. Prueba esto:

# <your code here>
locs, labels = plt.xticks()
plt.setp(labels, rotation=45)
Un hombre
fuente
8

Si alguien se pregunta cómo hacer esto para clustermap CorrGrids (parte de un ejemplo marino dado):

import seaborn as sns
import matplotlib.pyplot as plt
sns.set(context="paper", font="monospace")

# Load the datset of correlations between cortical brain networks
df = sns.load_dataset("brain_networks", header=[0, 1, 2], index_col=0)
corrmat = df.corr()

# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(12, 9))

# Draw the heatmap using seaborn
g=sns.clustermap(corrmat, vmax=.8, square=True)
rotation = 90 
for i, ax in enumerate(g.fig.axes):   ## getting all axes of the fig object
     ax.set_xticklabels(ax.get_xticklabels(), rotation = rotation)


g.fig.show()
usuario5875384
fuente
6

También puede usar plt.setplo siguiente:

import matplotlib.pyplot as plt
import seaborn as sns

plot=sns.barplot(data=df,  x=" ", y=" ")
plt.setp(plot.get_xticklabels(), rotation=90)

para rotar las etiquetas 90 grados.

Robvh
fuente
5

Para a seaborn.heatmap, puede rotarlos usando (según la respuesta de @ Aman )

pandas_frame = pd.DataFrame(data, index=names, columns=names)
heatmap = seaborn.heatmap(pandas_frame)
loc, labels = plt.xticks()
heatmap.set_xticklabels(labels, rotation=45)
heatmap.set_yticklabels(labels[::-1], rotation=45) # reversed order for y
serv-inc
fuente
1
esto funcionó para mí, solo pasar en el parámetro de rotación no hizo nada, también tuve que pasar en las etiquetas para que esto funcione
Raveen Beemsingh
0

Cualquier parcela nacida con el apoyo de facetgrid no funcionará (por ejemplo, catplot)

g.set_xticklabels(rotation=30) 

sin embargo, barplot, countplot, etc. funcionarán ya que no son compatibles con facetgrid. A continuación funcionará para ellos.

g.set_xticklabels(g.get_xticklabels(), rotation=30)

Además, en caso de que tenga 2 gráficos superpuestos uno encima del otro, intente set_xticklabels en el gráfico que lo admite.

rishi jain
fuente