You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Plotly 3D锥图添加对数颜色条?

问题:Plotly 3D锥图添加对数颜色条的替代方案

我尝试用Plotly的3D锥图可视化矢量场,需要为其添加对数颜色条,但Plotly没有直接实现该需求的方式,需要寻找替代方案。当前我的3D锥图存在刻度重叠的问题,效果如下:
3D锥图刻度重叠效果

我曾查找过替代方案,但只找到适用于热力图的解决方法——对z数据取对数,再为颜色条设置自定义刻度标签,但该方法无法直接应用在3D锥图上:目前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模块代码

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

未实现的思路

我曾尝试通过ChatGPT寻找方案,它提出了一个可行方向但生成的代码无法直接运行:创建一个以矢量范数的对数为数据的辅助图,将其颜色条作为3D锥图的颜色条,但我尚未完成该方案的实现。

内容的提问来源于stack exchange,提问作者Aceman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:32:11