2015-05-20 9 views
4

Я пытаюсь создать jointplot с Сиборн, используя следующий код:Как передать гири аргумент jointplot Сиборн (в) (или подстилающей kdeplot)

import seaborn as sns 
import pandas as pd 
import numpy as np 
import matplotlib.pylab as plt 

testdata = pd.DataFrame(np.array([[100, 1, 3], [5, 2, 6], [25, 3, -4]]), index=['A', 'B', 'C'], columns=['counts', 'X', 'Y']) 
counts = testdata['counts'].values 
sns.jointplot('X', 'Y', data=testdata, kind='kde', joint_kws={'weights':counts}) 
plt.savefig('test.png') 

Теперь joint_kws не вызывают ошибку, но вес уверен, не принимаются во внимание, как можно видеть на графике: enter image description here

Я также попытался это сделать с JointGrid, передавая весовые коэффициенты к предельным распределениям:

g = sns.JointGrid('X', 'Y', data=testdata) 
x = testdata['X'].values 
y = testdata['Y'].values 
g.ax_marg_x.hist(x, bins=np.arange(-10,10), weights=counts) 
g.ax_marg_y.hist(y, bins=np.arange(-10,10), weights=counts, orientation='horizontal') 
g.plot_marginals(sns.distplot) 
g.plot_join(sns.kdeplot, joint_kws={'weights':counts}) 
plt.savefig('test.png') 

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

enter image description here

Кто-нибудь идея, как это сделать?

+0

Хорошо, я мог бы быть из моего элемента здесь, но именно то, что вы хотели бы видеть? –

+0

Извините за то, что неясно. Я хочу весить данные. Веса равны 100, 5 и 25 для A, B и C соответственно, поэтому точка данных «A» должна быть гораздо более важной как «B» и вносить гораздо больший вклад в распределение. Маргинальные распределения на нижнем графике показывают это взвешенное распределение по сравнению с предельными распределениями на верхнем участке. – madcap

+0

Вот способ сделать это без морского берега: https://gist.github.com/tillahoffmann/f844bce2ec264c1c8cb5#file-weighted_kde-ipynb – Dan

ответ

-1

Вы действительно близко.

Что нужно иметь в том, что присоединиться сюжет делает следующее (сильно перефразировать):

def jointplot(x, y, data=None, ..., joint_kws): 
    g = sns.JointGrid(...) 
    g.plot_joint(..., **joint_kws) 

Так что, когда вы звоните g.plot_joint себя, только кормить его нормальной kwargs:

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

testdata = pd.DataFrame(
    np.array([[100, 1, 3], [5, 2, 6], [25, 3, -4]]), 
    index=['A', 'B', 'C'], 
    columns=['counts', 'X', 'Y'] 
) 
counts = testdata['counts'].values 

g = sns.JointGrid('X', 'Y', data=testdata) 
g.plot_marginals(sns.distplot) 
g.plot_joint(sns.kdeplot, weights=counts) 

enter image description here

Теперь я не уверен, что это выглядит правильно, но это не заглохло, так что это того стоит.

+5

Это звучит разумно, но сюжет по-прежнему невзвешен. Возьмите точку A (x = 1, y = 3). Его счет равен 100. Сумма всех отсчетов составляет 130 (100 + 5 + 25). Таким образом, A должен быть взвешен 100/130, или 0.77, и вся дистрибуция должна иметь самый большой пик. – madcap

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

  • Нет связанных вопросов^_^