上一篇介绍了Plotly绘制折线图的基础知识和数据预处理的技巧,

本文将重点探讨如何利用Plotly实现多线折线图的布局设计以及动态折线图的实现,

让我们一起掌握进阶的折线图绘制技巧。

1. 多折线图布局

在实际的数据分析场景中,常常需要同时展示多组数据,例如对比不同产品的销售趋势、不同地区的温度变化等。

这种多变量对比或时间序列对比的场景非常适合使用多线折线图

然而,如何合理安排多组数据在同一图表中的展示,避免折线重叠或混乱,是布局规划的关键。

1.1. 布局的要点

假设我们有一组数据,记录了不同城市的月平均气温。

我们需要在同一张图表中展示这些城市的气温变化趋势,以便进行对比分析。

针对这个示例,布局图形的要点是:

  1. 利用子图Subplots或分层布局:如果数据组较多,可以使用子图将它们分层展示,避免图表过于拥挤。Plotlymake_subplots函数可以帮助我们轻松创建子图布局。
  2. 合理安排图例位置:确保图例清晰易读,避免遮挡折线。
  3. 调整坐标轴范围:根据数据的最大值和最小值,合理设置坐标轴范围,使折线图更加美观。
import plotly.graph_objects as go
from plotly.subplots import make_subplots # 示例数据
city1 = [20, 22, 25, 28, 30, 32, 35, 34, 30, 26, 22, 20]
city2 = [15, 18, 20, 22, 25, 28, 30, 29, 25, 22, 18, 15]
city3 = [10, 12, 15, 18, 20, 22, 25, 24, 20, 18, 15, 12]
months = [
"1月",
"2月",
"3月",
"4月",
"5月",
"6月",
"7月",
"8月",
"9月",
"10月",
"11月",
"12月",
] # 创建子图布局
fig = make_subplots(rows=1, cols=3, subplot_titles=("南京", "北京", "西安")) # 添加折线图
fig.add_trace(go.Scatter(x=months, y=city1, name="南京"), row=1, col=1)
fig.add_trace(go.Scatter(x=months, y=city2, name="北京"), row=1, col=2)
fig.add_trace(go.Scatter(x=months, y=city3, name="西安"), row=1, col=3) # 更新布局
fig.update_layout(height=400, width=900, title_text="每月平均气温比较")
fig.show()

通过子图布局,我们可以清晰地展示不同城市的气温变化趋势,避免了折线之间的相互干扰。

1.2. 颜色与样式的选择

在多折线图中,除了使用子图布局的方式,也可以将所有的折线绘制在一个图中,这时,颜色和样式的设计对于提升图表的可读性就至关重要。

对于颜色的选择与搭配:

  1. 根据数据特点选择颜色:例如,对于温度数据,可以使用冷暖色调来区分不同的城市。
  2. 使用Plotly的颜色库或自定义颜色Plotly提供了丰富的颜色库,也可以通过十六进制代码自定义颜色。

对于折线演示的设计:

  1. 线型的使用技巧:实线、虚线、点线等不同线型可以用于区分不同的数据组。
  2. 线宽与标记点的设置:适当增加线宽或添加标记点可以突出关键数据。
import plotly.graph_objects as go

# 示例数据
city1 = [20, 22, 25, 28, 30, 32, 35, 34, 30, 26, 22, 20]
city2 = [15, 18, 20, 22, 25, 28, 30, 29, 25, 22, 18, 15]
city3 = [10, 12, 15, 18, 20, 22, 25, 24, 20, 18, 15, 12]
months = [
"1月",
"2月",
"3月",
"4月",
"5月",
"6月",
"7月",
"8月",
"9月",
"10月",
"11月",
"12月",
] # 创建折线图
fig = go.Figure() # 添加折线
fig.add_trace(
go.Scatter(
x=months,
y=city1,
mode="lines+markers",
name="南京",
line=dict(color="red", dash="solid", width=2),
marker=dict(size=8, color="red"),
)
)
fig.add_trace(
go.Scatter(
x=months,
y=city2,
mode="lines+markers",
name="北京",
line=dict(color="blue", dash="dash", width=2),
marker=dict(size=8, color="blue"),
)
)
fig.add_trace(
go.Scatter(
x=months,
y=city3,
mode="lines+markers",
name="西安",
line=dict(color="green", dash="dot", width=2),
marker=dict(size=8, color="green"),
)
) # 更新布局
fig.update_layout(
title="每月平均气温比较",
xaxis_title="月份",
yaxis_title="温度 (°C)",
)
fig.show()

通过不同的颜色和线型,我们可以清晰地区分不同城市的气温变化趋势,提升图表的可读性。

2. 动态折线图

在数据分析中,动画效果可以帮助我们更直观地展示数据随时间的变化趋势,例如展示股票价格的波动或温度的季节性变化。

