Matplotlib tricontourf ploblem cuando doy más punto de datos

Tengo un problema cuando bash trazar el estrés.

import numpy as np import matplotlib.pyplot as plt import matplotlib.tri as mtri import matplotlib.cm as cm def plot(x_plot, y_plot, a_plot): x = np.array(x_plot) y = np.array(y_plot) a = np.array(a_plot) triang = mtri.Triangulation(x, y) refiner = mtri.UniformTriRefiner(triang) tri_refi, z_test_refi = refiner.refine_field(a, subdiv=4) plt.figure(figsize=(18, 9)) plt.gca().set_aspect('equal') # levels = np.arange(23.4, 23.7, 0.025) levels = np.linspace(a.min(), a.max(), num=1000) cmap = cm.get_cmap(name='jet') plt.tricontourf(tri_refi, z_test_refi, levels=levels, cmap=cmap) plt.scatter(x, y, c=a, cmap=cmap) plt.colorbar() plt.title('stress plot') plt.show() 

Primero tengo la ttwig utilizando solo 8 puntos:

 x = [2.3384750000000003, 3.671702, 0.3356813, 3.325298666666667, 2.660479, 1.3271675666666667, 1.6680919666666665, 0.6659845666666667] y = [0.614176, 0.5590579999999999, 0.663329, 0.24002166666666666, 0.26821433333333333, 0.31229233333333334, 0.6367503333333334, 0.3250663333333333] a = [2.572, 0.8214, 5.689, -0.8214, -2.572, -4.292, 4.292, -5.689] plot(x, y, a) 

versión a

Entonces trato de dar una información del límite del rectángulo:

 x = [2.3384750000000003, 1.983549, 3.018193, 2.013683, 3.671702, 3.978008, 4.018905, 0.3356813, 0.0, 0.0, 1.0070439, 3.325298666666667, 2.979695, 2.660479, 1.3271675666666667, 0.9909098, 1.6680919666666665, 0.6659845666666667] y = [0.614176, -0.038322, 0.922264, 0.958586, 0.5590579999999999, -0.1229, 0.87781, 0.663329, 1.0, 0.0, 0.989987, 0.24002166666666666, -0.079299, 0.26821433333333333, 0.31229233333333334, -0.014787999999999999, 0.6367503333333334, 0.3250663333333333] a = [2.572, 2.572, 2.572, 2.572, 0.8214, 0.8214, 0.8214, 5.689, 5.689, 5.689, 5.689, -0.8214, -0.8214, -2.572, -4.292, -4.292, 4.292, -5.689] plot(x, y, a) 

versión b

No sé cómo solucionarlo y por qué sucede esto. La figura que quiero es:

versión photoshoped

Tengo que hacer el diagtwig de dispersión de cada punto en la segunda figura y hay razón, pero por qué el color no es el contorno.

Muchas gracias.

El campo devuelto por el UniformTriRefiner no se interpola bien en el caso de los puntos adicionales. En su lugar, introduce nuevos mínimos y máximos con valores hasta 20 veces más grandes que los puntos originales.

La siguiente gráfica muestra lo que está sucediendo.

 import numpy as np import matplotlib.pyplot as plt import matplotlib.tri as mtri import matplotlib.cm as cm def plot(x_plot, y_plot, a_plot, ax=None): if ax == None: ax = plt.gca() x = np.array(x_plot) y = np.array(y_plot) a = np.array(a_plot) triang = mtri.Triangulation(x, y) refiner = mtri.UniformTriRefiner(triang) tri_refi, z_test_refi = refiner.refine_field(a, subdiv=2) levels = np.linspace(z_test_refi.min(), z_test_refi.max(), num=100) cmap = cm.get_cmap(name='jet') tric = ax.tricontourf(tri_refi, z_test_refi, levels=levels, cmap=cmap) ax.scatter(x, y, c=a, cmap=cmap, vmin= z_test_refi.min(),vmax= z_test_refi.max()) fig.colorbar(tric, ax=ax) ax.set_title('stress plot') fig, (ax, ax2) = plt.subplots(nrows=2, sharey=True,sharex=True, subplot_kw={"aspect":"equal"} ) x = [2.3384750000000003, 3.671702, 0.3356813, 3.325298666666667, 2.660479, 1.3271675666666667, 1.6680919666666665, 0.6659845666666667] y = [0.614176, 0.5590579999999999, 0.663329, 0.24002166666666666, 0.26821433333333333, 0.31229233333333334, 0.6367503333333334, 0.3250663333333333] a = [2.572, 0.8214, 5.689, -0.8214, -2.572, -4.292, 4.292, -5.689] plot(x, y, a, ax) x = [2.3384750000000003, 1.983549, 3.018193, 2.013683, 3.671702, 3.978008, 4.018905, 0.3356813, 0.0, 0.0, 1.0070439, 3.325298666666667, 2.979695, 2.660479, 1.3271675666666667, 0.9909098, 1.6680919666666665, 0.6659845666666667] y = [0.614176, -0.038322, 0.922264, 0.958586, 0.5590579999999999, -0.1229, 0.87781, 0.663329, 1.0, 0.0, 0.989987, 0.24002166666666666, -0.079299, 0.26821433333333333, 0.31229233333333334, -0.014787999999999999, 0.6367503333333334, 0.3250663333333333] a = [2.572, 2.572, 2.572, 2.572, 0.8214, 0.8214, 0.8214, 5.689, 5.689, 5.689, 5.689, -0.8214, -0.8214, -2.572, -4.292, -4.292, 4.292, -5.689] plot(x, y, a, ax2) plt.show() 

introduzca la descripción de la imagen aquí

Como se puede ver, los valores del campo “interpolado” sobrepasan los valores originales en una gran cantidad.
El motivo es que, de forma predeterminada, UniformTriRefiner.refine_field utiliza una interpolación cúbica (un CubicTriInterpolator ). Los estados de documentación

La interpolación se basa en un esquema de subdivisión Clough-Tocher de la malla de triangulación (para aclararlo, cada triángulo de la cuadrícula se dividirá en 3 triangularjs secundarios y en cada triángulo secundario la función interpolada es un polinomio cúbico del coordenadas). Esta técnica se origina a partir del análisis FEM (Método de Elementos Finitos); el elemento utilizado es un elemento reducido de Hsieh-Clough-Tocher (HCT). Sus funciones de forma se describen en 1 . Se garantiza que la función ensamblada es C1 suave , es decir, es continua y sus primeras derivadas también son continuas (esto es fácil de mostrar dentro de los triangularjs, pero también es cierto cuando se cruzan los bordes).

En el caso predeterminado (kind = ‘min_E’), el interpolante minimiza la energía de curvatura en el espacio funcional generado por las funciones de forma del elemento HCT, con valores impuestos pero derivados arbitrarios en cada nodo.

Si bien esto es realmente muy técnico, enfaticé algunas partes importantes, a saber, que la interpolación es suave y continua con un derivado definido. Para garantizar este comportamiento, los rebasamientos son inevitables cuando los datos son muy escasos pero con grandes fluctuaciones de amplitud.

Aquí, los datos simplemente no son adecuados para la interpolación cúbica. Uno intentaría adquirir datos más densos o, en su lugar, utilizar una interpolación lineal.