цвет морской свиты по плотности - PullRequest
0 голосов
/ 29 декабря 2018

Я делаю 2-ые гистограммы для некоторых данных с миллионами точек данных.matplotlib.hist2d(x,y,bins,norm=LogNorm()) работает хорошо и создает график примерно за 5 секунд, но мне нравятся маргинальные гистограммы seaborn.jointplot().Как мне закрасить точки в seaborn.jointplot() с помощью логарифмической плотности точек, как на прилагаемом рисунке matplotlib.hist2d()?Использование KDE занимает слишком много времени (я сдаюсь через минуту или около того), и у меня есть много фигур для создания.Так что время, чтобы «получить» цвета является фактором.Или как добавить маргинальные гистограммы к matplotlib.hist2d()?

plt.hist2d(x,y,100,norm=LogNorm(),cmap='jet')

enter image description here

sns.jointplot(x=x, y=y)

enter image description here

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

Вот альтернатива, по сути такая же, но прилипшая к морскому рожку:

import seaborn as sns
import numpy as np

x = np.random.normal(size=100)
y = x * 3.5 + np.random.normal(size=100)

sns.jointplot(x=x, y=y, kind='kde', cmap='jet', n_levels=60)
0 голосов
/ 01 января 2019

Вот последний рис и код для него.Спасибо @Bazingaa за помощь.

def makesweetgraph(x=None, y=None, cmap='jet', ylab=None, xlab=None, bins=100, sets=sets, figsize=(5,4), snsbins=60):
    set1,set2 = sets
    ax1 = sns.jointplot(x=x, y=y,marginal_kws=dict(bins=snsbins))
    ax1.fig.set_size_inches(figsize[0], figsize[1])
    ax1.ax_joint.cla()
    plt.sca(ax1.ax_joint)
    plt.hist2d(x,y,bins,norm=LogNorm(),cmap=cmap)
    plt.title('%s vs %s (%.4f%% of loci)\n%s and %s' % (xlab,ylab,(len(x)/numsnps)*100,set1,set2),y=1.2,x=0.6)
    plt.ylabel(ylab,fontsize=12)
    plt.xlabel(xlab,fontsize=12)
    cbar_ax = ax1.fig.add_axes([1, 0.1, .03, .7])
    cb = plt.colorbar(cax=cbar_ax)
    cb.set_label(r'$\log_{10}$ density of points',fontsize=13)

enter image description here

0 голосов
/ 29 декабря 2018

Может быть другой прямой способ получить цветную карту в seaborn.Я не мог найти еще.Вот хакерский пример решения, чтобы сделать вещи с некоторыми случайными данными.Что касается вашей второй проблемы, я бы предложил опубликовать новый вопрос.

Хитрость заключается в том, чтобы сначала создать jointplot, используя seaborn, а затем скрыть 2d-разброс и заново построить его, используя plt.hist2d

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

# some random data
x = np.random.normal(size=100000)
y = x * 3.5 + np.random.normal(size=100000)

ax1 = sns.jointplot(x=x, y=y)
ax1.ax_joint.cla()
plt.sca(ax1.ax_joint)

plt.hist2d(x, y, bins=(100, 100), cmap=cm.jet);

enter image description here

...