FacetGrid Легенда пуста

Я пытаюсь создать морскую FacetGrid, чтобы показать вероятности перехода между кластерами в некоторых данных, которые у меня есть. У данных есть группа субъектов и 4 кластера (так что каждый субъект имеет 16 точек данных, по одной для каждой пары старых и новых кластеров). Поскольку это вероятности, все значения, которые имеют один и тот же старый кластер (для каждого объекта), в сумме равны 1. Я хотел бы показать эти данные, используя точечный график FacetGrid (или составной столбчатый график, но это не представляется возможным с морским борном), например что каждый старый кластер - это отдельный столбец, новый кластер - это отдельный оттенок, и каждый аспект показывает субъект против вероятности.

Вот код для создания игрушечного DataFrame с теми же функциями, что и у меня, а также код для фасетной сетки, которую я хотел бы создать. Однако, когда я все это делаю, легенда пуста.

df,index = [],0
for subj in [1,2]:
    for i,j in itertools.product(range(4),range(4)):
        df.append(pd.DataFrame(index=[index],data=dict(subject=subj,old=i,new=j,prob=[.23,.24,.26,.27][j])))
        index+=1
df = pd.concat(df)
g = sns.FacetGrid(df,col='old',hue='new',margin_titles=False,legend_out=True)
g.map(sns.pointplot,'subject','prob',join=False)
g.add_legend()

Глядя на g._legend_data, видно, что он пуст, и каждая из функций get_legend_handles_labels() осей ничего не возвращает. В чем дело?

Я не могу опубликовать изображение своего сюжета, потому что у меня нет 10 репутации; название легенды появляется справа, но в ней ничего нет ...

РЕДАКТИРОВАТЬ: Кроме того, я хотел бы немного уклониться от значений, но g.map(sns.pointplot,'subject','prob',join=False,dodge=.1) выглядит точно так же, как указано выше, для множества различных значений уклонения ...

РЕДАКТИРОВАТЬ 2: Получается, что при использовании sns.factorplot вместо FacetGrid работают легенда и уклонение. Единственное, что я не могу сделать с помощью sns.factorplot, - это повернуть метки xtick, но это все равно не работает с col_wrap в Facet Grid ... Почему у FacetGrid такая проблема?


person Bill Broderick    schedule 11.03.2015    source источник


Ответы (1)


Как вы заметили, factorplot обеспечивает более простой интерфейс для совместного использования pointplot и FacetGrid. Причина, по которой легенда и уклонение не работают так, как вы это делаете, заключается в том, что установка hue в FacetGrid и установка pointplot отличаются. Когда вы вызываете pointplot без переменной hue, он не знает, как уклоняться, и не думает, что ему нужно добавлять какие-либо данные легенды.

Первый вариант - переместиться туда, где вы используете переменную hue:

g = sns.FacetGrid(df,col='old', col_wrap=2)
g.map(sns.pointplot, 'subject', 'prob', 'new', dodge=.1, join=False)
g.add_legend()

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

Но я не могу придумать причины использовать FacetGrid таким образом вместо простого factorplot:

g = sns.factorplot(x="subject", y="prob", hue="new", data=df,
               col="old", col_wrap=2, size=3,
               dodge=.1, join=False)

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

Таким образом, единственная оставшаяся проблема - это вращение меток отметок оси x. factorplot возвращает FacetGrid экземпляр, поэтому в принципе должно быть легко использовать дополнительные FacetGrid методы для настройки графика. Я подозреваю, что вы столкнулись с этой ошибкой, которая будет исправлена ​​в следующем выпускать. А пока вы можете обойти это так:

g = sns.factorplot(x="subject", y="prob", hue="new", data=df,
                   col="old", col_wrap=2, size=3,
                   dodge=.1, join=False)
for ax in g.axes:
    plt.setp(ax.get_xticklabels(), rotation=45)

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

person mwaskom    schedule 12.03.2015
comment
Проблема, с которой я столкнулся с вращением, - это именно та ошибка, и этот обходной путь работает. Спасибо! - person Bill Broderick; 12.03.2015