Как раскрасить точку на точечной диаграмме отдельно? - PullRequest
0 голосов
/ 17 мая 2019

Я бы хотел построить функцию с тремя переменными следующим образом.Сначала я строю равномерно распределенные точки на трехмерной фигуре с помощью точечной диаграммы, затем я хочу использовать метод, чтобы закрасить каждую точку в кубе в соответствии со значением функции.Функция f (x, y, z) = (x ^ 2 + y ^ 2-z ^ 2) ^ 2.

Пока мне удалось равномерно заполнить сюжет маленькими шариками, но раскраскане хочет работать.Я попытался посмотреть, как работать с картой цветов, но результаты были либо самыми простыми, либо слишком жесткими.

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np
import math as mt

fig = plt.figure()
ax = fig.gca(projection='3d')

# Make data.
X = np.linspace(-5, 5, 6)
Y = np.linspace(-5, 5, 6)
Z = np.linspace(-5, 5, 6)
X, Y, Z = np.meshgrid(X, Y, Z)
# Plot the surface.
t = (X**2+Y**2-Z**2)**2
surf = ax.scatter(X, Y, Z, c=t, cmap=cm.viridis)


ax.set_zlim(-5, 5)
ax.zaxis.set_major_locator(LinearLocator(5))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')

# Add a color bar which maps values to colors.
#fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

Я думаю, что я пробовал, ничего не получится, даже если ошибок нет, так как соединениецветов с точкой не обрабатывается.Я думал об использовании сюжета вместо разброса, но опять же я не нашел никакого полезного материала на цветовых картах.

1 Ответ

0 голосов
/ 17 мая 2019

У меня есть три отличия от того, что вы сделали

  1. функция проще, так что мы можем визуально проверить правильность графика рассеяния
  2. Я использовал ax.scatter3D вместо ax.scatter
  3. 3D-матрица со значениями функций должна быть сведена *t.flatten())

а вот код и сюжет

In [31]: from mpl_toolkits.mplot3d import Axes3D 
    ...: import matplotlib.pyplot as plt 
    ...: from matplotlib import cm 
    ...: from matplotlib.ticker import LinearLocator, FormatStrFormatter 
    ...: import numpy as np 
    ...: import math as mt 
    ...:  
    ...: fig = plt.figure() 
    ...: ax = fig.gca(projection='3d') 
    ...:  
    ...: # Make data. 
    ...: X = np.linspace(-5, 5, 6) 
    ...: Y = np.linspace(-5, 5, 6) 
    ...: Z = np.linspace(-5, 5, 6) 
    ...: X, Y, Z = np.meshgrid(X, Y, Z) 
    ...: # Plot the surface. 
    ...: t = Z 
    ...: ax.scatter3D(X, Y, Z, c=t.flatten())        

scatter plot

Обратите внимание, что для демонстрации слоев я повернул вид по умолчанию, а также что Matplotlib рисует точки, используя вид воздушной перспективы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...