HOWTO · Plotly

如何在 Plotly 中创建 3D 散点图

在 Python 中使用 Plotly Express 的 scatter_3d() 创建 3D 散点图,然后自定义颜色、悬停标签、坐标轴和数据轨迹。

本页内容

使用 Plotly Express 的 scatter_3d(),将数据框中的三列分别映射到交互式 3D 散点图的 x、y、z 维度。下方示例载入 Plotly 内置的 Iris 数据,并按物种为数据点着色;在交互式环境中调用 fig.show(),即可通过已配置的渲染器打开图表。

在 Python 中使用 Plotly 的 scatter_3d() 函数创建 3D 散点图

数据框的每一行对应一个数据点。将包含三个绘图维度数值的列名分别传给 x、y 和 z。Plotly Express 也接受数组作为这些参数,但使用数据框列能让每个点的数值与标签保持对应。

这个完整示例使用 Plotly Express 随附的 Iris 测量值和物种标签。如果 Python 环境中尚未安装 Plotly,请先安装。示例会建立图表并打印简要摘要;在交互式 Python 环境中调用 fig.show() 即可打开图表。摘要显示 150 个数据点和 3 个物种数据轨迹,其中的标签保留英文。

import plotly.express as px

df = px.data.iris()
fig = px.scatter_3d(
    data_frame=df,
    x="sepal_length",
    y="sepal_width",
    z="petal_width",
    color="species",
    title="Iris measurements",
)
print(f"Points: {len(df)}")
print(f"Traces: {len(fig.data)}")
for trace in fig.data:
    print(f"{trace.name}: {len(trace.x)} points")
Points: 150
Traces: 3
setosa: 50 points
versicolor: 50 points
virginica: 50 points

color="species" 会根据 species 列中的类别值映射不同颜色,并非随机着色。对于数值数据,将 color 映射到数值列时会使用连续色阶。size 可将数值列映射为标记大小;hover_name 则指定读者将指针移到标记上时要突出显示的列。使用 hover_data 可在悬停标签中添加或隐藏其他字段。可选的 text 参数会在每个数据点旁显示列值,但图表较密集时,文字标签可能互相重叠。

将数据框作为第一个参数传入,或通过 data_frame 指定。如果只有一列测量值,也应为另外两个维度选择有意义的列;不要假设未指定的维度会自动填入行索引。所选列应包含适合在三维空间中绘制的数值。

在 Python 中更改 3D 散点图的颜色和数据轨迹

设置类别颜色时,color_discrete_sequence 用于选择调色板,例如 px.colors.qualitative.Dark24。使用 color_discrete_map 可为类别名称指定颜色;未列入映射的类别会沿用其余默认配色行为。调色板和映射的详情请参阅 Plotly 的离散颜色文档。将 opacity 设为 0 到 1 之间的值可让标记呈半透明,有助于看出彼此重叠的数据点。

将数据框中的列传给 error_x、error_y 或 error_z,即可添加误差线;每列提供对应维度的误差值。上方使用的 Iris 数据没有误差列,因此使用这些参数前,请先在自己的数据框中准备合适的误差数据。若要将某个维度设为对数刻度,请将对应的 log_x、log_y 或 log_z 选项设为 True。对数刻度要求数值为正数。使用 title 设置图表标题;调用 fig.update_layout(showlegend=False) 可隐藏图例。

Plotly Express 会返回包含一个或多个数据轨迹(traces)的图表;按类别着色时,通常每个物种对应一个数据轨迹。调用 fig.update_traces(...) 可对这些数据轨迹套用设置,也可传入选择器(例如 selector=dict(name="setosa"))来指定某一个数据轨迹。例如,fig.update_traces(marker_opacity=0.6) 会将所有数据轨迹中的标记透明度设为 0.6。数据轨迹属性及支持的误差线设置,请参阅 Plotly 的 scatter3d 参考文档。