Plotly - 不同的颜色表面

Jak*_*aas 5 python python-3.x plotly jupyter-notebook

我试图在Plotly for 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)
Run Code Online (Sandbox Code Playgroud)

产生以下内容:

输出样本

我应该看到一个蓝色的马鞍和一个橙色的抛物面,但我没有.请注意,即使我将参数更改为cmap,我也总是得到相同的蓝色.谢谢你的帮助!

Max*_*ers 7

这里的文档有点神秘。

表面颜色

(列表、numpy 数组或 Pandas 系列的数字、字符串或日期时间。)

设置表面颜色值,用于设置独立于 的色标z

我从来没有设法把一个字符串列表,即像'rgb(0.3, 0.5, 0)'这样的颜色值或RGB元组放在里面。

但是您可以使用所需的颜色定义自己的色标。

colorscale = [[0, 'rgb' + str(cmap(1)[0:3])], 
              [1, 'rgb' + str(cmap(2)[0:3])]]
Run Code Online (Sandbox Code Playgroud)

然后提供一个与您绘制的值具有相同维度的数值数组。

colors_saddle = np.zeros(shape=saddle.shape)    
Run Code Online (Sandbox Code Playgroud)

所有值都设置为0,因此将映射到您的colorscale. 下一个颜色也是如此。

另外,你需要设置cmaxcmin手动。

完整代码

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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明