ошибка будет возникать при попытке передать contour
трехмерные массивы, так как она ожидает, что двумерные массивы.
Имея это в виду, попробуйте:
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
def V(x,y,z):
return np.cos(10*x) + np.cos(10*y) + np.cos(10*z) + 2*(x**2 + y**2 + z**2)
X,Y = np.mgrid[-1:1:100j, -1:1:100j]
Z_vals = [ -0.5, 0, 0.9 ]
num_subplots = len(Z_vals)
fig = plt.figure(figsize=(10,4))
for i,z in enumerate(Z_vals) :
ax = fig.add_subplot(1 , num_subplots , i+1, projection='3d', axisbg='gray')
ax.contour(X, Y, V(X,Y,z) ,cmap=cm.gnuplot)
ax.set_title('z = %.2f'%z,fontsize=30)
fig.savefig('contours.png', facecolor='grey', edgecolor='none')
Вы можете использовать вместо contourf
, чтобы показать поверхности, что выглядит лучше, на мой взгляд.
Немного разработки (которая, вероятно, выходит за рамки переполнения стека, но может помочь объяснить предыдущий код):
Как вы знаете, не существует прямой способ визуализировать функцию из 3 переменных, поскольку это объект (поверхность), который живет в 4 измерениях. Вместо этого нужно играть с кусочками функции, чтобы увидеть, что происходит. На срезе я имею в виду проекцию функции на более низкое пространственное пространство. Срез достигается путем установки одной или нескольких переменных функции в качестве константы.
Я не уверен, что у python есть прямой инструмент для этого, но вы можете выбрать несколько значений, например, z, и сделать отдельный график контура для каждого значения, предоставляя вам изображение общей функции. См. Эту ссылку для некоторых идей: http://mathematica.stackexchange.com/questions/25277/visualize-plot-of-a-function-of-3-variables-using-color-and-contours – dermen
Можете ли вы уточнить о том, что вы подразумеваете под «сюжетными линиями»? Если это функция из трех переменных, вам понадобится четвертый, чтобы показать x, y, z и V (x, y, z). , , –
Я думаю, что построение четырехмерных данных (три аргумента и потенциала) в трехмерном пространстве не сработает. В корне. Нет способа уменьшить размерность проблемы, например. используя теорему Букингема-Пи, т. е. неизмеримые некоторые переменные? Если «нет» и «X, Y, Z» - это всего лишь ложные аргументы, а не декартовы компоненты, вам, вероятно, придется прибегать к нескольким сериям (упомянутым дерменем), видео, разбросам участков с различными размерами, цветному кодированию или проецированию на 'X, Y, Z', поэтому построим« V (X, Y) »,« V (Y, Z) »и« V (X, Z) »отдельно. –