动画效果不仅能够吸引用户的注意力,还能帮助用户更好地理解数据的变化过程。

动画可以清晰地展示数据的动态变化趋势,而不是仅仅展示静态的结果。

2.1. 动态折线图实现

Plotly提供了强大的动画功能,可以轻松实现动态效果。

可以通过设置帧率、过渡效果等参数来控制动画的播放效果。

import plotly.graph_objects as go

# 示例数据
x = [1, 2, 3, 4, 5]
y1 = [1, 4, 9, 16, 25]
y2 = [2, 5, 8, 11, 14]
frames = [
go.Frame(
data=[
go.Scatter(
x=x[: i + 1], y=y1[: i + 1], mode="lines+markers", name="Line 1"
),
go.Scatter(
x=x[: i + 1], y=y2[: i + 1], mode="lines+markers", name="Line 2"
),
],
name=f"frame{i}",
)
for i in range(len(x))
] # 创建动画
fig = go.Figure(
data=[
go.Scatter(x=x[:1], y=y1[:1], mode="lines+markers", name="Line 1"),
go.Scatter(x=x[:1], y=y2[:1], mode="lines+markers", name="Line 2"),
],
frames=frames,
) # 更新布局
fig.update_layout(
title="动态折线图",
xaxis_title="X",
yaxis_title="Y",
updatemenus=[
dict(
type="buttons",
buttons=[
dict(
label="播放",
method="animate",
args=[
None,
{
"frame": {"duration": 500, "redraw": True},
"fromcurrent": True,
"transition": {"duration": 0},
},
],
),
dict(
label="暂停",
method="animate",
args=[
[None],
{
"frame": {"duration": 0, "redraw": False},
"mode": "immediate",
"transition": {"duration": 0},
},
],
),
],
)
],
) fig.show()

通过动画效果,我们可以清晰地看到两条折线随时间的变化趋势,帮助用户更好地理解数据的动态特征。

2.2. 交互式动态图

交互式图表可以让用户根据自己的需求选择展示的数据,增强了用户与数据之间的互动性。

例如,用户可以通过滑块调整时间范围,或者通过下拉菜单选择不同的变量进行对比,从而更加灵活地探索数据。

Plotly提供了丰富的交互工具,可以实现动态更新图表数据的功能。

通过结合这些工具,可以为用户创建高度定制化的交互体验。

import plotly.graph_objects as go
import numpy as np # 示例数据
x = np.linspace(0, 10, 100)
half = 50
y1 = np.sin(x[:half])
y2 = np.cos(x[half:]) fig = go.Figure()
# 创建交互式图表
for i in range(half):
fig.add_trace(go.Scatter(x=x[:i], y=y1, mode="lines", name="sin(x)", visible=False)) for i in range(half, 100):
fig.add_trace(
go.Scatter(x=x[half:i], y=y2, mode="lines", name="cos(x)", visible=False)
) # 添加滑块
steps = []
for i in range(half):
step = dict(
method="update",
args=[{"visible": [False] * len(x)}, {"title": f"x = {x[i]:.2f}"}],
label=f"{x[i]:.2f}",
)
step["args"][0]["visible"][i] = True
step["args"][0]["visible"][i + half] = True
steps.append(step) sliders = [
dict(active=0, currentvalue={"prefix": "Time: "}, pad={"t": 50}, steps=steps)
] fig.update_layout(sliders=sliders)
fig.show()

在这个示例中,用户可以通过滑块动态调整时间点,观察sin(x)cos(x)在不同时间点的值。

这种交互式设计让用户能够更直观地探索数据的变化。

3. 图表优化技巧

在绘制复杂的动态折线图时,优化图表的性能用户体验至关重要。

性能优化方面:

  1. 减少数据点数量:对于大规模数据集,可以通过采样或聚合减少数据点数量,避免图表卡顿。
  2. 使用WebGL渲染:对于复杂的动态图表,Plotly支持使用WebGL进行渲染,提升性能。

美观优化方面:

  1. 添加标题和注释:清晰的标题和注释可以帮助用户更好地理解图表的内容。
  2. 美化图例:确保图例清晰易读,避免遮挡图表主体。
  3. 调整颜色和样式:根据数据特点选择合适的颜色和样式,提升图表的整体美观度。

交互优化方面:

  1. 添加提示框:当鼠标悬停在数据点上时,显示提示框,展示详细信息。
  2. 高亮显示:当用户选择某条折线时,可以通过高亮显示突出重点。
  3. 动态调整坐标轴范围:根据用户的选择动态调整坐标轴范围,确保图表始终清晰易读。

4. 总结

本文探讨了如何利用Plotly实现多线折线图的布局设计和动态折线图的实现。

无论是多组数据的展示,还是动态效果的实现,Plotly都提供了强大的功能支持。

