Как передать аргумент веса в JointPlot () Seaborn или базовый kdeplot?

Я пытаюсь создать совместный сюжет с Seaborn, используя следующий код:

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 не вызывает ошибку, но веса точно не учитываются, как видно на графике:

Я также пытался сделать это с помощью 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')

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

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


person madcap    schedule 20.05.2015    source источник
comment
Ладно, возможно, я не в своей тарелке, но что именно вы хотели бы увидеть?   -  person    schedule 20.05.2015
comment
Извините за неясность. Я хочу взвесить точки данных. Веса равны 100, 5 и 25 для A, B и C соответственно, поэтому точка данных «A» должна быть гораздо более важной, чем «B», и вносить гораздо больший вклад в распределение. Предельные распределения на нижнем графике показывают это взвешенное распределение по сравнению с маргинальными распределениями на верхнем графике.   -  person madcap    schedule 20.05.2015
comment
Вот способ сделать это без использования Seaborn:   -  person Dan    schedule 20.12.2017


Ответы (3)


К сожалению, это кажется невозможным.

Это был запрос функции, поданный в декабре 2015 года, но он был закрыт за ненадобностью. -исправить.

Это также обсуждается в этом вопросе StackOverflow: параметр весов для морского дистрибутива?

person Tobber    schedule 10.02.2017

Я знаю, что это датируется некоторое время назад, но я смог использовать веса в совместных графиках, используя:

p = sns.jointplot(data=v, x="x", y="y",  kind="hist", weights=v.weights, bins=50)

v представляет собой фрейм данных со столбцами [x,y,weights]

person jkobject    schedule 21.04.2021

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

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

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)

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

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

person Paul H    schedule 04.06.2015
comment
Это звучит разумно, но сюжет все еще не взвешен. Возьмите точку A (x=1, y=3). Его счет равен 100. Сумма всех счетов равна 130 (100 + 5 + 25). Таким образом, A должен быть взвешен как 100/130, или 0,77, и все распределение определенно должно иметь самый большой пик именно здесь. - person madcap; 12.06.2015