Girar texto do rótulo no gráfico de fatores marítimos


152

Eu tenho um gráfico de fator simples

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

insira a descrição da imagem aqui

O problema é que todos os rótulos x são executados juntos, tornando-os ilegíveis. Como você gira o texto para que os rótulos fiquem legíveis?


29
import matplotlib.pylab as plt. plt.xticks(rotation=‌​45)
Rafaelvalle

A biblioteca Dexplot tem a capacidade de agrupar etiquetas, definir o tamanho da figura, dpi, tudo sem usar o matplotlib.
Ted Petrou

Respostas:


137

Aman está certo de que você pode usar comandos normais do matplotlib, mas isso também está embutido no 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)

insira a descrição da imagem aqui

Existem alguns comentários e outra resposta alegando que isso "não funciona"; no entanto, qualquer pessoa pode executar o código como está escrito aqui e verificar se ele funciona. A outra resposta não fornece um exemplo reproduzível do que não está funcionando, dificultando a abordagem, mas meu palpite é que as pessoas estão tentando aplicar essa solução à saída de funções que retornam um Axesobjeto em vez de a Facet Grid. Essas são coisas diferentes, e o Axes.set_xticklabels()método realmente exige uma lista de rótulos e não pode simplesmente alterar as propriedades dos rótulos existentes no Axes. A lição é que é importante prestar atenção em que tipo de objetos você está trabalhando.


Eu recebo um erro: IndexError: muitos índices. Meu código! g = sns.factorplot ("data_do mês", "número_propostas", "conta", dados_dados, col = "conta", col_wrap = 3, sharex = Falso); g.set_xticklabels (rotation = 30)
yoshiserry

10
@soupault - isso funcionou para mim, semelhante ao que você criou, mas talvez um pouco mais limpo - para o machado em g.axes.flatten (): ax.set_xticklabels (ax.get_xticklabels (), rotation = 30)
odedbd

6
Use ha="right"para alinhar centralmente os rótulos do eixo x às suas marcas de escala. isto é,g.set_xticklabels([label1, label2], rotation=30, ha='right')
Manavalan Gajapathy

72
semelhante a alguns comentários acima, isso me deu um erro até que eu mudei g.set_xticklabels(rotation=30)para g.set_xticklabels(g.get_xticklabels(), rotation=30)graças a esta resposta: stackoverflow.com/a/39689464/1870832
Max Power

1
Alguns métodos de plotagem Seaborn retornam um FacetGridobjeto, outros retornam um Axesobjeto Matplotlib . Para o primeiro, não definir os rótulos funcionará; para o segundo, não. Você pode ver quais são os FacetGridobjetos consultando a documentação: seaborn.pydata.org/api.html . Por exemplo, se você usar g = sns.catplot()isso funcionará, mas sns.barplot()não porque retornará um Axesobjeto.
getup8

252

Eu tive um problema com a resposta do @mwaskorn, ou seja,

g.set_xticklabels(rotation=30)

falha, porque isso também requer os rótulos. Um pouco mais fácil do que a resposta de @Aman é apenas adicionar

plt.xticks(rotation=45)

33
Você também pode obter os rótulos assim g.set_xticklabels(g.get_xticklabels(), rotation=30). Atribua-o a uma variável se desejar suprimir a saída.
Joelostblom

3
Eu acho que isso é correto, quando a configuração plt.xticsfuncionou para mim.
muammar 29/08/18

tentou todas as opções acima para uma trama violino e plt.xticks (rotação = n) é único que eu poderia começar a trabalhar
Um Rob4

29

Este ainda é um objeto matplotlib. Tente o seguinte:

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

8

Se alguém se perguntar como fazer isso com o clustermap CorrGrids (parte de um determinado exemplo marítimo):

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()

6

Você também pode usar da plt.setpseguinte maneira:

import matplotlib.pyplot as plt
import seaborn as sns

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

para girar os rótulos 90 graus.


5

Para a seaborn.heatmap, você pode alterná-las usando (com base na resposta 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

1
Isso funcionou para mim, só de passagem em param rotação não fez nada, eu tinha que passar nos rótulos, assim como para começar este trabalho
Raveen Beemsingh

0

Qualquer plotagem marítima suportada pelo facetgrid não funcionará (por exemplo, catplot)

g.set_xticklabels(rotation=30) 

no entanto, o gráfico de barras, o gráfico de contagem etc. funcionará, pois não são suportados pelo facetgrid. Abaixo irá trabalhar para eles.

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

Além disso, caso você tenha dois gráficos sobrepostos, tente set_xticklabels no gráfico que o suporta.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.