『Plotly实战指南』--折线图绘制进阶篇的更多相关文章

  1. qt外部数据传入实现动态的折线图绘制

    在嵌入式开发中,实现数据收集与显示很常见,对于希望数据稳定的应用来说,               折现图的表现形式很符合条件.               本实现是通过qt的signal-slot来 ...

  2. Python_散点图与折线图绘制

    在数据分析的过程中,经常需要将数据可视化,目前常使用的:散点图  折线图 需要import的外部包  一个是绘图 一个是字体导入 import matplotlib.pyplot as plt fro ...

  3. [Python Study Notes]折线图绘制

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  4. JAVA Swing使用JFreeChart实现折线图绘制

    效果如下: 实现步骤: 1.导入JAR包 jfreechart官网下载的zip文件中包含这两个jar包 2.代码编写 import org.jfree.chart.ChartFactory; impo ...

  5. 『Numpy学习指南』Matplotlib绘图

    数据生成: import numpy as np import matplotlib.pyplot as plt func = np.poly1d(np.array([,,,])) func1 = f ...

  6. 『Numpy学习指南』排序&索引&抽取函数介绍

    排序: numpy.lexsort(): numpy.lexsort()是个排字典序函数,因为很有意思,感觉也蛮有用的,所以单独列出来讲一下: 强调一点,本函数只接受一个参数! import nump ...

  7. Git实战指南----跟着haibiscuit学Git(第一篇)

    笔名:  haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...

  8. Git实战指南----跟着haibiscuit学Git(第二篇)

    笔名:  haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...

  9. Git实战指南----跟着haibiscuit学Git(第九篇)

    笔名:  haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...

  10. Chrome开发者工具不完全指南(四、性能进阶篇)

    前言 Profiles面板功能的作用主要是监控网页中各种方法执行时间和内存的变化,简单来说它就是Timeline的数字化版本.它的功能选项卡不是很多(只有三个),操作起来比较前面的几块功能版本来说简单 ...

随机推荐

  1. 2053C - Bewitching Stargazer

    简化题意 一个$ 1至n \(的区间,如果其长度是奇数,\)ans \(+=\) mid\(,再分为两个区间\)l\(~\)mid-1\(和\)mid+1\(~\)r\(,否则分为\)l\(~\)mi ...

  2. 肖健雄(Jianxiong Xiao)的开源SFM代码SFMedu的运行方法

    注意:本文是针对肖健雄(Jianxiong Xiao)博士的的开源SFM代码SFMedu(https://github.com/jianxiongxiao/SFMedu)的运行方法. 本人的运行环境: ...

  3. kubernetes系列(五) - kubernetes网络原理

    目录 前言 1. kubernetes网络模型 2. kubernetes的组件之间如何通讯 2.1 同一个pod内的多容器之间 2.2 各个pod直接的通讯 2.2.1 同一个节点上的pod互相通讯 ...

  4. svtools lmerge具体算法

    svtools具有不同的子命令以实现不同的功能,其中一个就是lmerge.根据其帮助文档(merge LUMPY calls inside a single file from svtools lso ...

  5. VSCode远程开发Linux内核驱动

    受够了Vim的换台电脑就要倒腾N天配置的折磨,受够了Windows下Source Insight眼花的界面.这些软件虽然很多人在用,但是缺点也不少.然而Linux内核代码非常庞大,编译内核又需要在Li ...

  6. 闲着没事,用STC12C5616AD制作一个74hc595测试仪

    手头有些特别廉价的直插74hc595,怕这些595因为廉价而质量不过关,因而萌发了制作一个测试仪的想法. 用测试仪先对595进行测试,功能正常了,再接入电路应用. 该测试仪能自动向595写入数据,再读 ...

  7. git worktree同一个仓库多个分支并行开发和管理

    介绍 Git Worktree 是 Git 提供的一个功能,允许你在同一个仓库中同时工作在多个工作目录中,每个目录都有自己的工作树和索引.这对于同时处理多个分支或版本非常有用. 常用命令 命令 解释 ...

  8. Java方法引用、lambda如何序列化&方法引用与lambda实现原理

    系列文章目录和关于我 0.引入 最近笔者使用flink实现一些实时数据清洗(从kafka清洗数据写入到clickhouse)的功能,在编写flink作业后进行上传,发现运行的时候抛出:java.io. ...

  9. Hadoop大数据架构及关键组件-建立大数据知识体系

    Hadoop大数据架构及关键组件1. Hadoop生态系统1.1 架构大数据生态的主要组件及其关系大数据生态大数据架构1. HDFS(Hadoop分布式文件系统):2. MapReduce(分布式计算 ...

  10. 深入LinkedBlockingQueue实现原理

    学习BlockingQueue之LinkedBlockingQueue实现原理   一:概念 LinkedBlockingQueue是一个用链表实现的有界阻塞队列.此队列的默认和最大长度为 Integ ...