Минимум и максимум на бивариальном графике - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть график плотности с использованием sns.kdeplot (код ниже). Я хотел определить значения minimum и maximum на графике KDE, чтобы определить бимодальность переменных.

# code for kde plot
import seaborn as sns
fig = plt.figure(figsize=(8,6))
y = np.array(RZS_P['Mean_Treecover'])
x = np.array(RZS_P['MAP'])
ax = sns.kdeplot(x, y, shade=True, n_levels=1000, cmap = 'Spectral', cbar=True, shade_lowest=False, alpha = 0.6)
ax.set_xlim(0,2500)
ax.set_ylim(0,90)

enter image description here

Довольно просто определить значения maximum и minimum в одномерной установке, но я совершенно не обращаю внимания на Двусторонняя настройка (также у меня возникают проблемы при извлечении значений (get.values()) из пакета seaborn, чтобы попробовать что-то). Может ли кто-нибудь дать мне некоторые идеи для определения этих значений minimum и maximum?

Пример показан ниже. Черно-белые точки представляют плотность ядра maximum и minimum. enter image description here

Ответ: Спасибо @ Йохан C за руководство. Новый код написан ниже:

import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as st

y = np.array(RZS_P['Mean_Treecover'])
x = np.array(RZS_P['MAP'])
xmin, xmax = 0, 2500
ymin, ymax = 0, 100

# Peform the kernel density estimate
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
positions = np.vstack([xx.ravel(), yy.ravel()])
values = np.vstack([x, y])
kernel = st.gaussian_kde(values)
f = np.reshape(kernel(positions).T, xx.shape)

fig = plt.figure(figsize=(8,6))
ax = fig.gca()
ax.set_xlim(xmin, xmax)
ax.set_ylim(ymin, ymax)
# Contourf plot
cfset = ax.contourf(xx, yy, f, cmap='autumn_r',levels = 100)
#plt.colorbar(cfset)

## Or kernel density estimate plot instead of the contourf plot
ax.imshow(np.rot90(f), extent=[xmin, xmax, ymin, ymax], aspect='auto')
# Contour plot
cset = ax.contour(xx, yy, f, colors='k',levels = 100, lw = 0.002, alpha = 0.1)
# Label plot
#ax.clabel(cset, inline=1, fontsize=10)
ax.set_xlabel('Y1')
ax.set_ylabel('Y0')

### Argmin/max calculation
argmax_65 = []
argmax_30 = []
argmin = []
for i in range(100):
    if xx[i,0] <= 1750:
        argmax_30.append(np.argmax(f[i,:30]))
    if xx[i,0] > 1750:
        argmax_30.append(np.nan)
    if xx[i,0] >= 1000:
        argmax_65.append(65+np.argmax(f[i,65:]))
    if xx[i,0] < 1000:
        argmax_65.append(np.nan)
    if (xx[i,0] >= 1000) & (xx[i,0] <= 1750):
        argmin.append(30+np.argmin(f[i,30:60]))
    else:
        argmin.append(np.nan)
###

plt.scatter(np.linspace(xmin,xmax,100), np.array(argmax_65), c = 'black', edgecolor = 'w', s = 70, linewidth='0.75')
plt.scatter(np.linspace(xmin,xmax,100), np.array(argmax_30), c = 'black', edgecolor = 'w', s = 70, linewidth='0.75')
plt.scatter(np.linspace(xmin,xmax,100), np.array(argmin), c = 'w', edgecolor = 'b', s = 70)
plt.ylim(0,90)
plt.show()

enter image description here

...