【python】从0到1掌握Plotly,解锁数据可视化新姿势
目录
一、Plotly 初印象

在数据可视化的广袤宇宙中,Plotly 宛如一颗璀璨的明星,散发着独特的魅力。它是一个功能强大的交互式数据可视化工具,支持多种编程语言,如 Python、R、Julia 等 ,凭借其丰富的图表类型、高度的交互性以及出色的可定制性,在数据科学和分析领域占据着重要的地位。
想象一下,你是一位金融分析师,需要分析过去十年某公司的股票价格走势。使用 Plotly,你不仅可以轻松绘制出清晰的折线图,直观展示股价的起伏,还能通过交互功能,鼠标悬停在曲线上,精确查看某一天的具体股价,甚至可以缩放和平移图表,聚焦你关注的时间段。又或者,你是一名地理学家,想要展示全球不同地区的气温分布情况,Plotly 的地理地图功能就能派上用场,将抽象的数据转化为直观的地图,让你一眼就能洞察全球气温的变化趋势。再比如,在电商领域,运营人员利用 Plotly 创建销售数据的柱状图和饼图,能快速了解不同产品的销售占比和销售趋势,为决策提供有力依据。这些实际应用场景,都充分彰显了 Plotly 的强大功能,是不是已经迫不及待想要深入了解它了呢?
二、环境搭建,万事俱备
工欲善其事,必先利其器。在开启 Plotly 的学习之旅前,我们得先把环境搭建好。安装 Plotly 库非常简单,Python 的包管理工具 pip 是我们的得力助手 。打开你的终端(Windows 用户可以使用命令提示符或 PowerShell,macOS 和 Linux 用户使用自带的终端应用),输入以下命令:
pip install plotly
按下回车键,pip 就会自动从 Python Package Index(PyPI)下载并安装 Plotly 库及其依赖项。整个过程就像在超市挑选商品,pip 帮你把 Plotly 和它需要的 “小伙伴” 们一股脑儿带回家。
安装完成后,我们可以验证一下是否安装成功。在终端中输入:
python -c "import plotly; print(plotly.__version__)"
如果安装无误,你将看到类似5.15.0这样的版本号输出,这就像是收到了 Plotly 的 “入职通知”,宣告它已成功加入你的 Python 编程大家庭。
不过,安装过程中偶尔也会遇到一些小插曲。比如网络问题,就像道路堵塞影响快递送达一样,可能导致下载失败。这时,可以尝试更换国内的镜像源,如清华大学的镜像源,命令如下:
pip install plotly -i https://pypi.tuna.tsinghua.edu.cn/simple
又或者遇到依赖冲突,不同库之间的 “小矛盾” 可能阻碍 Plotly 的安装。这时候需要根据错误提示,检查并更新相关依赖包。例如,如果提示numpy版本过低,就可以使用pip install --upgrade numpy来升级它,化解这场 “矛盾纠纷” 。 只要耐心解决这些小问题,就能顺利搭建好环境,为后续学习 Plotly 扫清障碍。
三、基础语法,开启绘图之旅
(一)核心概念
在深入学习 Plotly 的绘图技巧之前,我们先来认识几个核心概念,它们就像是打开 Plotly 绘图大门的钥匙 。
Figure(图表)是 Plotly 中最顶层的概念,它就像是一幅画布,承载着我们绘制的各种图形元素。一个Figure对象可以包含多个Trace(轨迹),每个Trace代表一种具体的图形,比如折线图中的一条折线、散点图中的一组散点 。可以把Figure想象成一个画展,而Trace就是画展中的一幅幅画作,每幅画都有自己独特的风格和内容,但都统一展示在这个画展中。
Data(数据)是绘图的基础,就如同建造房屋的砖块。它为Trace提供具体的数据点,不同的图表类型对数据的格式要求略有不同。例如,绘制折线图时,数据通常是一系列的 (x, y) 坐标对,x 代表横坐标,y 代表纵坐标,它们就像地图上的经纬度,精确地确定了每个数据点在图表中的位置。
Layout(布局)则负责图表的整体外观和布局设置,包括标题、坐标轴标签、图例位置、背景颜色等。它就像是房屋的装修设计,决定了图表的美观程度和可读性。合理的布局能让图表更加清晰直观,就像精心装修的房屋让人住得舒适一样。通过调整Layout的参数,我们可以让图表符合自己的审美和需求,打造出独一无二的数据可视化作品。 了解这些核心概念后,我们就能更好地理解 Plotly 的绘图原理,为后续的绘图操作打下坚实的基础。
(二)简单绘图示例
理论知识已经储备好,接下来让我们通过一个简单的折线图绘制示例,真正上手体验 Plotly 的魅力 。假设我们有一家甜品店,记录了一周内每天的蛋糕销量,数据如下:
import plotly.express as px
import pandas as pd
# 准备数据
data = {
'日期': ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
'销量': [20, 25, 18, 30, 35, 40, 38]
}
df = pd.DataFrame(data)
在这里,我们使用了 Python 的pandas库来处理数据,将日期和销量整理成一个DataFrame结构,这是一种非常常见且方便的数据组织形式,就像把物品分类整理好放在不同的抽屉里,方便取用。
接下来,使用 Plotly Express 来绘制折线图 :
# 绘制折线图
fig = px.line(df, x='日期', y='销量', title='甜品店一周蛋糕销量趋势')
# 显示图表
fig.show()
px.line函数是 Plotly Express 中专门用于绘制折线图的工具,它就像一位技艺娴熟的画家,根据我们提供的数据和参数,在Figure画布上绘制出精美的折线图。x参数指定了横坐标对应的列,y参数指定了纵坐标对应的列,title参数则为图表添加了一个清晰的标题,让读者一眼就能明白图表所展示的内容。最后,通过fig.show()展示图表,就像是揭开画作的神秘面纱,将数据可视化的成果呈现出来。运行这段代码,你将得到一个交互式的折线图,鼠标悬停在折线上的每个点,就能看到当天的具体销量,还可以通过缩放和平移操作,更细致地观察销量的变化趋势 。是不是很简单呢?通过这个示例,你已经迈出了 Plotly 绘图的第一步,接下来,我们将深入探索更多复杂而有趣的绘图技巧。
四、常见图表绘制实战
掌握了基础语法后,我们就像拥有了一套万能绘画工具,可以开始绘制各种精美的图表,将数据以直观的方式呈现出来。接下来,让我们一起深入常见图表的绘制实战,领略 Plotly 的强大绘图能力。
(一)折线图
折线图是展示数据随时间或其他连续变量变化趋势的利器 。我们继续以甜品店的蛋糕销量数据为例,来看看如何绘制一个更具定制化的折线图。
import plotly.graph_objects as go
import pandas as pd
# 准备数据
data = {
'日期': ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
'销量': [20, 25, 18, 30, 35, 40, 38]
}
df = pd.DataFrame(data)
# 绘制折线图
fig = go.Figure()
fig.add_trace(go.Scatter(x=df['日期'], y=df['销量'],
mode='lines+markers', # 同时显示线条和标记点
line=dict(color='blue', width=2), # 设置线条颜色和宽度
marker=dict(size=8, color='red', symbol='circle'), # 设置标记点大小、颜色和形状
name='蛋糕销量')) # 给这条折线命名
# 更新布局
fig.update_layout(
title='甜品店一周蛋糕销量趋势', # 图表标题
xaxis_title='日期', # x轴标题
yaxis_title='销量', # y轴标题
legend=dict(x=0, y=1.0), # 图例位置
hovermode='x unified' # 悬停模式,统一在x轴上显示提示信息
)
# 显示图表
fig.show()
在这段代码中,我们使用go.Scatter来创建折线图,mode='lines+markers'参数让折线图同时显示线条和标记点,就像在道路上既有路线标识又有明显的地标 。line参数用于设置线条的属性,color='blue'将线条颜色设为蓝色,width=2调整线条宽度,让线条更加醒目。marker参数则负责标记点的定制,size=8设置标记点大小,color='red'使其颜色为红色,symbol='circle'指定形状为圆形,这样的标记点在图表中非常显眼,方便我们快速定位数据点 。name参数为折线命名,在多折线图中可以区分不同的数据系列。
fig.update_layout用于更新图表的布局,title设置图表的大标题,xaxis_title和yaxis_title分别为 x 轴和 y 轴添加清晰的标题,让读者一眼就能明白坐标轴代表的含义 。legend参数设置图例的位置,hovermode='x unified'开启悬停模式,当鼠标悬停在图表上时,会在 x 轴统一显示对应的提示信息,包括日期和销量,方便我们查看具体数据。运行这段代码,你将得到一个定制化的折线图,更直观地展示蛋糕销量的变化趋势 。
(二)散点图
散点图适用于展示两个变量之间的关系,帮助我们发现数据中的规律和趋势 。假设我们有一组关于学生身高和体重的数据,想要探究身高与体重之间是否存在某种关联,就可以用散点图来可视化分析。
import plotly.express as px
import pandas as pd
# 准备数据
data = {
'身高(cm)': [165, 170, 175, 180, 168, 172, 178],
'体重(kg)': [55, 60, 65, 70, 58, 62, 68]
}
df = pd.DataFrame(data)
# 绘制散点图
fig = px.scatter(df, x='身高(cm)', y='体重(kg)',
color='体重(kg)', # 根据体重来设置散点颜色
size='体重(kg)', # 根据体重来设置散点大小
hover_data=['身高(cm)', '体重(kg)'], # 悬停时显示的额外数据
title='学生身高与体重关系散点图') # 图表标题
# 显示图表
fig.show()
这里使用px.scatter函数绘制散点图,x和y参数分别指定横坐标和纵坐标对应的列 。color='体重(kg)'让散点的颜色根据体重的不同而变化,体重越大,颜色可能越深(具体颜色映射由 Plotly 自动处理),这样我们可以通过颜色直观地感受到体重的分布情况 。size='体重(kg)'则根据体重调整散点的大小,体重越大,散点越大,进一步突出数据的差异。hover_data参数指定了悬停在散点上时显示的额外数据,这里设置为身高和体重,方便我们查看每个学生的具体信息 。title为图表添加了一个准确的标题,概括了图表的主题。运行代码后,你将看到一个散点图,通过散点的分布,大致可以判断身高和体重之间可能存在正相关关系,即身高越高,体重往往也越大 。
(三)柱状图
柱状图是比较不同类别数据大小的常用图表 。例如,我们要对比不同水果的销量,看看哪种水果最受欢迎。
import plotly.express as px
import pandas as pd
# 准备数据
data = {
'水果': ['苹果', '香蕉', '橙子', '草莓', '葡萄'],
'销量': [150, 120, 100, 80, 90]
}
df = pd.DataFrame(data)
# 绘制柱状图
fig = px.bar(df, x='水果', y='销量',
color='水果', # 根据水果类别设置柱子颜色
text='销量', # 在柱子上显示销量数值
title='不同水果销量对比柱状图') # 图表标题
# 更新布局
fig.update_layout(
xaxis_tickangle=-45, # x轴刻度标签倾斜45度,避免重叠
yaxis_title='销量', # y轴标题
bargap=0.2 # 柱子之间的间隙
)
# 显示图表
fig.show()
px.bar函数用于创建柱状图,x指定类别轴(这里是水果),y指定数值轴(销量) 。color='水果'使不同水果对应的柱子显示不同颜色,方便区分。text='销量'会在每个柱子上方显示具体的销量数值,让数据一目了然 。fig.update_layout中,xaxis_tickangle=-45将 x 轴刻度标签倾斜 45 度,当类别名称较长或类别较多时,这样可以有效避免标签重叠,使图表更加清晰 。yaxis_title设置 y 轴标题,bargap=0.2调整柱子之间的间隙,让图表看起来更加美观。运行代码,你将得到一个直观的柱状图,从柱子的高度可以轻松看出苹果的销量最高,是最受欢迎的水果 。
(四)直方图
直方图主要用于展示数据的分布情况 。比如,我们有一组学生的考试成绩数据,想了解成绩的分布状态,是集中在某个分数段,还是比较均匀地分布在各个分数段,直方图就能派上用场。
import plotly.express as px
import numpy as np
# 生成随机考试成绩数据(模拟100个学生的成绩,成绩范围0 - 100)
data = np.random.randint(0, 101, 100)
# 绘制直方图
fig = px.histogram(data, x=data,
nbins=10, # 设置柱子的数量
histnorm='probability', # 以概率显示
title='学生考试成绩分布直方图') # 图表标题
# 更新布局
fig.update_layout(
xaxis_title='成绩', # x轴标题
yaxis_title='概率', # y轴标题
bargap=0.2 # 柱子之间的间隙
)
# 显示图表
fig.show()
在这个例子中,我们使用np.random.randint生成了 100 个 0 到 100 之间的随机整数,模拟学生的考试成绩 。px.histogram函数绘制直方图,x=data指定要绘制的数据,nbins=10设置将数据分成 10 个区间,也就是有 10 个柱子,这个参数可以根据数据特点和展示需求进行调整 。histnorm='probability'让 y 轴显示每个分数段的概率,而不是频数,这样更便于比较不同分数段的相对分布情况 。fig.update_layout设置了 x 轴和 y 轴的标题,以及柱子之间的间隙。运行代码后,通过直方图的形状,我们可以直观地看到成绩的分布情况,比如哪个分数段的学生人数占比最高,成绩是呈正态分布还是有其他特点 。
(五)饼图
饼图能够清晰地展示各部分数据占总体的比例关系 。假设我们对用户的兴趣爱好进行了调查,得到了不同兴趣爱好的占比数据,用饼图来呈现这些数据再合适不过。
import plotly.graph_objects as go
# 准备数据
labels = ['阅读', '运动', '音乐', '电影', '游戏']
values = [25, 20, 15, 22, 18]
# 绘制饼图
fig = go.Figure(data=[go.Pie(labels=labels, values=values,
textinfo='percent+label', # 显示百分比和标签
insidetextorientation='radial', # 内部文本径向排列
marker=dict(colors=['gold', 'mediumturquoise', 'darkorange', 'lightgreen', 'steelblue']))]) # 设置切片颜色
# 更新布局
fig.update_layout(
title='用户兴趣爱好占比饼图' # 图表标题
)
# 显示图表
fig.show()
使用go.Pie函数创建饼图,labels参数传入兴趣爱好的类别标签,values对应每个类别的占比数值 。textinfo='percent+label'让饼图的切片上同时显示百分比和标签,方便我们了解各部分的占比情况 。insidetextorientation='radial'将内部文本设置为径向排列,使图表更加美观。marker=dict(colors=...)通过自定义颜色列表,为每个切片指定不同的颜色,增强视觉效果 。fig.update_layout添加了图表标题。运行代码,一个精美的饼图就会展示在眼前,从图中可以一目了然地看出哪种兴趣爱好最受欢迎,各兴趣爱好之间的占比差异也清晰可见 。
五、高级技巧与进阶应用
(一)多子图布局
在实际的数据可视化中,我们常常需要同时展示多个图表,以便进行数据的对比和分析 。Plotly 提供了强大的多子图布局功能,让我们可以轻松实现这一需求。
通过plotly.subplots模块中的make_subplots函数,我们可以创建各种布局的多子图 。假设我们要同时展示一家公司不同产品在不同地区的销售额对比,以及各产品销售额占总销售额的比例。代码如下:
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import pandas as pd
# 准备数据
data = {
'产品': ['产品A', '产品B', '产品C'],
'地区1': [100, 150, 120],
'地区2': [90, 110, 130],
'地区3': [120, 140, 100]
}
df = pd.DataFrame(data)
# 计算各产品销售额占总销售额的比例
total_sales = df[['地区1', '地区2', '地区3']].sum().sum()
df['占比'] = df[['地区1', '地区2', '地区3']].sum(axis=1) / total_sales * 100
# 创建2行1列的子图布局
fig = make_subplots(rows=2, cols=1, subplot_titles=('不同产品在各地区销售额对比', '各产品销售额占比'))
# 添加柱状图到第一个子图
for product in df['产品']:
fig.add_trace(
go.Bar(
x=['地区1', '地区2', '地区3'],
y=df[df['产品'] == product][['地区1', '地区2', '地区3']].values[0],
name=product
),
row=1, col=1
)
# 添加饼图到第二个子图
fig.add_trace(
go.Pie(
labels=df['产品'],
values=df['占比'],
textinfo='percent+label'
),
row=2, col=1
)
# 更新布局
fig.update_layout(
height=800, # 设置图表高度
showlegend=True # 显示图例
)
# 显示图表
fig.show()
在这段代码中,make_subplots函数创建了一个 2 行 1 列的子图布局,subplot_titles参数为每个子图设置了标题 。通过循环,将不同产品在各地区的销售额数据以柱状图的形式添加到第一个子图中,每个产品对应一个柱子,柱子的高度代表销售额 。然后,将各产品销售额占比数据以饼图的形式添加到第二个子图中,饼图的切片大小反映占比情况 。最后,通过fig.update_layout设置图表的高度和显示图例,使图表更加美观和易读 。运行代码后,你将看到一个包含柱状图和饼图的多子图,方便直观地对比和分析数据 。
(二)动态图表制作
动态图表能够更生动地展示数据随时间或其他变量的变化情况,让数据 “活” 起来 。Plotly 制作动态图表的方法主要是利用frames属性和animate函数 。
以展示某城市过去一年每月的气温变化为例,我们可以创建一个动态折线图,随着时间的推进,折线图不断更新展示每个月的气温 。代码如下:
import plotly.express as px
import pandas as pd
import numpy as np
# 生成模拟数据(过去一年每月的平均气温)
months = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']
temperatures = np.random.randint(0, 30, 12)
df = pd.DataFrame({'月份': months, '气温': temperatures})
# 创建初始折线图
fig = px.line(df, x='月份', y='气温', title='某城市过去一年每月气温变化')
# 创建动态帧
frames = []
for i in range(len(df)):
frame = {
'data': [go.Scatter(x=df['月份'][:i + 1], y=df['气温'][:i + 1], mode='lines+markers')],
'name': f'frame_{i}'
}
frames.append(frame)
fig.frames = frames
# 添加动画控制按钮
fig.update_layout(
updatemenus=[{
'type': 'buttons',
'buttons': [
{
'label': '播放',
'method': 'animate',
'args': [None, {'frame': {'duration': 500,'redraw': False}, 'fromcurrent': True}]
},
{
'label': '暂停',
'method': 'animate',
'args': [[None], {'frame': {'duration': 0,'redraw': False}, 'mode': 'immediate'}]
}
]
}]
)
# 显示图表
fig.show()
在这段代码中,首先生成了模拟的每月气温数据,并创建了初始的折线图 。然后,通过循环创建了一系列的动态帧,每个帧对应一个时间点的数据,随着帧的切换,折线图上的数据点逐渐增加,展示出气温随时间的变化过程 。fig.frames属性将这些帧添加到图表中 。最后,fig.update_layout添加了动画控制按钮,包括播放和暂停按钮,通过点击按钮可以控制动画的播放和暂停,duration参数设置了每一帧切换的时间间隔,fromcurrent参数表示从当前帧开始播放动画 。运行代码后,你就可以看到一个动态展示气温变化的折线图,点击播放按钮,折线图会随着时间动态更新,让你更直观地感受气温的变化趋势 。
(三)与其他库结合使用
Plotly 与 Pandas、NumPy 等库结合使用,可以发挥更大的作用 。Pandas 是强大的数据处理和分析库,NumPy 则擅长数值计算,它们与 Plotly 配合,能让我们更高效地进行数据可视化 。
例如,使用 Pandas 读取和预处理数据,再用 Plotly 进行可视化 。假设我们有一个包含学生成绩的 CSV 文件,需要分析各科成绩的分布情况,并绘制直方图 。代码如下:
import plotly.express as px
import pandas as pd
# 使用Pandas读取CSV文件
df = pd.read_csv('students_scores.csv')
# 绘制数学成绩直方图
fig_math = px.histogram(df, x='数学', nbins=10, title='数学成绩分布直方图')
fig_math.show()
# 绘制语文成绩直方图
fig_chinese = px.histogram(df, x='语文', nbins=10, title='语文成绩分布直方图')
fig_chinese.show()
在这个例子中,pd.read_csv函数使用 Pandas 读取 CSV 文件,将学生成绩数据加载到DataFrame中 。然后,分别使用px.histogram函数绘制数学成绩和语文成绩的直方图,x参数指定要绘制的列,nbins设置直方图的柱子数量,title为图表添加标题 。通过 Pandas 的数据读取和处理功能,以及 Plotly 的可视化能力,我们可以轻松完成对学生成绩数据的分析和可视化展示 。
再比如,结合 NumPy 生成复杂的数值数据,然后用 Plotly 进行三维数据可视化 。下面是一个绘制三维散点图的例子:
import plotly.graph_objects as go
import numpy as np
# 使用NumPy生成三维随机数据
x = np.random.randn(100)
y = np.random.randn(100)
z = np.random.randn(100)
# 创建三维散点图
fig = go.Figure(data=[go.Scatter3d(x=x, y=y, z=z, mode='markers')])
# 更新布局
fig.update_layout(
scene=dict(
xaxis_title='X轴',
yaxis_title='Y轴',
zaxis_title='Z轴'
),
title='三维随机数据散点图'
)
# 显示图表
fig.show()
这里使用np.random.randn函数生成了 100 个服从标准正态分布的随机数,分别作为三维散点图的 x、y、z 坐标 。然后,使用go.Scatter3d创建三维散点图,mode='markers'表示以标记点的形式展示数据 。fig.update_layout设置了三维坐标系中各轴的标题和图表的标题 。通过 NumPy 生成数据和 Plotly 的三维可视化功能,我们可以直观地展示三维数据的分布情况 。
六、总结与展望
通过这趟充满趣味与挑战的学习之旅,我们从 Plotly 的初印象开始,逐步深入了解其核心概念,掌握了基础语法,并在常见图表绘制实战中积累了丰富的经验,还进一步探索了高级技巧与进阶应用 。从简单的折线图展示甜品店的销量趋势,到复杂的多子图布局对比公司产品数据,再到动态图表生动呈现数据变化,以及与其他库的协同合作,每一步都让我们感受到 Plotly 在数据可视化领域的强大魅力和无限可能 。
然而,这仅仅只是 Plotly 世界的冰山一角。它还有更多精彩的图表类型等待你去探索,如箱线图、热力图、地图等 。箱线图可以帮助我们分析数据的分布特征和异常值,热力图能直观展示数据的相关性,地图则能将地理数据可视化,揭示地理位置与数据之间的关系 。在交互功能方面,除了我们已经学习的缩放、平移、悬停提示等,Plotly 还支持更高级的交互操作,如数据筛选、联动视图等,让你能够更深入地挖掘数据背后的信息 。
如果你渴望继续深入学习 Plotly,官方文档是你最好的伙伴 。它就像一本详尽的武林秘籍,涵盖了 Plotly 的各种功能和使用方法,无论是基础概念的深入解读,还是高级技巧的详细教程,都能在其中找到答案 。在线教程和博客也是不错的学习资源,许多数据可视化爱好者和专家会在上面分享自己的学习心得、实战经验和有趣的案例,从别人的实践中汲取灵感和经验,能让你少走许多弯路 。同时,动手实践是提升技能的关键,尝试使用 Plotly 去解决实际问题,分析真实的数据,不断积累经验,你会发现自己对 Plotly 的理解和运用能力在不知不觉中得到了巨大的提升 。相信在未来的数据可视化探索中,Plotly 会成为你得力的助手,帮助你将数据转化为有价值的信息,用直观而美丽的图表讲述数据背后的故事 。
更多推荐
所有评论(0)