如何用Plotly创建仅保留指定行的散点图矩阵?
如何用Plotly生成仅保留指定行的散点图矩阵?
需求说明
我想要创建散点图矩阵(scatter plot matrix,即多变量两两散点图组成的矩阵,用于查看变量间的两两相关性),但希望移除部分变量的行(同时保留这些变量在列中)。
已能生成包含所有变量的完整散点图矩阵,代码如下:
import numpy as np import pandas as pd import plotly.graph_objects as go df = pd.DataFrame( np.random.randn(1000, 5), columns=['A', 'B', 'C', 'M1', 'M2'] ) fig = go.Figure( data=go.Splom( dimensions=[dict(label=c, values=df[c]) for c in df.columns], text=df.index, marker=dict( size=3, color=df['M1'], colorscale='Bluered', ), ) ) fig.show()
希望得到的效果是:仅保留对应M1和M2的行,列仍保留所有变量(A、B、C、M1、M2),即矩阵中仅显示两行散点图,其余行隐藏,且输出为交互式HTML。
解决方案
Plotly原生go.Splom没有直接隐藏指定行的参数,但可以通过手动构建子图网格的方式实现需求,同时保留交互性。以下是实现代码:
import numpy as np import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots # 创建数据 df = pd.DataFrame( np.random.randn(1000, 5), columns=['A', 'B', 'C', 'M1', 'M2'] ) # 定义要保留的行变量和所有列变量 row_vars = ['M1', 'M2'] col_vars = df.columns.tolist() n_rows = len(row_vars) n_cols = len(col_vars) # 创建子图网格 fig = make_subplots( rows=n_rows, cols=n_cols, shared_yaxes=True, # 每行共享y轴 shared_xaxes='columns', # 每列共享x轴 ) # 逐个添加散点图 for row_idx, y_var in enumerate(row_vars, start=1): for col_idx, x_var in enumerate(col_vars, start=1): fig.add_trace( go.Scatter( x=df[x_var], y=df[y_var], mode='markers', marker=dict( size=3, color=df['M1'], colorscale='Bluered', ), text=df.index, showlegend=(row_idx == 1 and col_idx == 1) # 仅第一个子图显示图例 ), row=row_idx, col=col_idx ) # 调整布局,优化视觉效果 fig.update_layout( height=400 * n_rows, width=300 * n_cols, title_text="仅保留M1、M2行的散点图矩阵", showlegend=True, margin=dict(l=50, r=50, t=80, b=50) ) # 设置轴标签 for row_idx, y_var in enumerate(row_vars, start=1): fig.update_yaxes(title_text=y_var, row=row_idx, col=1) for col_idx, x_var in enumerate(col_vars, start=1): fig.update_xaxes(title_text=x_var, row=n_rows, col=col_idx) fig.show()
代码说明
- 用
make_subplots构建指定行列的子图网格,通过共享轴参数保证变量轴的一致性 - 遍历目标行变量和所有列变量,手动添加每个散点图,精准控制显示的行
- 标记样式、颜色设置与原散点图矩阵保持一致,保留悬停显示索引、缩放平移等交互功能
- 调整布局参数,让最终效果接近原生散点图矩阵的视觉体验
内容的提问来源于stack exchange,提问作者leleogere
相关产品推荐
相关产品推荐

