使用 Plotly 绘制动画 3D 曲面图

Posted

技术标签:

【中文标题】使用 Plotly 绘制动画 3D 曲面图【英文标题】:Animated 3D Surface Plots with Plotly 【发布时间】:2021-09-07 00:29:26 【问题描述】:

为了研究数据可视化,我想在 Plotly 中制作一个动画 3D 曲面图。目标是查看盒子中温度随时间的变化。但我不知道如何制作动画。

此时我只有在给定时间我的情节。 这是我的代码:

import plotly
import plotly.graph_objects as go
#import plotly.express as px
import pandas as pd
#import numpy as np

#read CSV
z_data = pd.read_csv('data1.csv')# Read data from a csv

fig = go.Figure(data=[go.Surface(z=z_data.values)])

#projection 2D
fig.update_traces(contours_z=dict(show=True, usecolormap=True,
                                  highlightcolor="tomato", project_z=True),
                                  colorscale='portland')

#fig
fig.update_layout(title='data HEATPILES', autosize=False, width=650, height=500, margin=dict(l=0, r=0, b=0, t=0))

#show
plotly.offline.plot(fig)

data1.csv 只是这样: data1.csv

但是我有更多关于时间点位置的数据,我想制作一个动画图,这样我们就可以清楚地看到时间的演变。

这是给定时间的结果 Plot at a given time

我在 plotly 文档中看到可以使用 px.scatter 和 px.line from here 制作动画,而从 there 我们可以使用 image 来制作动画,所以我想可以使用曲面图。

这里是一些动画示例:https://plotly.com/python/#animations 以下是 3D 曲面图的一些示例:https://plotly.com/python/3d-surface-plots

如果您能帮助我,我将不胜感激! 感谢您的帮助,

神学家

【问题讨论】:

【参考方案1】:

这是给你的完整代码:

import pandas as pd
import plotly.graph_objects as go

z_data = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/api_docs/mt_bruno_elevation.csv').values
print(z_data)
z_data2 = z_data * 1.1
z_data3 = z_data * 1.2
z_data4 = z_data * 0.5

z_data_list = []
z_data_list.append(z_data)
z_data_list.append(z_data2)
z_data_list.append(z_data3)
z_data_list.append(z_data4)
z_data_list.append(z_data)
z_data_list.append(z_data2)
z_data_list.append(z_data3)
z_data_list.append(z_data4)

fig = go.Figure(
    data=[go.Surface(z=z_data_list[0])],
    layout=go.Layout(updatemenus=[dict(type="buttons", buttons=[dict(label="Play", method="animate", args=[None])])]),
    frames=[go.Frame(data=[go.Surface(z=k)], name=str(i)) for i, k in enumerate(z_data_list)]
)

fig.update_traces(contours_z=dict(show=True, usecolormap=True, highlightcolor="tomato", project_z=True), colorscale='portland')

fig.update_layout(title='data HEATPILES', autosize=False, width=650, height=500, margin=dict(l=0, r=0, b=0, t=0))

def frame_args(duration):
    return 
            "frame": "duration": duration,
            "mode": "immediate",
            "fromcurrent": True,
            "transition": "duration": duration, "easing": "linear",
        

sliders = [
            
                "pad": "b": 10, "t": 60,
                "len": 0.9,
                "x": 0.1,
                "y": 0,
                "steps": [
                    
                        "args": [[f.name], frame_args(0)],
                        "label": str(k),
                        "method": "animate",
                    
                    for k, f in enumerate(fig.frames)
                ],
            
        ]
    
fig.update_layout(sliders=sliders)
   
import plotly.io as pio

ii = 1
pio.write_html(fig, file="Live3D_"+str(ii)+".html", auto_open=True)
# plotly.offline.plot(fig)

【讨论】:

谢谢!希望作者采纳答案。 我正在更改 duration 参数以更改转换速度,但没有做任何事情。你怀疑为什么?另外,你是怎么想出那个代码的?我只是问,因为将来我想创建自己的代码。情节文档很难找到/探索。 好的,我会检查的,我不知道您是否需要一个播放按钮或一个可以手动更改值的滑块。我稍微记得,但我很可能混淆并修改了“Simple Play Button”和“Visualizing MRI Volume Slices in Python”示例。看看 -> plotly.com/python/animations plotly.com/python/visualizing-mri-volume-slices 好的。不过,查看动画,我确实看到帧之间的过渡并不平滑。我想知道这是否只是情节的构建方式。我在 matplotlib 中使用动画的经验非常积极,但我更喜欢 plotly 的美学。 完成,如果你想改变播放按钮动画中的帧持续时间你需要修改按钮定义中的“args=[None]” "buttons=[dict(label="Play", method ="animate", args=[None]". "def frame_args(duration):" s duration 参数调整滑块帧持续时间 ""args": [[f.name], frame_args(0)]" 为 0 因为我们在滑块模式下手动更改帧。但是假设您有很多帧并且想要创建一个 gif,即使 gif 也有一个限制,即最小帧持续时间=20ms

以上是关于使用 Plotly 绘制动画 3D 曲面图的主要内容,如果未能解决你的问题,请参考以下文章

在 R 时间内为系列数据绘制 3D 曲面图

r plotly 3d曲面图问题

为啥 plot_ly in plotly 绘制曲面图的 id 列?

R语言使用plotly绘制3D散点图实战

使用 R 绘制带有等高线图叠加的 3D 曲面图

python matplotlib绘制 3D图像专题 (三维柱状图曲面图散点图曲线图合集)