我正在尝试使用 Plotly 中的 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