可视化神器plotly绘制3d图(代码片段)

尤尔小屋的猫 尤尔小屋的猫     2022-12-28     515

关键词:

公众号:尤而小屋
作者:Peter
编辑:Peter

大家好,我是Peter~

本文中重点介绍的是如何利用plotly来绘制3D图形。

在3D图形中一般是包含3个轴的:x、y、z。在Plotly中绘图的时候,我们对layout布局进行设置的时候,通常是对一个叫做scene的参数进行设置,在这个参数就是包含x、y、z3个不同轴的设置,比如轴的范围、名称、颜色等。同时还会介绍不同类型的3D图形,比如:3D散点图、3D平面图等

先睹为快

首先我们看看几个由Plotly实现的3D图形,你相信它们其实是同一个吗

Plotly连载

Plotly目前连载的全部文章如下:

导入库、数据

本文中的很多图形都是基于鸢尾花数据集来绘制的,所以我们先导入库和数据集:

import pandas as pd
import numpy as np

import plotly.express as px
import plotly.graph_objects as go

3D Scatter(3D散点图):基于plotly_express

基本3D图形

最简单的3D图形,通过使用px.scatter_3d来绘制:

fig = px.scatter_3d(
  iris,
  x="sepal_length",
  y="sepal_width",
  z="petal_width",
  color="species"
)

fig.show()

设置散点不同的形状和大小;

# 还可以给每个散点加上不同的markder标记

fig = px.scatter_3d(
  iris,
  x="sepal_length",
  y="sepal_width",
  z="petal_length",
  color="petal_width",
  symbol="species"
)

fig.show()

# 设置散点大小

fig = px.scatter_3d(
  iris,
  x="sepal_length",
  y="sepal_width",
  z="petal_width",
  color="petal_length",
  size="petal_length",
  size_max=18,  # 散点最大值
  opacity=0.7,  # 透明度
  symbol="species"
)
fig.update_layout(margin=dict(l=0,r=0,b=0,t=0))

fig.show()

3D Scatter:基于go.Scatter3dME

基础3D图形

import plotly.graph_objects as go
import numpy as np

# 模拟数据
t = np.linspace(0, 10, 50)
x, y, z = np.cos(t), np.sin(t), t

fig = go.Figure(data=[go.Scatter3d(
    x=x,  # 设置3个不同的坐标数据
    y=y, 
    z=z,
    mode='markers')])  # 'lines', 'markers', 'text'  3种情况的组合

fig.show()

改变散点的颜色:

import plotly.graph_objects as go
import numpy as np

N = 88
t = np.linspace(0, 20, N)
x, y, z = np.cos(t), np.sin(t), t

fig = go.Figure(data=[go.Scatter3d(
    x=x,
    y=y,
    z=z,
    mode='markers',
    marker=dict(  # 对标记的设置
        size=10,
        color=z,  # 颜色设置
        colorscale='Viridis',   # 选择颜色
        opacity=0.86  # 透明度
    )
)])

# 图形的边际范围设置
fig.update_layout(margin=dict(l=4, r=4, b=0, t=0))
fig.show()

3D平面图:go.Surface实现

基于地形的3D平面图

使用的数据如下:

import plotly.graph_objects as go

import pandas as pd

# 读取在线的csv文件

z_data = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/api_docs/mt_bruno_elevation.csv',
                     index_col=0)  # index_col参数表示将第一列的数据当做索引
z_data.head()

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

fig.update_layout(title="3D Surface图形绘制", # 标题
                  autosize=False,  # 尺度自动缩放
                  width=700,  # 长宽
                  height=600,
                  margin=dict(l=65,r=50,b=65,t=90)  # 4个位置的距离
                 )

fig.show()

带有轮廓线的3D图形

# 数据同上

# 1、先生成画布
fig = go.Figure(data=[go.Surface(z=z_data.values)])

fig.update_traces(contours_z=dict(  # 轮廓设置
    show=True,  # 开启是否显示
    usecolormap=True,  # 颜色设置
    highlightcolor="mistyrose",  # 高亮
    project_z=True))

fig.update_layout(
    title='带有轮廓的3D平面图',
    autosize=False,
    scene_camera_eye=dict(x=1.87, y=0.88, z=-0.64),
    width=600, 
    height=500,
    margin=dict(l=65, r=50, b=65, t=90)
)

fig.show()

多个3D图形

在一个画布中国绘制多个图形:

