1 Pertanyaan: seaborn plot_marginals beberapa kdeplots

pertanyaan dibuat di Fri, Jan 6, 2017 12:00 AM

Saya ingin dapat memplot beberapa plot kde overlay pada margin sumbu y (tidak perlu plot margin sumbu x). Setiap plot kde akan sesuai dengan kategori warna (ada 4) sehingga saya akan memiliki masing-masing 4 kde yang menggambarkan distribusi salah satu kategori. Sejauh ini yang saya dapat:

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


%matplotlib inline
%config InlineBackend.figure_format = 'svg'



x = [106405611, 107148674, 107151119, 107159869, 107183396, 107229405, 107231917, 107236097,
 107239994, 107259338, 107273842, 107275873, 107281000, 107287770, 106452671, 106471246, 
 106478110, 106494135, 106518400, 106539079]


y = np.array([  9.09803208,   5.357552  ,   8.98868469,   6.84549005,
         8.17990909,  10.60640521,   9.89935692,   9.24079133,
         8.97441459,   9.09803208,  10.63753055,  11.82336724,
         7.93663794,   8.74819285,   8.07146236,   9.82336724,
         8.4429435 ,  10.53332973,   8.23361968,  10.30035256])


x1 = pd.Series(x, name="$V$")
x2 = pd.Series(y, name="$Distance$")  

col = np.array([2, 4, 4, 1, 3, 4, 3, 3, 4, 1, 4, 3, 2, 4, 1, 1, 2, 2, 3, 1])

g = sns.JointGrid(x1, x2)
g = g.plot_joint(plt.scatter, color=col, edgecolor="black", cmap=plt.cm.get_cmap('RdBu', 11))
cax = g.fig.add_axes([1, .25, .02, .4])
plt.colorbar(cax=cax, ticks=np.linspace(1,11,11))
g.plot_marginals(sns.kdeplot, color="black", shade=True)

 masukkan deskripsi gambar di sini

    
5
1 Jawaban                              1                         

Untuk memplot distribusi masing-masing kategori, saya pikir cara terbaik adalah pertama-tama menggabungkan data ke dalam pandas kerangka data. Kemudian Anda dapat mengulangi setiap kategori unik dengan memfilter bingkai data dan merencanakan distribusi menggunakan panggilan ke sns.kdeplot.

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


x = np.array([106405611, 107148674, 107151119, 107159869, 107183396, 107229405,
              107231917, 107236097, 107239994, 107259338, 107273842, 107275873,
              107281000, 107287770, 106452671, 106471246, 106478110, 106494135,
              106518400, 106539079])

y = np.array([9.09803208,   5.357552  ,   8.98868469,   6.84549005,
              8.17990909,  10.60640521,   9.89935692,   9.24079133,
              8.97441459,   9.09803208,  10.63753055,  11.82336724,
              7.93663794,   8.74819285,   8.07146236,   9.82336724,
              8.4429435 ,  10.53332973,   8.23361968,  10.30035256])

col = np.array([2, 4, 4, 1, 3, 4, 3, 3, 4, 1, 4, 3, 2, 4, 1, 1, 2, 2, 3, 1])

# Combine data into DataFrame
df = pd.DataFrame({'V': x, 'Distance': y, 'col': col})

# Define colormap and create corresponding color palette
cmap = sns.diverging_palette(20, 220, as_cmap=True)
colors = sns.diverging_palette(20, 220, n=4)

# Plot data onto seaborn JointGrid
g = sns.JointGrid('V', 'Distance', data=df, ratio=2)
g = g.plot_joint(plt.scatter, c=df['col'], edgecolor="black", cmap=cmap)

# Loop through unique categories and plot individual kdes
for c in df['col'].unique():
    sns.kdeplot(df['Distance'][df['col']==c], ax=g.ax_marg_y, vertical=True,
                color=colors[c-1], shade=True)
    sns.kdeplot(df['V'][df['col']==c], ax=g.ax_marg_x, vertical=False,
                color=colors[c-1], shade=True)

 masukkan deskripsi gambar di sini

Ini menurut saya solusi yang jauh lebih baik dan lebih bersih daripada jawaban asli saya di mana saya tidak perlu mendefinisikan ulang seaborn kdeplot karena saya tidak berpikir untuk melakukannya dengan cara ini. Terima kasih kepada mwaskom untuk menunjukkannya. Perhatikan juga bahwa label legenda dihapus dalam solusi yang diposting dan dilakukan dengan menggunakan

 
g.ax_marg_x.legend_.remove()
g.ax_marg_y.legend_.remove()
    
5
2017-01-07 21: 07: 20Z
  1. Apakah downvoter mau menjelaskan? Saya yakin inilah yang diminta oleh OP.
    2017-01-07 03: 37: 35Z
  2. Mengapa Anda menulis ulang fungsi seaborn.kdeplot?
    2017-01-07 14: 29: 41Z
  3. @ mwaskom, Tidak ada alasan bagus. Saya telah menggunakan fungsi itu untuk sesuatu yang lain baru-baru ini dan secara tidak tepat mengaplikasikannya kembali di sini. Saya pikir jawaban yang direvisi jauh lebih baik sekarang, terima kasih.
    2017-01-07 21: 11: 40Z
sumber ditempatkan sini