Matplotlib kde на тройном графике - неожиданное масштабирование плотностиPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Matplotlib kde на тройном графике - неожиданное масштабирование плотности

Сообщение Anonymous »

Я работаю над графиком тройного KDE (оценка плотности ядра) с использованием Matplotlib + Scipy's Gaussian_kde, но масштабирование плотности не ведет себя, как ожидалось. Показывает тройные распределения для разных групп (x, y, z). Они выглядят нормально.

нижняя панель (Heatmaps KDE) должна показывать контуры плотности на основе тех же наборов данных. Br /> Набор данных X редк, поэтому KDE должен быть слабым или почти пустым.
Наборы данных Y и Z имеют больше данных, поэтому они должны иметь более сильные градиенты KDE. < /p>
Разве это не должно быть почти пустым или значительно более слабым по сравнению с Y и z? Для тестирования: kde_ternary_example.csv < /p>
Вы можете загрузить набор данных, используя: < /p>

Код: Выделить всё

import pandas as pd

# Load dataset from Google Drive link
file_url = "https://drive.google.com/uc?id=1p6qwnEom_ybyhbTNLUOThoVB5YE5xcyJ"
df = pd.read_csv(file_url)

print(df.head())  # Preview the dataset
мой текущий код:

Код: Выделить всё

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.patches import Polygon
from scipy.stats import gaussian_kde

# Load dataset
file_url = "https://drive.google.com/uc?id=1p6qwnEom_ybyhbTNLUOThoVB5YE5xcyJ"
df = pd.read_csv(file_url)

# Define ternary combinations and corresponding filters
ternary_combinations = [
(['B', 'C', 'A'], 'X'),
(['C', 'D', 'B'], 'Y'),
(['D', 'E', 'C'], 'Z')
]

# Function to convert barycentric to Cartesian coordinates
def barycentric_to_cartesian(data):
triangle_vertices = np.array([[0, 0], [1, 0], [0.5, np.sqrt(3) / 2]])  # Equilateral triangle
return np.dot(data, triangle_vertices)

# Function to check if points are inside the triangle
def is_inside_triangle(points, triangle_vertices):
A, B, C = triangle_vertices
v0, v1, v2 = B - A, C - A, points - A
d00, d01, d11 = np.dot(v0, v0), np.dot(v0, v1), np.dot(v1, v1)
d20, d21 = np.einsum('ij,j->i', v2, v0), np.einsum('ij,j->i', v2, v1)
denom = d00 * d11 - d01 * d01
u = (d11 * d20 - d01 * d21) / denom
v = (d00 * d21 - d01 * d20) / denom
return (u >= 0) & (v >= 0) & (u + v  0
data = data[valid_rows] / sum_values[valid_rows]
cartesian_points = barycentric_to_cartesian(data)

# Scatter plot
ax.scatter(cartesian_points[:, 0], cartesian_points[:, 1], s=20, alpha=0.5,
facecolors='none', edgecolors='black', linewidth=0.6, zorder=1)

# KDE calculation
if np.linalg.matrix_rank(np.cov(cartesian_points.T)) < 2:
cartesian_points += np.random.normal(0, 1e-6, cartesian_points.shape)  # Add small noise
kde = gaussian_kde(cartesian_points.T, bw_method=0.25)

x = np.linspace(0, 1, 200)
y = np.linspace(0, np.sqrt(3) / 2, 200)
X, Y = np.meshgrid(x, y)
grid_points = np.vstack([X.ravel(), Y.ravel()]).T

# Mask points outside the triangle
triangle_vertices = np.array([[0, 0], [1, 0], [0.5, np.sqrt(3) / 2]])
mask = is_inside_triangle(grid_points, triangle_vertices)
Z = np.full(grid_points.shape[0], np.nan)
Z[mask] = kde(grid_points[mask].T)
Z = Z.reshape(X.shape)

# Set density limit
max_density = np.nanmax(Z)
Z[Z > 0.4 * max_density] = 0.4 * max_density
Z[Z <  0.03 * max_density] = np.nan

# Plot KDE
contour = ax.contourf(X, Y, Z, levels=12, cmap='viridis', alpha=0.85, zorder=2)

# Draw triangle boundary
ax.add_patch(Polygon(triangle_vertices, closed=True, fill=False, edgecolor='black',
linewidth=2.5, linestyle='dashed', zorder=3))

# Remove axes and set aspect ratio
ax.set_xticks([])
ax.set_yticks([])
ax.set_frame_on(False)
ax.set_aspect('equal')

# Colorbar
cbar = plt.colorbar(contour, ax=ax, orientation='horizontal', fraction=0.05, pad=0.08)
cbar.set_label('Density', fontsize=12)

for ax, (ternary_set, norm_filter) in zip(axes, ternary_combinations):
plot_ternary(ax, ternary_set, norm_filter)

plt.show()

# Generate and save ternary plots with filters
plot_ternary_diagram()
Мои вопросы
Почему плотность KDE для X появляется структурированная и не такая слабая, как ожидалось?
Можно ли выбор полосы пропускания (bw_method = 0,25; 'scott') вызывать нежелательные эффекты сглаживания?>

Подробнее здесь: https://stackoverflow.com/questions/794 ... ty-scaling
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Matplotlib kde на тройном графике - неожиданное масштабирование плотности
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Matplotlib kde на тройном графике - неожиданное масштабирование плотности
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Matplotlib kde на тройном графике - неожиданное масштабирование плотности
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Matplotlib kde на тройном графике - неожиданное масштабирование плотности
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Matplotlib kde на тройном графике - неожиданное масштабирование плотности
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»