z1 = np.array([  # numpy数组形式
    [8.83,8.89,8.81,8.87,8.9,8.87],
    [8.89,8.94,8.85,8.94,8.96,8.92],
    [8.84,8.9,8.82,8.92,8.93,8.91],
    [8.79,8.85,8.79,8.9,8.94,8.92],
    [8.79,8.88,8.81,8.9,8.95,8.92],
    [8.8,8.82,8.78,8.91,8.94,8.92],
    [8.75,8.78,8.77,8.91,8.95,8.92],
    [8.8,8.8,8.77,8.91,8.95,8.94],
    [8.74,8.81,8.76,8.93,8.98,8.99]
])

z2 = z1 + 5
z3 = z1 - 5

fig = go.Figure(data=[
    go.Surface(z=z1),
    go.Surface(z=z2, showscale=False, opacity=0.9),
    go.Surface(z=z3, showscale=False, opacity=0.9)

])

fig.show()

6 3D气泡图:3D Bubble

6.1 基于Plotly_Express实现

data = px.data.gapminder()  # gdp数据集

fig = px.scatter_3d(data,  # 传入数据
                    x='year',  # 选择3个坐标
                    y='continent', 
                    z='pop', 
                    size='gdpPercap',  # 气泡大小
                    color='lifeExp',  # 颜色
                    hover_data=['country'])  # 悬停数据

# 如果数据过大,可以使用对数来表示
fig.update_layout(scene_zaxis_type="log")  # z轴取对数

fig.show()

6.2 基于go.Scatter3d实现

数据部分:

start, end = 800,1200  # 选择开始和结束索引,用于筛选数据

fig = go.Figure(data=go.Scatter3d(
    x=df1['year'][start:end],  # 通过设置的数值,切片方式取出部分数据
    y=df1['continent'][start:end],
    z=df1['pop'][start:end],
    text=df1['country'][start:end], # 文本显示的数据
    mode='markers',  # 气泡的显示形式:标记marker
    marker=dict(   
        sizemode = 'diameter',  # 大小的形式:'diameter', 'area'
        sizeref = 1500,
        size = df1['gdpPercap'][start:end],
        color = df1['lifeExp'][start:end],
        colorscale = 'Viridis',
        line_color='rgb(140, 140, 170)'
    )
))


fig.update_layout(height=800, 
                  width=800,
                  title='3D气泡图绘制')

fig.show()

7 3D等值曲面图(Isosurface)

使用go.Isosurface来绘制

7.1 基础3D等值

import plotly.graph_objects as go

fig= go.Figure(data=go.Isosurface(
    x=[0,0,0,0,1,1,1,1],  # 设置3个坐标
    y=[1,0,1,0,1,0,1,0],
    z=[1,1,0,0,1,1,0,0],
    
    value=[1,2,3,4,5,6,7,8],  # 设置取值
    
    isomin=2,  # 颜色取值范围
    isomax=7,
))

fig.show()

7.2 改变等值曲面的个数

在下面的案例中使用了numpy中的一个函数mgrid:

  • np.mgrid函数返回多维结构,常见的如2D图形,3D图形。
  • 对比np.meshgrid,在处理大数据时速度更快,且能处理多维(np.meshgrid只能处理2维)
  • ret = np.mgrid[ 第1维,第2维 ,第3维 , …] :返回多值,以多个矩阵的形式返回,
  • 第1返回值为第1维数据在最终结构中的分布,第2返回值为第2维数据在最终结构中的分布,以此类推。

import plotly.graph_objects as go
import numpy as np

# 通过numpy的mgrid函数来生成3个数据
X, Y, Z = np.mgrid[-5:5:40j, -5:5:40j, -5:5:40j]

# 取值
values = X * X * 0.5 + Y * Y + Z * Z * 2

fig = go.Figure(data=go.Isosurface(
    x=X.flatten(),
    y=Y.flatten(),
    z=Z.flatten(),
    value=values.flatten(),
    isomin=10,
    isomax=50,
    surface_count=5, 
    colorbar_nticks=5, 
    caps=dict(x_show=False, y_show=False)
    ))

fig.show()

改变颜色和透明度

import plotly.graph_objects as go
import numpy as np

# 通过numpy的mgrid函数来生成3个数据
X, Y, Z = np.mgrid[-5:5:40j, -5:5:40j, -5:5:40j]

# 取值
values = X * X * 0.5 + Y * Y + Z * Z * 2

