1 ось не работает правильно в 3D графике

значение по оси Y не изменится на моем графике, если я определю свою функцию вне ax.plot_wireframe(). Это проблема моей реальной функции, которая дольше.

import pandas
import numpy
from matplotlib import cm
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # <--- This is important for 3d plotting 

a = numpy.linspace(1,10,10)  # x axis
b = numpy.linspace(1,10,10)  # y axis
R = a+b   #model function, real function is longer
z = R
    
fig = plt.figure()
ax = plt.axes(projection='3d')
a,b = numpy.meshgrid(a,b)
#ax.plot_wireframe(a,b,a+b, color='b') #correct
#ax.plot_wireframe(a,b,z, color='b') #wrong
ax.plot_wireframe(a,b,R, color='b') #wrong
ax.set_title('surface');
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z');

Вот результат  введите описание изображения здесь


person Codelearner777    schedule 02.12.2020    source источник


Ответы (1)


Ознакомьтесь с документацией matplotlib, посвященной каркасным трехмерным графикам. Значения x, y и z должны быть двумерными. Пояснения к этому приведены здесь или здесь. Это также причина появления строки

a,b = numpy.meshgrid(a,b)

в вашем коде. Он создает 2D-массив 10x10 для обоих входов 1D. В следующих строках вы вызываете каркасный метод с a+b для значений z. Следовательно, значения z вычисляются на месте, и в результате снова получается двумерный массив 10x10. Причина, по которой вы получаете неправильный график с переменными R or z, заключается в том, что они вычисляются до того, как a and b будут преобразованы в соответствующие им 2D-сетки. Если вы определяете R or z после строки, содержащей numpy.meshgrid, он работает нормально.

import pandas
import numpy
from matplotlib import cm
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # <--- This is important for 3d plotting 

a = numpy.linspace(1,10,10)  # x axis
b = numpy.linspace(1,10,10)  # y axis

R = a+b   #not working
z = R     #not working

def f(x,y): 
    return x+y

fig = plt.figure()
ax = plt.axes(projection='3d')
a,b = numpy.meshgrid(a,b)

Z = f(a,b)#working
R = a+b   #working
z = R     #working

#ax.plot_wireframe(a,b,a+b, color='b') #
#ax.plot_wireframe(a,b,Z, color='b') #
ax.plot_wireframe(a,b,R, color='b') #
ax.set_title('surface');
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z');

Итак, краткий ответ: numpy.meshgrid меняет ваши переменные a и b, и вы в основном делаете свои вычисления с разными as и bs

person BenB    schedule 02.12.2020
comment
да, я только что это понял. благодаря. Я принял твой ответ. - person Codelearner777; 03.12.2020