Skip to content

Latest commit

 

History

History
138 lines (111 loc) · 3.53 KB

streamtube-plot.md

File metadata and controls

138 lines (111 loc) · 3.53 KB
jupyter
jupytext kernelspec language_info plotly
notebook_metadata_filter text_representation
all
extension format_name format_version jupytext_version
.md
markdown
1.1
1.2.3
display_name language name
Python 3
python
python3
codemirror_mode file_extension mimetype name nbconvert_exporter pygments_lexer version
name version
ipython
3
.py
text/x-python
python
python
ipython3
3.7.3
description display_as has_thumbnail ipynb language layout name order page_type permalink thumbnail title
How to make 3D streamtube plots in Python with Plotly.
3d_charts
true
~notebook_demo/207
python
user-guide
3D Streamtube Plots
21
u-guide
python/streamtube-plot/
thumbnail/streamtube.jpg
3D Streamtube Plots | Plotly

Introduction

In streamtube plots, attributes include x, y, and z, which set the coordinates of the vector field, and u, v, and w, which set the x, y, and z components of the vector field. Additionally, you can use starts to determine the streamtube's starting position.

Basic Streamtube Plot

import plotly.graph_objects as go

fig = go.Figure(data=go.Streamtube(x=[0, 0, 0], y=[0, 1, 2], z=[0, 0, 0], 
                                   u=[0, 0, 0], v=[1, 1, 1], w=[0, 0, 0]))
fig.show()

Starting Position and Segments

By default, streamlines are initialized in the x-z plane of minimal y value. You can change this behaviour by providing directly the starting points of streamtubes.

import plotly.graph_objects as go

import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/streamtube-wind.csv').drop(['Unnamed: 0'],axis=1)

fig = go.Figure(data=go.Streamtube(
    x = df['x'],
    y = df['y'],
    z = df['z'],
    u = df['u'],
    v = df['v'],
    w = df['w'],
    starts = dict(
        x = [80] * 16,
        y = [20,30,40,50] * 4,
        z = [0,0,0,0,5,5,5,5,10,10,10,10,15,15,15,15]
    ),
    sizeref = 0.3,
    colorscale = 'Portland',
    showscale = False,
    maxdisplayed = 3000
))

fig.update_layout(
    scene = dict(
        aspectratio = dict(
            x = 2,
            y = 1,
            z = 0.3
        )
    ),
    margin = dict(
        t = 20,
        b = 20,
        l = 20,
        r = 20
    )
)

fig.show()

Tube color and diameter

The color of tubes is determined by their local norm, and the diameter of the field by the local divergence of the vector field.

In all cases below the norm is proportional to z**2 but the direction of the vector is different, resulting in a different divergence field.

import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np

x, y, z = np.mgrid[0:10, 0:10, 0:10] 
x = x.T.flatten() 
y = y.T.flatten()
z = z.T.flatten()

u = np.zeros_like(x)
v = np.zeros_like(y)
w = z**2

fig = make_subplots(rows=1, cols=3, specs=[[{'is_3d': True}, {'is_3d': True}, {'is_3d':True}]])

fig.add_trace(go.Streamtube(x=x, y=y, z=z, u=u, v=v, w=w), 1, 1)
fig.add_trace(go.Streamtube(x=x, y=y, z=z, u=w, v=v, w=u), 1, 2)
fig.add_trace(go.Streamtube(x=x, y=y, z=z, u=u, v=w, w=v), 1, 3)

fig.update_layout(scene_camera_eye=dict(x=2, y=2, z=2),
                  scene2_camera_eye=dict(x=2, y=2, z=2),
                  scene3_camera_eye=dict(x=2, y=2, z=2))
fig.show()

Reference

See https://plot.ly/python/reference/ for more information and chart attribute options!