Nano Hash - криптовалюты, майнинг, программирование

Создание поверхности революции

У меня есть 3D-график диска, вот код:

ri = 100
ra = 300
h=20

# input xy coordinates
xy = np.array([[ri,0],[ra,0],[ra,h],[ri,h],[ri,0]])
# radial component is x values of input
r = xy[:,0]
# angular component is one revolution of 30 steps
phi = np.linspace(0, 2*np.pi, 50)
# create grid
R,Phi = np.meshgrid(r,phi)
# transform to cartesian coordinates
X = R*np.cos(Phi)
Y = R*np.sin(Phi)
# Z values are y values, repeated 30 times
Z = np.tile(xy[:,1],len(Y)).reshape(Y.shape)


fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')

ax.set_zlim(0,200)
ax.plot_surface(X, Y, Z, alpha=0.5, color='grey', rstride=1, cstride=1)

Я получаю этот хороший сюжет: введите здесь описание изображения

Далее у меня есть этот сюжет: введите здесь описание изображения

Код:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

arr = np.array([[100, 15],
               [114.28, 17],
               [128.57, 18],
               [142.85, 19],
               [157.13, 22],
               [171.13, 24],
               [185.69, 25],
               [199.97, 27],
               [214.25, 28],
               [228.53, 30],
               [242.81, 31],
               [257.09, 35],
               [271.37, 36],
               [288.65, 37],
               [300, 38]])

#interpolating between the single values of the arrays
new_x = np.concatenate([np.linspace(arr[i,0],arr[i+1,0], num=50)
                        for i in range(len(arr)-1)])

new_y = np.interp(new_x, arr[:,0], arr[:,1])
t=np.arange(700)
p = plt.scatter(new_x,new_y,c=t, cmap="jet")

#inserting colorbar
cax, _ = mpl.colorbar.make_axes(plt.gca(), shrink=0.8)
cbar = mpl.colorbar.ColorbarBase(cax, cmap='jet', label='testvalues',
                       norm=mpl.colors.Normalize(15, 40))
plt.show()

Теперь мой вопрос: есть ли способ построить этот 2D-график в моей 3D-среде? Кроме того, можно ли создать поверхность из этой линии (точек), вращая их вокруг средней точки? Я попробовал это так же, как и с моим диском, но у меня не получилось, потому что я думаю, что мне нужен замкнутый контур? Вот картинка, чтобы лучше понять, что я хочу:

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


Ответы:


1

Я не уверен, как вы хотите включить свой 2D-график, так что вот как вы делаете это как поверхность вращения.

Ваш new_x соответствует радиальному расстоянию, new_y соответствует высоте. Итак, нам нужно сгенерировать массив углов, для которых сгенерировать «конус»:

from matplotlib import cm

tmp_phi = np.linspace(0,2*np.pi,50)[:,None] # angle data
linesurf_x = new_x*np.cos(tmp_phi)
linesurf_y = new_x*np.sin(tmp_phi)
linesurf_z = np.broadcast_to(new_y, linesurf_x.shape)

linesurf_c = np.broadcast_to(t, linesurf_x.shape) # color according to t
colors = cm.jet(linesurf_c/linesurf_c.max()) # grab actual colors for the surface
ax.plot_surface(linesurf_x, linesurf_y, linesurf_z, facecolors=colors,
                rstride=1, cstride=1)

Результат:

картинка

11.08.2018
  • @ albo22 Я рад, что смог помочь. Касательно вашей проблемы здесь, но рассмотрите возможность использования единой для восприятия цветовой карты, такой как viridis. Подробное объяснение проблемы см. здесь :) 11.08.2018
  • Я не могу заставить его работать, я получаю сообщение об ошибке: AttributeError: объект «NoneType» не имеет атрибута «sqrt». Вы знаете, в чем проблема? 11.08.2018
  • @ albo22 albo22 в приведенном выше нет sqrt, даже если я думаю о базовых методах. У вас есть sqrt в вашем (не показанном) коде? 11.08.2018
  • На самом деле у меня нет sqrt в моем коде. Я просто скопировал второй код (с моей цветной линией) в свой первый код (сюжет 3D-диска) и в конце добавил ваш код. Я думаю, что с импортом что-то пошло не так, потому что перед сообщением об ошибке есть пара сообщений, которые выглядят так: Файл C:\Users\xxx\Anaconda3\lib\site-packages\matplotlib\collections.py, строка 902, в Масштаб set_sizes = np.sqrt(self._sizes) * dpi / 72,0 * self._factor 11.08.2018
  • @ albo22 действительно, если эта ошибка появится там, это будет означать, что np is None. Что было бы до смешного странно. К сожалению, я не понимаю, откуда может возникнуть эта проблема, если вы просто поместите мой блок кода после своего первого с соответствующим импортом... 11.08.2018
  • Хорошо, я начал работать, это была простая опечатка... К сожалению, это не совсем то, что я себе представлял. Есть ли способ немного лучше выделить контур функции, потому что на 2D-графиках вы видите больше углов? Я полагаю, было бы более заметно, если бы вы немного масштабировали весь контур, потому что он немного сглажен? Есть ли возможность увеличить производительность без большой потери качества, ибо она и так достаточно лагает при поворотах и ​​создании сюжета. Можно ли также удалить черные линии (которые также можно увидеть на вашем графике)? 11.08.2018
  • @ albo22 Я пытался скрыть строки, установив edgecolor='none', но это не помогло. Возможно, linewidth=0 поможет, но я не уверен. Также может быть шанс, что экспорт рисунка в pdf будет выглядеть иначе, я не уверен. Для производительности: можно уменьшить количество точек, используемых в сетке: теперь 50 угловых точек (не так много) и 700 радиальных точек (много). Установка соответствующего rstride/cstride большего числа должна уменьшить последнее, найти значение, которое выглядит похоже, но имеет меньше аспектов. Что касается масштаба: вы можете умножить linesurf_z, чтобы сделать конус выше. 11.08.2018
  • Благодаря вашим советам, я сделал это сейчас относительно хорошо выгляжу. Мне все еще нужна цветная полоса. Если я добавлю цветную полосу, как я делал раньше, то теперь появляется ошибка: AttributeError: объект «функция» не имеет атрибута «make_axes». У вас есть идея? 11.08.2018
  • @ albo22 вы, вероятно, используете plt.colorbar, а не mpl.colorbar. Однако у меня нет опыта добавления таких цветных полос. 11.08.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..