Matplotlib KDE auf ternäres Diagramm - unerwartete DichteskalierungPython

Python-Programme
Anonymous
 Matplotlib KDE auf ternäres Diagramm - unerwartete Dichteskalierung

Post by Anonymous »

Ich arbeite an einem ternären KDE -Diagramm (Kerneldichteschätzung) unter Verwendung von Matplotlib + Scipy's Gaußsian_kde, aber die Dichteskalierung verhält sich nicht wie erwartet. zeigt ternäre Verteilungen für verschiedene Gruppen (x, y, z). Diese sehen gut aus. >
Das untere Feld (KDE Heatmaps) sollte Dichtekonturen basierend auf denselben Datensätzen anzeigen.
Erwartet: < Br /> Der X -Datensatz ist spärlich, daher sollte der KDE schwach oder nahezu leer sein. > Ausgabe: < /strong> < /p>
Obwohl X weniger Datenpunkte hat, erscheint der KDE immer noch strukturiert und unerwartet dicht mit y und z.
vergleichbar Sollte es nicht nahezu leer oder signifikant schwächer sein als mit Y und Z? Zum Testen: KDE_TERNARY_EMABLE.CSV < /p>
Sie können den Datensatz mit: < /p>
laden lassen

Code: Select all

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
Mein aktueller Code: [/b]

Code: Select all

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()
Meine Fragen
Warum ist die KDE -Dichte für X strukturiert und nicht so schwach wie erwartet?
Könnte die Auswahl der Bandbreite (BW_Method = 0,25; 'Scott') unerwünschte Glättungseffekte verursachen?>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post