Плотно - разноцветные поверхности - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь нарисовать несколько поверхностей, каждый разного цвета, в Plotly для Python.

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

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

Вот базовый пример с игрушечными данными.

import matplotlib.pyplot as plt
import numpy as np
import plotly.graph_objs as go
import plotly.offline as off

off.init_notebook_mode()

make_int = np.vectorize(int)
cmap = plt.get_cmap("tab10")

saddle = np.array([[x**2-y**2 for x in np.arange(-10,11)] for y in np.arange(-10,11)])
paraboloid = np.array([[x**2 + y**2-100 for x in np.arange(-10,11)] for y in np.arange(-10,11)])

mycolors_a = make_int(256*np.array(cmap(1)[0:3])).reshape((1, 1,-1)).repeat(21, axis = 0).repeat(21, axis =1)
mycolors_b = make_int(256*np.array(cmap(2)[0:3])).reshape((1, 1,-1)).repeat(21, axis = 0).repeat(21, axis =1)
trace_a = go.Surface(z = saddle, surfacecolor = mycolors_a, opacity = .7, showscale = False, name = "Trace A")
trace_b = go.Surface(z = paraboloid, surfacecolor = mycolors_b, opacity = .7, showscale = False, name = "Trace B")

data = [trace_a, trace_b]
off.iplot(data)

Производит следующее:

Output Sample

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

1 Ответ

0 голосов
/ 01 января 2019

Документация здесь немного загадочна.

surfacecolor

(список, числовой массив или ряд чисел, строк или дат и чисел Панд).)

Устанавливает значения цвета поверхности, используемые для установки цветовой шкалы, независимой от z.

Мне никогда не удавалось поместить список строк, то есть значений цвета, таких как 'rgb(0.3, 0.5, 0) 'или RGB-кортежей в нем.

Но вы можете определить собственную цветовую шкалу с необходимыми цветами.

colorscale = [[0, 'rgb' + str(cmap(1)[0:3])], 
              [1, 'rgb' + str(cmap(2)[0:3])]]

, а затем предоставить числовой массив сте же размеры, что и ваши значения на графике.

colors_saddle = np.zeros(shape=saddle.shape)    

Все значения установлены на 0 и, следовательно, будут соответствовать первому цвету в вашем colorscale.То же самое для следующего цвета.

Кроме того, вам необходимо установить cmax и cmin вручную.

Полный код

import numpy as np
import matplotlib.pyplot as plt
import plotly.graph_objs as go
import plotly.offline as off


off.init_notebook_mode()

make_int = np.vectorize(int)
cmap = plt.get_cmap("tab10")

saddle = np.array([[x**2-y**2 for x in np.arange(-10,11)] for y in np.arange(-10,11)])
paraboloid = np.array([[x**2 + y**2-100 for x in np.arange(-10,11)] for y in np.arange(-10,11)])

colors_saddle = np.zeros(shape=saddle.shape)    
colors_paraboloid = np.ones(shape=paraboloid.shape)    

colorscale = [[0, 'rgb' + str(cmap(1)[0:3])], 
              [1, 'rgb' + str(cmap(2)[0:3])]]

trace_a = go.Surface(z=saddle, 
                     surfacecolor=colors_saddle, 
                     opacity=.7, 
                     name="Trace A",
                     cmin=0,
                     cmax=1,
                     colorscale=colorscale)
trace_b = go.Surface(z=paraboloid, 
                     surfacecolor=colors_paraboloid, 
                     opacity=.7, 
                     name="Trace B", 
                     cmin=0,
                     cmax=1,
                     showscale=False,
                     colorscale=colorscale)

data = [trace_a, trace_b]
off.iplot(data)

enter image description here

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