У меня есть график плотности с использованием 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)
Довольно просто определить значения maximum
и minimum
в одномерной установке, но я совершенно не обращаю внимания на Двусторонняя настройка (также у меня возникают проблемы при извлечении значений (get.values()
) из пакета seaborn
, чтобы попробовать что-то). Может ли кто-нибудь дать мне некоторые идеи для определения этих значений minimum
и maximum
?
Пример показан ниже. Черно-белые точки представляют плотность ядра maximum
и minimum
.
Ответ: Спасибо @ Йохан 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()