『Plotly实战指南』--散点图绘制进阶篇

在数据分析的世界里,散点图是一种极为重要的可视化工具。
它能够直观地展示两个或多个变量之间的关系,帮助我们快速发现数据中的模式、趋势和异常点。

无论是探索变量之间的相关性,还是寻找数据中的潜在规律,散点图都扮演着不可或缺的角色。

与传统的静态图表不同,Plotly 绘制的散点图可以通过鼠标悬停、缩放和拖动等交互操作,让用户更深入地探索数据细节。

本文旨在探讨使用 Plotly 绘制散点图的高级技巧,包括多变量散点图的绘制、趋势分析方法的应用,以及如何通过这些技巧提升数据分析与可视化的能力。

1. 多变量散点图

1.1. 气泡图

气泡图是一种扩展的散点图,通过引入第三个维度(通常是气泡的大小或颜色)来表示额外的信息,适用于展示三个或更多变量之间的关系。

绘制气泡图时,除了基本的 xy 轴数据外,还需要定义气泡的大小(通常通过 size 参数)和颜色(通过 color 参数)。

这样,气泡图可以在二维图表中同时表达4个属性。

import plotly.express as px
import pandas as pd

# 示例数据
data = pd.DataFrame(
    {
        "x": [1, 2, 3, 4, 5],
        "y": [10, 11, 12, 13, 14],
        "size": [10, 20, 30, 40, 50],
        "color": ["A", "B", "A", "B", "A"],
    }
)

fig = px.scatter(
    data,
    x="x",
    y="y",
    size="size",
    color="color",
    hover_name="color",
    log_x=True,
    size_max=60,
)
fig.show()

还可以通过调整颜色映射、气泡大小范围、添加标签等方式来美化气泡图,使其更加直观易懂。

1.2. 散点矩阵图

散点矩阵图是一种同时展示多个变量之间两两关系的图表,它将多个散点图排列成矩阵形式,每个单元格展示一对变量之间的散点图。

这种图表非常适合探索多变量数据之间的相关性,帮助我们快速发现变量之间的线性或非线性关系。

下面的示例中我们使用Plotly中自带的鸢尾花数据集,通过散点矩阵图可同时观察:

  • 花瓣长度与宽度的相关性
  • 不同花种在各维度的分布差异
import plotly.express as px
import plotly.figure_factory as ff

df = px.data.iris()
fig = ff.create_scatterplotmatrix(
    df,
    diag="histogram",
    colormap="Viridis",  # 对角线显示直方图
    width=800,
    height=800,
)
fig.update_layout(title="鸢尾花特征矩阵图")
fig.show()

通过这个图,我们可以分析鸢尾花不同属性之间的关联关系。

散点矩阵图的优点在于能够同时展示多个变量之间的关系,信息量大,并且有助于快速发现变量之间的相关性。

不过,当变量数量较多时,图表可能会显得过于复杂,难以解读,这点需要注意。

而且它对于非线性关系的展示效果也有限。

2. 散点图趋势分析法

2.1. 回归分析

回归线散点图中用于展示变量之间趋势关系的重要工具,

回归线通常是指线性回归模型的拟合线,用于量化变量之间的线性关系。

下面通过生成一些测试数据,通过线性模型训练之后,根据训练结果绘制散点数据的回归线。

import pandas as pd
import numpy as np
import plotly.graph_objects as go
from sklearn.linear_model import LinearRegression

# 生成示例数据
data = pd.DataFrame({
    'x': np.linspace(0, 10, 100),
    'y': 2 * np.linspace(0, 10, 100) + 3 + np.random.normal(0, 1, 100)
})

# 线性回归
# 拟合线性模型
model = LinearRegression()
model.fit(data[['x']], data['y'])
data['y_pred_linear'] = model.predict(data[['x']])

# 创建散点图
fig = go.Figure()
fig.add_trace(go.Scatter(x=data['x'], y=data['y'], mode='markers', name='原始数据'))
fig.add_trace(go.Scatter(x=data['x'], y=data['y_pred_linear'], mode='lines', name='线性回归线'))

# 显示图形
fig.show()

回归线可以很好的表达数据的变化趋势。

