Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер
Всем привет, меня зовут Питер~
В этой статье основное внимание уделяется тому, как использовать plotly для рисования 3D-графики.
Трехмерная графика обычно содержит три оси: x, y и z. При рисовании в Plotly, когда мы устанавливаем макет, мы обычно устанавливаем параметр, называемый сцена, Этот параметр содержит настройки трех разных осей, таких как x, y и z, например, диапазон и имя оси. , цвет , и т.д. В то же время будут представлены различные типы 3D-графики, такие как: 3D-диаграмма рассеяния, 3D-план этажа и т. д.
Краткий обзор
Во-первых, давайте взглянем на несколько 3D-графиков, реализованных Plotly.ты веришь, что они одинаковы?
Сюжетная сериализация
Все статьи, которые в настоящее время сериализуются Plotly, следующие:
импортировать библиотеку, данные
Многие графики в этой статье основаны на наборе данных iris, поэтому давайте сначала импортируем библиотеку и набор данных:
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
Трехмерные планы этажей с учетом рельефа местности
Используемые данные следующие:
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 пузырьковая диаграмма
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 Изменение количества изоповерхностей
Функция mgrid из numpy используется в следующем случае:
- Функция np.mgrid возвращает многомерные структуры, такие как 2D-графика и 3D-графика.
- По сравнению с np.meshgrid он быстрее обрабатывает большие данные и может обрабатывать многомерные данные (np.meshgrid может обрабатывать только 2 измерения).
- ret = np.mgrid[1-е измерение, 2-е измерение, 3-е измерение, …]: возвращает несколько значений, возвращаемых как несколько матриц,
- Первое возвращаемое значение — это распределение данных первого измерения в окончательной структуре, второе возвращаемое значение — это распределение данных второго измерения в окончательной структуре и так далее.
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()