Отвечая на старый вопрос, я знаю, но опубликованные ответы были, по крайней мере, в моем случае несколько неудовлетворительными. Для тех, кто все еще спотыкается здесь, я даю решение, которое сработало для меня.
Во-первых, я не хотел использовать нули для замены NaN, поскольку для меня они представляют точки с отсутствующими или неопределенными данными. Я бы предпочел не иметь в этих точках ничего . Во-вторых, весь диапазон моих данных z был намного выше нуля, поэтому расставление точек с нулями привело бы к уродливому и плохо масштабированному графику.
Решение, данное Лейфденби, было довольно близко, так что +1 за это (хотя, как указывалось, явная нормализация не добавляет к более раннему решению). Я просто отбросил замену NaN на ноль и использовал функции nanmin
и nanmax
вместо min
и max
в нормализации цветовой шкалы. Эти функции дают минимальное и максимальное значения массива , но просто игнорируют все NaN . Код теперь гласит:
# Added colors to the matplotlib import list
from matplotlib import cm, colors
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d, Axes3D
import pylab as p
vima=0.5
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(0, 16.67, vima)
Y = np.arange(0, 12.5, vima)
X, Y = np.meshgrid(X, Y)
Z = np.sqrt(((1.2*Y+0.6*X)**2+(0.2*Y+1.6*X)**2)/(0.64*Y**2+0.36*X**2))
# MAIN IDEA: Added normalisation using nanmin and nanmax functions
norm = colors.Normalize(vmin = np.nanmin(Z),
vmax = np.nanmax(Z))
# Added the norm=norm parameter
surf = ax.plot_surface(X, Y, Z,rstride=1, cstride=1, alpha=1, norm=norm, cmap=cm.jet, linewidth=0)
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()
Запустив это, я получаю правильно масштабированный график с отсутствующей точкой данных (0, 0). Это также поведение, которое я считаю наиболее предпочтительным, поскольку для рассматриваемой функции не существует предела (x, y) в (0, 0).
Это был мой первый вклад в StackOverflow, надеюсь, он был хорошим (подмигнул).