Parcela de superficie lisa con Pyplot

Mi pregunta es casi similar a esta en: suavizar la superficie de la matriz

solo que mi conjunto de herramientas es matplotlib y numpy (hasta ahora).

He generado con éxito una X, Y y Z-grid para trazar con

fig = plt.figure(figsize=(12,12)) ax = fig.add_subplot(111, projection='3d') ax.plot_surface(X, Y, Z, cmap='summer', rstride=1, cstride=1, alpa=None) 

Sin embargo, como los valores son bastante agitados, parece terriblemente. Exampleplot - terriblemente nervioso, feo ... no utilizable y esas cosas

Me gustaría suavizar las cosas, hacer al menos los vértices conectados, o verse así.

Mis datos se generan así: tengo una función

 svOfMatrix(x, y) 

que produce una matriz en función de x, calcula su potencia en y, selecciona un subconjunto de columnas y filas y calcula el valor singular máximo. Entonces, Z [x, y] es svOfMatrix (x, y)

Como este cálculo es bastante costoso, no quiero que los pasos para x sean demasiado pequeños, e Y está obligado a ser entero
Además, incluso para pasos muy pequeños, puede haber algunos cambios, no quiero verlos. Así que me gustaría interpolarlo de alguna manera. Encontré http://docs.scipy.org/doc/scipy-0.14.0/reference/tutorial/interpolate.html pero no consigo que funcione.

Desde el enlace que sugirió, el ejemplo aquí es probablemente el más cercano a lo que desea. Puedes usar el ejemplo con tus valores,

 import numpy as np from scipy import interpolate import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import axes3d, Axes3D X, Y = np.mgrid[-1:1:20j, -1:1:20j] Z = (X+Y) * np.exp(-6.0*(X*X+Y*Y)) + np.random.rand(X.shape[0]) xnew, ynew = np.mgrid[-1:1:80j, -1:1:80j] tck = interpolate.bisplrep(X, Y, Z, s=0) znew = interpolate.bisplev(xnew[:,0], ynew[0,:], tck) fig = plt.figure(figsize=(12,12)) ax = fig.gca(projection='3d') ax.plot_surface(X, Y, Z, cmap='summer', rstride=1, cstride=1, alpha=None) plt.show() fig = plt.figure(figsize=(12,12)) ax = fig.gca(projection='3d') ax.plot_surface(xnew, ynew, znew, cmap='summer', rstride=1, cstride=1, alpha=None, antialiased=True) plt.show() 

Además, antialiased=True puede hacer que se vea mejor, pero creo que está activado de forma predeterminada. La primera ttwig se parece a esto,

introduzca la descripción de la imagen aquí

y la ttwig alisada como esta,

introduzca la descripción de la imagen aquí

El problema con su ruido de baja frecuencia en sus datos es que será difícil definir una cuadrícula lo suficientemente fina como para resolverla. Puede ajustar el nivel de suavizado con el argumento s para interpolate.bisplrep o tal vez de grano grueso / filtrar sus datos para dejar solo las tendencias principales (por ejemplo, usar scipy.ndimage.interpolation.zoom si tiene datos de cuadrícula regulares). Alternativamente, considere un tipo diferente de gráfico como pcolormesh ya que los datos son esencialmente 2D.