有没有办法在 Plotly 中为 3d 锥形图制作对数颜色条?

问题描述 投票:0回答:0

我正在尝试使用 Plotly 中的 3d 锥形图可视化矢量场。为此,我需要一个对数颜色条。如果没有巧妙的解决方法,这似乎是不可能的。

这就是我的 3d 图目前的样子:

我一直在寻找解决方法,但我只找到了热图的解决方案,例如这些示例:

https://stackoverflow.com/questions/50392372/logarithmic-color-scale-in-plotly

https://github.com/plotly/documentation/issues/1611

对于热图,可以只将对数应用于 z 数据,然后使用颜色条的自定义刻度标签绘制它。

据我所知,没有办法让 plotly 使用向量范数的对数作为 3d 锥形图的颜色条的参考。

如果有人感兴趣,这是我正在使用的代码

import numpy as np
import plotly.graph_objects as go
from emknot import *

x = np.linspace(-3, 3, 7)
y = np.linspace(-3, 3, 7)
z = np.linspace(-3, 3, 7)


cones = []

for i in x:
    for j in y:
        for k in z: 
            print(i)
            u = [globule([i, j, k], k=1)[0]]
            v = [globule([i, j, k], k=1)[1]]
            w = [globule([i, j, k], k=1)[2]]

            cones.append(go.Cone(
            x=[i],
            y=[j],
            z=[k],
            u=u,
            v=v,
            w=w,
            cmin=0,
            cmax=1.5,
            colorbar=dict(tick0= 0, tickmode= 'array', tickvals= [0, 1e-3, 1e-2, 1e-1,1]),
            colorscale=[[0,'rgba(255,255,255, 0.4)'],[1,'rgba(0,0,255, 1)']],
            sizemode="absolute",
            sizeref=0.6,
            anchor="center")) 


camera = dict(
    up=dict(x=0, y=0, z=1),
    center=dict(x=0, y=0, z=0),
    eye=dict(x=1.3, y=1.0, z=0.8)
)

layout = go.Layout(title='EM-globule')
fig = go.Figure(data=cones, layout=layout)

fig.update_layout(scene_camera=camera)
fig.write_image("images/fig1.svg")
fig.show()

如果有人想复制我的图像,你需要我的 emknot-code:

import numpy as np
from scipy.special import jv
from scipy.integrate import quad

def phi(x):
    return np.arctan2(x[1], x[0])

def rho(x):
    return np.sqrt(x[0] ** 2 + x[1] ** 2)

def f(x, k):
    result = quad(lambda t: np.sin(t) * np.cos(k * x[2] * np.cos(t)) * jv(1, k * rho(x) * np.sin(t)), 0, np.pi)    
    return result[0]

def g(x,k):
    result = quad(lambda t: np.sin(t) * np.cos(t) * np.sin(k * x[2] * np.cos(t)) * jv(1, k * rho(x) * np.sin(t)), 0, np.pi)
    result = (-1) * result[0]
    return result

def h(x,k):
    result = quad(lambda t: np.sin(t) ** 2 * np.cos(k * x[2] * np.cos(t)) * jv(0, k * rho(x) * np.sin(t)), 0, np.pi)
    result = (-1) * result[0]
    return result

def ring(x, k=2*np.pi, b0=1):
    return [-b0 * f(x,k) * np.sin(phi(x)), b0 * f(x,k) * np.cos(phi(x)), 0] 

def globule(x, k=2*np.pi, b0=1):
    e_rho = np.array([np.cos(phi(x)), np.sin(phi(x)),0])
    e_z = np.array([0,0,1])
    result = b0 * g(x, k) * e_rho + h(x, k) * e_z

    return result
python 3d plotly
© www.soinside.com 2019 - 2024. All rights reserved.