簡體   English   中英

Python Plotly:如何將圖像添加到 3D 散點圖

[英]Python Plotly: How to add an image to a 3D scatter plot

我試圖在 z 軸是時間的 3D 散點圖中可視化多個 2d 軌跡 (x, y)。

import numpy as np
import pandas as pd
import plotly.express as px

# Sample data: 3 trajectories
t = np.linspace(0, 10, 200)
df = pd.concat([pd.DataFrame({'x': 900 * (1 + np.cos(t + 5 * i)), 'y': 400 * (1 + np.sin(t)), 't': t, 'id': f'id000{i}'}) for i in [0, 1, 2]])
# 3d scatter plot
fig = px.scatter_3d(df, x='x', y='y', z='t', color='id', )
fig.update_traces(marker=dict(size=2))
fig.show()

原始 3D 散點圖

我有一個大小為 2000x1000 的地圖的 .png 文件。 軌跡的 (x, y) 坐標對應於地圖的像素位置。
我想在 3d 散點圖的“地板”上看到地圖的圖像。

我嘗試使用以下代碼添加圖像:

from scipy import misc

img = misc.imread('images/map_bg.png')
fig2 = px.imshow(img)
fig.add_trace(fig2.data[0])
fig.show()

但結果是在背景中有一個獨立的圖像作為一個單獨的圖: 結果不好

如果我旋轉/縮放,我想要散點圖的“地板”上的圖像並隨着散點圖移動。 這是一個模擬: 在此處輸入圖片說明

附加說明:可以有任意數量的軌跡,對於我的應用程序,重要的是每個軌跡都用不同的顏色自動繪制。 我正在使用plotly.express ,但我可以使用其他 plotly 包,只要滿足這些要求。

我遇到了同樣的情況,我想在 3D 散點圖中使用圖像作為底面。 此處此處的兩篇文章的幫助下,我已經能夠創建以下 3d 散點圖:

在此處輸入圖片說明

我在我的例子中使用了 plotly go,所以結果與來自 OP 的代碼有點不同。

import numpy as np
import pandas as pd
from PIL import Image
import plotly.graph_objects as go
from scipy import misc

im = misc.face()
im_x, im_y, im_layers = im.shape
eight_bit_img = Image.fromarray(im).convert('P', palette='WEB', dither=None)
dum_img = Image.fromarray(np.ones((3,3,3), dtype='uint8')).convert('P', palette='WEB')
idx_to_color = np.array(dum_img.getpalette()).reshape((-1, 3))
colorscale=[[i/255.0, "rgb({}, {}, {})".format(*rgb)] for i, rgb in enumerate(idx_to_color)]

# Sample data: 3 trajectories
t = np.linspace(0, 10, 200)
df = pd.concat([pd.DataFrame({'x': 400 * (1 + np.cos(t + 5 * i)), 'y': 400 * (1 + np.sin(t)), 't': t, 'id': f'id000{i}'}) for i in [0, 1, 2]])
# im = im.swapaxes(0, 1)[:, ::-1]
colors=df['t'].to_list()

# # 3d scatter plot
x = np.linspace(0,im_x, im_x)
y = np.linspace(0, im_y, im_y)
z = np.zeros(im.shape[:2])
fig = go.Figure()

fig.add_trace(go.Scatter3d(
    x=df['x'], 
    y=df['y'], 
    z=df['t'],
    marker=dict(
        color=colors,
        size=4,
    )
    ))

fig.add_trace(go.Surface(x=x, y=y, z=z,
    surfacecolor=eight_bit_img, 
    cmin=0, 
    cmax=255,
    colorscale=colorscale,
    showscale=False,
    lighting_diffuse=1,
    lighting_ambient=1,
    lighting_fresnel=1,
    lighting_roughness=1,
    lighting_specular=0.5,

))

fig.update_layout(
    title="My 3D scatter plot",
    width=800,
    height=800,
    scene=dict(xaxis_visible=True,
                yaxis_visible=True, 
                zaxis_visible=True, 
                xaxis_title="X",
                yaxis_title="Y",
                zaxis_title="Z" ,

    ))


fig.show()


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM