HOWTO · Plotly

如何在 Plotly 中建立 3D 散點圖

在 Python 中使用 Plotly Express 的 scatter_3d() 建立 3D 散點圖,然後自訂顏色、懸停標籤、座標軸和資料軌跡。

本頁內容

使用 Plotly Express 的 scatter_3d(),即可將資料框中的三個欄位分別對應到互動式 3D 散點圖的 x、y、z 維度。下方範例載入 Plotly 內建的 Iris 資料,並依物種為資料點著色;在互動式環境中呼叫 fig.show(),即可透過目前設定的 renderer 開啟圖表。

在 Python 中使用 Plotly 的 scatter_3d() 函式建立 3D 散點圖

資料框中的每一列代表一個資料點。將 x、y 和 z 設為包含三個繪圖維度數值的欄位名稱。Plotly Express 也接受將陣列傳給這些參數;使用欄位則能讓每個資料點的數值和標籤維持關聯。

這個完整範例使用 Plotly Express 隨附的 Iris 測量值與物種標籤。如果 Python 環境尚未安裝 Plotly,請先安裝。範例會建立圖表並列印精簡摘要;在互動式 Python 環境中呼叫 fig.show(),即可開啟圖表。

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。如果只有一個測量欄位,也要為另外兩個維度選擇有意義的欄位:不要假設缺少的維度會自動填入列索引。選用的欄位應包含適合用於 3D 繪圖的數值。

在 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) 會調整所有資料序列的標記不透明度。資料序列屬性與支援的誤差線設定,請參閱 Plotly 的 scatter3d 參考文件。