对于非线性的模型,也可以绘制对应的回归线,比如下面示例中采用的多项式回归模型训练,训练结果也可以绘制回归线。

import plotly.graph_objects as go
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# 多项式回归
# 多项式特征转换
poly = PolynomialFeatures(degree=3)
X_poly = poly.fit_transform(data[['x']])
model_poly = LinearRegression()
model_poly.fit(X_poly, data['y'])
data['y_pred_poly'] = model_poly.predict(X_poly)

fig = go.Figure()
fig.add_trace(go.Scatter(x=data['x'], y=data['y'], mode='markers', name='原始数据'))
fig.add_trace(go.Scatter(x=data['x'], y=data['y_pred_linear'], mode='lines', name='线性回归线'))
fig.add_trace(go.Scatter(x=data['x'], y=data['y_pred_poly'], mode='lines', name='多项式回归线'))

# 显示图形
fig.show()

两条回归线差不多重合了。(红色是线性回归,青色的是多项式回归

2.2. 平滑处理

平滑算法用于处理散点图中的噪声数据,使数据的趋势更加清晰,通过平滑处理,可以更好地观察数据的长期趋势,而忽略短期的波动。

常见平滑算法有移动平均(通过计算一定窗口内的平均值来平滑数据)和Savitzky-Golay 滤波(一种基于多项式拟合的平滑算法)

Plotly中,可以通过自定义函数或利用现有库(如 SciPy)来实现平滑处理并绘制曲线。

import plotly.express as px
import numpy as np
from scipy.signal import savgol_filter

# 示例数据
data = px.data.gapminder().query("country=='Canada'")
y = data["gdpPercap"]
x = np.arange(len(y))
y_smooth = savgol_filter(y, window_length=7, polyorder=2)

fig = px.scatter(data, x=x, y=y)
fig.add_scatter(x=x, y=y_smooth, mode="lines", name="平滑曲线")
fig.show()

3. 总结

本文主要介绍如何使用 Plotly 绘制散点图的高级技巧,包括多变量散点图的绘制(如气泡图、散点矩阵图)和趋势分析方法(如拟合曲线、回归线、平滑算法)。

这些技巧不仅提升了数据分析的维度和深度,还通过交互式可视化增强了数据探索的效率和乐趣。

原创作者: wang_yb 转载于: https://www.cnblogs.com/wang_yb/p/18810863
<think>好的,我现在需要帮助用户了解如何使用plotly.js-dist创建折线图的示例代码。首先,我应该回顾用户提供的引用内容,看看有没有相关的代码示例或步骤。 用户提到的引用[2]中有一个示例代码,展示了如何创建基本的折线图。代码使用了Plotly.plot函数,传递了容器div、数据和布局选项。这应该是一个很好的起点。另外,引用[3]提到了在Angular项目中引入plotly.js的方法,但用户现在可能只需要基础的HTML示例,所以可以暂时忽略框架部分,专注于核心实现。 接下来,我需要确保代码符合用户的要求,即使用plotly.js-dist库。根据引用[1],正确的导入方式是在HTML中通过script标签引入plotly.js-dist,而不是使用模块导入。因此,示例代码应该包含类似<script src="plotly.js-dist路径"></script>的部分。但用户可能更关心的是如何构建数据和调用Plotly函数,所以需要详细说明这部分。 用户的问题是关于折线图的创建,因此需要展示如何定义x和y的数据点,设置type为'scatter',这可能让用户有些困惑,因为散点图和折线图在Plotly中都是用'scatter'类型,但通过mode参数来区分线条和点。例如,mode: 'lines'表示折线,'markers'表示散点,'lines+markers'则同时显示线和点。因此,在代码示例中需要明确这一点,避免用户混淆。 此外,引用[2]中的示例代码使用了type: 'scatter',但没有设置mode,这可能默认是线条和点的组合。为了让用户明确创建折线图,应该显式设置mode为'lines',或者根据需求调整。同时,布局选项如标题、坐标轴标签等也需要提及,以增强图表的可读性。 用户可能还关心如何将图表嵌入到HTML页面中,所以需要提供一个完整的HTML结构示例,包括容器div的定义,脚本的引入顺序,以及Plotly.plot的调用位置。需要注意的是,容器div必须存在于DOM中,因此脚本应该放在body的末尾,或者使用DOMContentLoaded事件来确保元素已加载。 另外,引用[5]提到了Vue 3中使用Plotly.js的例子,但用户可能不需要框架相关的部分,所以可以忽略这部分,专注于纯JavaScript的实现。同时,引用[4]提到未来计划支持其他图表类型,但当前问题只关注折线图,因此无需涉及其他类型。 总结步骤: 1. 引入plotly.js-dist库。 2. 准备HTML容器。 3. 创建数据数组,每个trace对应一条线,设置type为'scatter',mode为'lines'。 4. 定义布局配置,如标题、坐标轴等。 5. 调用Plotly.plot方法渲染图表。 需要检查是否有语法错误,比如变量名是否正确,数据格式是否为数组,布局是否作为对象传递。同时,确保示例代码能够直接复制到HTML文件中运行,给出完整的示例,方便用户测试。 可能的问题:用户可能不清楚如何调整线条样式,比如颜色、线宽等,可以在数据trace中添加line属性进行配置。此外,如何处理动态数据或从外部源加载数据也是潜在的问题,但当前问题只需要基础示例,暂不深入。 最后,根据用户的要求,生成相关问题,例如如何添加多个折线,如何自定义样式,如何添加交互功能等,这些都可以作为相关问题,帮助用户进一步学习。</think>以下是如何使用 `plotly.js-dist` 创建折线图的完整示例代码和分步说明: --- ### 基础折线图实现步骤 #### 1. 引入 Plotly.js 库 在 HTML 文件中通过 `<script>` 标签引入: ```html <script src="https://cdn.jsdelivr.net/npm/plotly.js-dist@2.18.2/plotly.min.js"></script> ``` #### 2. 准备 HTML 容器 定义一个用于显示图表的 `<div>`: ```html <div id="line-chart"></div> ``` #### 3. 创建数据与布局 ```javascript // 数据定义(支持多组折线) const trace1 = { x: [1, 2, 3, 4, 5], y: [10, 15, 13, 17, 20], type: 'scatter', mode: 'lines', // 明确指定为折线模式 name: '数据集A', line: { color: '#FF6F61', width: 2 } // 自定义线条样式 }; const trace2 = { x: [1, 2, 3, 4, 5], y: [16, 5, 11, 9, 14], type: 'scatter', mode: 'lines+markers', // 同时显示线和点 name: '数据集B' }; const data = [trace1, trace2]; // 布局配置 const layout = { title: '双折线对比图', xaxis: { title: '时间(单位:秒)' }, yaxis: { title: '数值变化趋势' }, showlegend: true }; ``` #### 4. 渲染图表 ```javascript Plotly.newPlot('line-chart', data, layout); ``` --- ### 完整 HTML 示例 ```html <!DOCTYPE html> <html> <head> <title>Plotly 折线图示例</title> </head> <body> <div id="line-chart" style="width:800px; height:600px"></div> <script src="https://cdn.jsdelivr.net/npm/plotly.js-dist@2.18.2/plotly.min.js"></script> <script> // 数据配置 const trace1 = { x: [1, 2, 3, 4, 5], y: [10, 15, 13, 17, 20], type: 'scatter', mode: 'lines', name: '生产线A' }; const trace2 = { x: [1, 2, 3, 4, 5], y: [16, 5, 11, 9, 14], type: 'scatter', mode: 'lines', name: '生产线B' }; // 布局增强配置 const layout = { title: '工厂生产数据监控', xaxis: { title: '季度(2023年)', gridcolor: '#EEE' }, yaxis: { title: '产量(万件)', zeroline: false }, paper_bgcolor: 'rgba(245,246,249,1)' }; // 渲染图表 Plotly.newPlot('line-chart', [trace1, trace2], layout); </script> </body> </html> ``` --- ### 关键功能解析 1. **多线绘制**:通过定义多个 `trace` 对象实现多条折线的叠加显示[^2]。 2. **交互特性**:默认支持缩放、悬停数据显示、图例开关等交互功能[^1]。 3. **样式控制**: - `mode`: 控制显示形式(`lines`/`markers`/`lines+markers`) - `line`: 可配置颜色、虚线样式、宽度等参数 - `marker`: 可修改点的形状、尺寸、填充色等 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值