Поворот текста метки в факторинке seaborn

152

У меня простой факторплот

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

введите описание изображения здесь

Проблема в том, что все метки x работают вместе, что делает их нечитаемыми. Как вы поворачиваете текст, чтобы метки были читабельными?

Дан
источник
29
import matplotlib.pylab as plt, plt.xticks(rotation=‌​45)
rafaelvalle
Библиотека Dexplot имеет возможность оборачивать метки, устанавливать размер фигуры, dpi - все без использования matplotlib.
Тед Петру

Ответы:

137

Аман прав, что вы можете использовать обычные команды matplotlib, но это также встроено в 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)

введите описание изображения здесь

Есть некоторые комментарии и другой ответ, утверждающий, что это «не работает», однако, любой может запустить код, как написано здесь, и увидеть, что он работает. Другой ответ не дает воспроизводимый пример того , что не работает, что делает его очень трудно адрес, но я думаю, что люди пытаются применить это решение на выходе функций , которые возвращают в Axesобъект вместо Facet Grid. Это разные вещи, и Axes.set_xticklabels()метод действительно требует списка меток и не может просто изменить свойства существующих меток в Axes. Урок в том, что важно обращать внимание на то, с какими объектами вы работаете.

mwaskom
источник
Я получаю сообщение об ошибке: IndexError: слишком много индексов. Мой код! g = sns.factorplot ("month_date", "num_proposals", "account", sorted_data, col = "account", col_wrap = 3, sharex = False); g.set_xticklabels (вращение = 30)
yoshiserry
10
@soupault - это сработало для меня, похоже на то, что вы придумали, но, возможно, немного чище - для топора в g.axes.flatten (): ax.set_xticklabels (ax.get_xticklabels (), вращение = 30)
odedbd
6
Используйте ha="right"для выравнивания по центру надписей по оси X и их отметок. то естьg.set_xticklabels([label1, label2], rotation=30, ha='right')
Манавалан Гаджапати
73
похоже на пару комментариев выше, это дало мне ошибку , пока я не изменил , g.set_xticklabels(rotation=30)чтобы g.set_xticklabels(g.get_xticklabels(), rotation=30)благодаря этому ответу: stackoverflow.com/a/39689464/1870832
Максимальная мощность
1
Некоторые методы построения Seaborn возвращают FacetGridобъект, некоторые возвращают Axesобъект Matplotlib . Для первых не работает установка меток, для вторых - нет. Вы можете увидеть, какие FacetGridобъекты являются объектами, просмотрев документацию: seaborn.pydata.org/api.html . Например, если вы используете g = sns.catplot()это будет работать, но sns.barplot()не будет, потому что он возвращает Axesобъект.
getup8
253

У меня была проблема с ответом @mwaskorn, а именно, что

g.set_xticklabels(rotation=30)

терпит неудачу, потому что это также требует меток. Чуть проще, чем ответ @Aman - просто добавить

plt.xticks(rotation=45)
Гис
источник
33
Вы также можете получить ярлыки, как это g.set_xticklabels(g.get_xticklabels(), rotation=30). Присвойте его переменной, если хотите подавить вывод.
Joelostblom
3
Я думаю, что это правильно, когда настройка plt.xticsработала на меня.
Muammar
перепробовал все варианты, описанные выше, для сюжета для скрипки, и plt.xticks (вращение = n) - только один, который я мог заставить работать
A Rob4
29

Это все еще объект matplotlib. Попробуй это:

# <your code here>
locs, labels = plt.xticks()
plt.setp(labels, rotation=45)
Мужчина
источник
8

Если кому-то интересно, как это сделать для кластерной карты CorrGrids (часть данного примера с Seaborn):

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()
user5875384
источник
6

Вы также можете использовать plt.setpследующее:

import matplotlib.pyplot as plt
import seaborn as sns

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

повернуть метки на 90 градусов.

Robvh
источник
5

Для seaborn.heatmap, вы можете повернуть их, используя (на основе ответа @ 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-вкл
источник
1
это сработало для меня, просто передача в параметре вращения ничего не сделала, мне также пришлось
пройтись
0

Любые морские участки, поддерживаемые Facetgrid, не будут работать (например, catplot)

g.set_xticklabels(rotation=30) 

однако barplot, countplot и т. д. будут работать, так как они не поддерживаются facetgrid. Ниже будет работать на них.

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

Кроме того, если у вас есть 2 графика, наложенные друг на друга, попробуйте set_xticklabels на графике, который поддерживает это.

Риши Джайн
источник