2015-06-03 3 views
8

Я использую следующий кодземля множественным DataFrame колонны в Сиборн FacetGrid

import seaborn as sns 

g = sns.FacetGrid(dataframe, col='A', hue='A') 
g.map(plt.plot, 'X', 'Y1') 
plt.show() 

сделать Сиборн фаска сюжет так: Example facet plot

Теперь я хотел бы добавить еще одну строку в этом участке другую переменную, назовем ее Y2 на оси y. Результат должен выглядеть примерно вертикально укладки двух участков, полученных

g = sns.FacetGrid(dataframe, col='A', hue='A') 
g.map(plt.plot, 'X', 'Y1') 
plt.show() 

g = sns.FacetGrid(dataframe, col='A', hue='A') 
g.map(plt.plot, 'X', 'Y2') 
plt.show() 

Example plot with two rows

но в одном участке, без дублированных осей х и названия («A = < значения >») и без создания новый объект FacetGrid.

Обратите внимание, что

g = sns.FacetGrid(dataframe, col='A', hue='A') 
g.map(plt.plot, 'X', 'Y1') 
g.map(plt.plot, 'X', 'Y2') 
plt.show() 

не achive это, поскольку она приводит к кривой как для Y1 и Y2 отображается в том же подзаговоре для каждого значения А.

+2

Вы должны изменить свой DataFrame так, что есть один 'столбец Y' и дополнительный столбец, который указывает, какие наблюдения' Y1' и которые являются 'У2 '. Затем вы можете использовать грань 'row'. – mwaskom

+2

@mwaskom Это действительно возможно (например, с помощью http://pandas.pydata.org/pandas-docs/stable/generated/pandas.melt.html) и работает в некоторой степени, однако по умолчанию все оси y получают одинаковый масштаб, а переменная Y отображается в заголовке, а не влево. Хотя это, конечно, можно скорректировать вручную, мне бы хотелось увидеть решение, требующее как можно меньше ручных исправлений. – arccos

+0

Используйте 'sharey =" строку "' и 'margin_titles = True'. – mwaskom

ответ

1

Я использовал следующий код создать синтетический набор данных, который появляется, чтобы соответствовать вашим:

import pandas 
import numpy 
import seaborn as sns 
import matplotlib.pyplot as plt 

# Generate synthetic data 
omega = numpy.linspace(0, 50) 

A0s = [1., 18., 40., 100.] 

dfs = [] 
for A0 in A0s: 
    V_w_dr = numpy.sin(A0*omega) 
    V_w_tr = numpy.cos(A0*omega) 
    dfs.append(pandas.DataFrame({'omega': omega, 
           'V_w_dr': V_w_dr, 
           'V_w_tr': V_w_tr, 
           'A0': A0})) 
dataframe = pandas.concat(dfs, axis=0) 

Тогда вы можете делать то, что вы хотите (благодаря @mwaskom в комментариях для )sharey='row', margin_titles=True):

melted = dataframe.melt(id_vars=['A0', 'omega'], value_vars=['V_w_dr', 'V_w_tr']) 
g = sns.FacetGrid(melted, col='A0', hue='A0', row='variable', sharey='row', margin_titles=True) 
g.map(plt.plot, 'omega', 'value') 

Это приводит к

Result of plotting melted data

Смежные вопросы