fig = go.Figure(data=go.Isosurface(
    x=X.flatten(),
    y=Y.flatten(),
    z=Z.flatten(),
    value=values.flatten(),
    opacity=0.6,  # 改变图形的透明度
    colorscale='plotly3',  # 改变颜色
    isomin=10,
    isomax=50,
    surface_count=5, 
    colorbar_nticks=5, 
    caps=dict(x_show=False, y_show=False)
    ))

fig.show()

高级等值曲面图

# 生成3个numpy数组
X, Y, Z = np.mgrid[-5:5:40j, -5:5:40j, -5:5:40j]

# 具体值
values = X * X * 0.5 + Y * Y + Z * Z * 2

fig = go.Figure(data=go.Isosurface(
    x=X.flatten(),  # 3个坐标
    y=Y.flatten(),
    z=Z.flatten(),
    value=values.flatten(),  # 数据值
    isomin=5,  # 值的范围
    isomax=50,
    surface_fill=0.7, # 表面填充色度
    caps=dict(x_show=False, y_show=False),
    slices_z=dict(show=True, locations=[-1, -9,-5]),
    slices_y=dict(show=True, locations=[1,8]),
    ))

fig.show()

X, Y, Z = np.mgrid[-5:5:40j, -5:5:40j, 0:5:20j]

values = X * X * 0.5 + Y * Y + Z * Z * 2

fig = go.Figure(data=go.Isosurface(
    x=X.flatten(),  # 3个坐标轴和取值
    y=Y.flatten(),
    z=Z.flatten(),
    value=values.flatten(),
    isomin=30,  #  等曲面的取值大小
    isomax=50,
    surface=dict(count=3, fill=0.7, pattern='odd'),  # pattern取值:'all', 'odd', 'even'
    caps=dict(x_show=True, y_show=True),
    ))

fig.show()

可视化神器plotly绘制树状图(代码片段)

大家好,我是Peter~今天给大家带来的是一篇关于Plotly绘图的文章:如何使用Plotly来绘制矩形树状图Plotly文章目前Plotly的文章更新到第17篇,推荐几篇文章:闲聊为什么Peter一直坚持写Plotly的文章?国庆节前有位... 查看详情

可视化神器plotly绘制热力图(代码片段)

公众号:尤而小屋作者:Peter编辑:Peter大家好,我是Peter~之前更新了很多关于Plotly绘图的文章。今天带来的文章是基于官网和实际案例来讲解如何绘制不同需求下的热力图。Plotly中绘制热力图有3种方式:heatma... 查看详情

再见matplotlib,可视化神器plotly绘制图表的太酷炫了(代码片段)

数据分析离不开数据可视化。我们最常用的就是pandas,matplotlib,pyecharts当然还有Tableau,最近看到一篇文章介绍plotly制图后,我感觉写的不够简洁明了。今天就给大家分享利用可视化神器Plotly绘制酷炫图表,欢... 查看详情

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

...发布时间】:2021-09-0700:29:26【问题描述】:为了研究数据可视化,我想在Plotly中制作一个动画3D曲面图。目标是查看盒子中温度随时间的变化。但我不知道如何制作动画。此时我只有在给定时间我的情节。这是我的代码:importplot... 查看详情

r语言使用plotly绘制3d散点图实战(代码片段)

R语言使用plotly绘制3D散点图实战目录R语言使用plotly绘制3D散点图实战#仿真数据#plotly绘制3D散点图#仿真数据set.seed(41 查看详情

plotly可视化绘制混合图(代码片段)

plotly可视化绘制混合图#混合图多种可视化形式融合在一个图形中;fromplotly.graph_objsimport*importplotlyaspyimportplotly.graph_objsasgopyplt=py.offline.plotimportpandasaspd#readinvolcanodatabasedatadf=pd.read_excel(r\'volcano_db.x 查看详情

plotly可视化绘制多子图(subplots)(代码片段)

plotly可视化绘制多子图(subplots)#多子图;fromplotlyimporttoolsimportplotlyaspyimportplotly.graph_objsasgopyplt=py.offline.plottrace1=go.Scatter(x=[1,2,3],y=[4,5,6],mode=\'markers+text+lines\',text=[\'A\',\'B\',\' 查看详情

plotly可视化绘制嵌入式子图(代码片段)

plotly可视化绘制嵌入式子图#嵌入式子图importplotlyaspyimportplotly.graph_objsasgopyplt=py.offline.plottrace1=go.Scatter(x=[1,2,3],y=[4,3,2])trace2=go.Scatter(x=[20,30,40],y=[30,40,50],xaxi 查看详情

plotly可视化绘制共享坐标轴图(代码片段)

plotly可视化绘制共享坐标轴图#plotly绘制共享坐标轴图;importplotlyaspyimportplotly.graph_objsasgopyplt=py.offline.plottrace1=go.Scatter(x=[0,1,2],y=[10,11,12])trace2=go.Scatter(x=[2,3,4],y=[100,110,120],yaxis=\'y2\')trace 查看详情

plotly可视化绘制双子图(subplots)(代码片段)

plotly可视化绘制双子图(subplots)#双子图fromplotlyimporttoolsimportplotlyaspyimportplotly.graph_objsasgopyplt=py.offline.plottrace1=go.Scatter(x=[1,2,3],y=[4,5,6])trace2=go.Scatter(x=[20,30,40],y=[50,60,70],)fig= 查看详情

plotly可视化绘制多子图(subplots)并自定义子图(代码片段)

plotly可视化绘制多子图(subplots)并自定义子图# 多子图(subplots)并自定义子图fromplotlyimporttoolsimportplotlyaspyimportplotly.graph_objsasgopyplt=py.offline.plottrace0=go.Scatter(x=[1,2],y=[1,2])trace1=go.Scatter(x=[1,2] 查看详情

plotly可视化绘制多坐标轴图(代码片段)

plotly可视化绘制多坐标轴图 #绘制多坐标轴图;importplotlyaspyimportplotly.graph_objsasgopyplt=py.offline.plottrace1=go.Scatter(x=[1,2,3],y=[4,5,6],name=\'yaxis1数据\')trace2=go.Scatter(x=[2,3,4],y=[40,50,60],name=\'y 查看详情

可视化神器plotly:子图的绘制(代码片段)

楔子下面我们来进行高级图表的绘制,说是高级图表,其实也不算高级。以下代码在jupyternotebook上运行,先导入以下模块importplotlyaspyimportplotly.graph_objsasgoimportnumpyasnpimportpandasaspdimportdatetime时间序列plotly对时间的支持特别友好,... 查看详情

plotly可视化绘制双坐标轴图(代码片段)

plotly可视化绘制双坐标轴图 #双坐标轴图importplotlyaspyimportplotly.graph_objsasgopyplt=py.offline.plottrace1=go.Scatter(x=[1,2,3],y=[40,50,60],name=\'yaxis数据\')trace2=go.Scatter(x=[2,3,4],y=[4,5,6],name=\'yaxis 查看详情

plotly可视化绘制多子图(subplots)共享坐标轴(代码片段)

plotly可视化绘制多子图(subplots)共享坐标轴#共享坐标轴importplotlyaspyimportplotly.graph_objsasgopyplt=py.offline.plottrace1=go.Scatter(x=[1,2,3],y=[2,3,4])trace2=go.Scatter(x=[20,30,40],y=[5,5,5],xaxis=\'x2\',yaxis=\'y 查看详情

plotly可视化绘制多子图(subplots)并自定义坐标轴(代码片段)

plotly可视化绘制多子图(subplots)并自定义坐标轴#多子图并自定义坐标轴fromplotlyimporttoolsimportplotlyaspyimportplotly.graph_objsasgopyplt=py.offline.plottrace1=go.Scatter(x=[1,2,3],y=[4,5,6])trace2=go.Scatter(x=[20,30,40],y=[5 查看详情

plotly绘制金融时间序列图实战:配置滑动控件(代码片段)

Plotly绘制金融时间序列图实战:配置滑动控件#可视化金融时间序列数据并设置时间粒度组件;importplotlyaspyimportplotly.graph_objsasgoimportpandasaspd#----------predefpyplt=py.offline.plot#----------codedf=pd.read_csv(r\'day01.csv\',index_col=[0 查看详情

python-matplotlib可视化(10)——一文详解3d统计图的绘制(代码片段)

Python-Matplotlib可视化(10)——一文详解3D统计图的绘制前言3D散点图3D曲线图3D标量场绘制3D曲面在3D坐标轴中绘制2D图形3D柱形图系列链接前言Matplotlib是Python的绘图库,它提供了一整套和matlab相似的命令API,可以生... 查看详情