从 pyecharts 到 plotly,掌握 Python 主流可视化库的核心用法,轻松绘制柱状图、折线图、散点图、饼图、旭日图、3D 图、动态地图等。
目录
一、pyecharts 仪表板
pyecharts 是基于百度 ECharts 的 Python 可视化库,支持链式调用,适合制作交互式图表和仪表板大屏。
1.1 柱状图 Bar
基础 柱状图是最常用的图表类型之一,用于展示分类数据的数量对比。
from pyecharts.charts import Bar
x_data = ["水笔", "铅笔", "钢笔", "圆珠笔"]
y_data = [40, 30, 98, 42]
bar = (
Bar()
.add_xaxis(x_data)
.add_yaxis("", y_data)
)
💡 要点: pyecharts 使用链式调用(Fluent API),通过
.add_xaxis()设置 x 轴,.add_yaxis()添加数据系列。
1.2 折线图 Line
基础 折线图用于展示数据随时间或类别的变化趋势。
from pyecharts.charts import Line
x_data = ['Apple', 'Huawei', 'Xiaomi', 'Oppo', 'Vivo', 'Meizu']
y_data = [123, 153, 89, 107, 98, 23]
line = (
Line()
.add_xaxis(x_data)
.add_yaxis('呵呵', y_data)
)
1.3 散点图 Scatter
进阶 散点图展示两个变量之间的关系。注意:散点图的轴通常需要设置为数值轴。
from pyecharts.charts import Scatter
import pyecharts.options as opts
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
scatter = (
Scatter()
.add_xaxis(list(x))
.add_yaxis("正弦", list(y))
.set_global_opts(
xaxis_opts=opts.AxisOpts(type_="value"),
yaxis_opts=opts.AxisOpts(type_="value")
)
)
💡 要点: 散点图默认 x 轴为类目轴,需要通过
set_global_opts()将轴类型设为"value"(数值轴),否则数据会按类目排列。
1.4 饼图 Pie(南丁格尔玫瑰图)
进阶 饼图用于展示各部分占整体的比例。通过 rosetype 参数可以制作南丁格尔玫瑰图。
from pyecharts.charts import Pie
num = [110, 136, 108, 48, 111, 112, 103]
lab = ['哈士奇', '萨摩耶', '泰迪', '金毛', '牧羊犬', '吉娃娃', '柯基']
data_pair_ = list(zip(lab, num))
pie = (
Pie()
.add('饼图',
data_pair=data_pair_,
rosetype='radius',
radius=["20%", "45%"])
)
💡 要点:
rosetype='radius':南丁格尔玫瑰图,扇区半径随数据大小变化
radius=["20%", "45%"]:设置内外半径,实现圆环效果数据格式需要用
list(zip(标签, 数值))组合
1.5 Page 仪表板组合
高级 使用 Page 可以将多个图表组合到一个页面中,支持拖拽布局。
from pyecharts.charts import Page
page = Page(layout=Page.DraggablePageLayout, page_title='test')
page.add(
bar(),
line(),
scatter(),
pie()
)
page.render('.//test.html')
page.save_resize_html(
r'test.html',
cfg_file='chart_config.json',
dest=r'大屏显示案例成品.html'
)
💡 要点:
Page.DraggablePageLayout:启用拖拽布局模式
page.render():先生成可拖拽的 HTML
page.save_resize_html():拖拽调整后,保存最终布局的 HTML(大屏显示成品)在 PyCharm 中运行时,需要先注释
page.render(),再执行save_resize_html()
二、Plotly 可视化
Plotly 是一个强大的交互式可视化库,支持两种接口:graph_objects(底层,灵活)和 express(高级,简洁)。
import plotly.graph_objects as go
import plotly.express as px
import warnings
warnings.filterwarnings("ignore")
2.1 go(graph_objects)底层接口
核心 go 接口提供了对图表的精细控制,遵循"画轨迹 → 创建画布 → 更新布局"的三步流程。
2.1.1 折线图
import numpy as np
t = np.linspace(0, 10, 100)
y = np.sin(t)
data = go.Scatter(x=t, y=y, mode='lines')
fig = go.Figure(data)
fig.update_layout(
margin=dict(l=30, r=30, t=30, b=30),
paper_bgcolor='pink',
width=800,
height=300
)
fig.show()
💡 go 绘图三步法:
画轨迹:
go.Scatter()/go.Bar()等创建画布:
go.Figure(data)更新布局:
fig.update_layout()设置标题、边距、背景色等
2.1.2 散点图
只需将 mode 参数改为 'markers' 即可。
data = go.Scatter(x=t, y=y, mode='markers')
💡 mode 参数:
'lines':折线图
'markers':散点图
'markers+lines':点线组合图
2.1.3 多轨迹图(多条折线)
t = np.linspace(0, 10, 200)
y0 = np.sin(t)
y1 = np.cos(t)**2
trace0 = go.Scatter(x=t, y=y0, mode='lines')
trace1 = go.Scatter(x=t, y=y1, mode='lines')
fig = go.Figure([trace0, trace1])
fig.update_layout(
title="两个函数的轨迹",
xaxis_title='x轴',
yaxis_title='y轴',
height=500
)
fig.show()
💡 要点: 将多个轨迹放入列表
[trace0, trace1]传给go.Figure(),plotly 自动识别中文标题和轴标签。
2.1.4 柱状图
names = ['Byron', '梁', '天使男孩']
data = go.Bar(x=names, y=[99, 88, 78])
fig = go.Figure(data)
fig.show()
2.1.5 对比柱状图(并列 vs 堆叠)
names = ['Byron', '梁', '天使男孩']
data1 = go.Bar(x=names, y=[99, 88, 78], name="英语")
data2 = go.Bar(x=names, y=[67, 79, 82], name="数学")
fig = go.Figure([data1, data2])
fig.show()
fig.update_layout(barmode="stack")
fig.show()
💡 要点:
name参数设置图例标签默认为并列显示,设置
barmode="stack"切换为堆叠模式
2.1.6 点线组合图
trace = go.Scatter(
x=[1, 2, 3],
y=[1, 2, 3],
marker=dict(
color=['red', 'blue', 'green'],
size=[30, 60, 90]
),
mode='markers+lines'
)
go.Figure(trace)
💡 要点: 通过
marker参数可以自定义点的颜色和大小,支持列表形式实现差异化显示。
2.2 px(express)高级接口
推荐 px 接口更简洁,一行代码即可完成复杂图表,特别适合基于 DataFrame 的数据可视化。
2.2.1 散点图(鸢尾花数据集)
import plotly.express as px
iris = px.data.iris()
fig = px.scatter(iris, x='sepal_length', y='sepal_width', color='species')
fig.show()
💡 要点:
color='species'会自动按该列的唯一值分配不同颜色,实现分组着色。
2.2.2 饼图
df = px.data.gapminder().query("year == 2007").query("continent == 'Americas'")
fig = px.pie(
df,
values='pop',
names='country',
title="美洲人口",
hover_data=['lifeExp'],
height=500
)
fig.update_traces(textposition='inside', textinfo='percent+label')
fig.update_layout(uniformtext_minsize=8, uniformtext_mode='hide')
fig.show()
💡 要点:
values:数值列;names:分组列
hover_data:鼠标悬停时额外显示的列
textposition='inside'+textinfo='percent+label':标签写在饼图内
uniformtext_minsize=8, uniformtext_mode='hide':字体太小时自动隐藏
2.2.3 圆环图(Donut Chart)
df2 = px.data.gapminder().query("continent == 'Asia'")
fig = px.pie(
df2,
values='pop',
hole=0.5,
names='country',
height=500
)
fig.update_traces(textposition='inside', textinfo='percent+label')
fig.update_layout(uniformtext_minsize=8, uniformtext_mode='hide')
fig.show()
💡 要点: 只需添加
hole=0.5参数,在 0.5 倍半径处挖洞,饼图就变成了圆环图!
2.2.4 气泡图
gap = px.data.gapminder().query("year == 2002")
fig = px.scatter(
gap,
x="gdpPercap",
y="lifeExp",
color="continent",
size="pop",
size_max=60,
height=500
)
fig.show()
💡 要点:
size参数控制气泡大小,size_max限制最大气泡尺寸。气泡图能同时展示三个维度的数据(x、y、大小)。
2.2.5 旭日图(Sunburst)
df4 = px.data.tips()
fig = px.sunburst(
df4,
path=['day', 'time', 'sex'],
values='total_bill',
height=500
)
fig.show()
💡 要点:
path参数定义层级结构(从外到内),旭日图非常适合展示多层级数据的占比关系。
2.2.6 小提琴图(Violin)
px.violin(df4, x='time', y='tip', height=500)
💡 要点: 小提琴图结合了箱线图和核密度估计,能同时展示数据的分布形状和统计信息。
2.2.7 3D 散点图
df5 = px.data.iris()
fig = px.scatter_3d(
df5,
x='sepal_length',
y='sepal_width',
z='petal_width',
color='species',
height=500
)
fig.show()
💡 要点: 3D 图表支持鼠标拖拽旋转,
z参数指定第三维,color分组着色。
2.2.8 动态地图
df5 = px.data.gapminder()
fig = px.scatter_geo(
df5,
locations="iso_alpha",
color="continent",
hover_name="country",
size="pop",
animation_frame="year",
projection="natural earth",
height=500
)
fig.show()
💡 要点:
locations="iso_alpha":使用 ISO 国家代码定位
animation_frame="year":按年份制作动画,点击播放按钮即可看到随时间变化的动态效果
projection="natural earth":自然地球投影
三、pyecharts vs plotly 对比
|
特性 |
pyecharts |
plotly |
|---|---|---|
|
底层引擎 |
百度 ECharts |
Plotly.js |
|
编程风格 |
链式调用 |
面向对象 + 函数式 |
|
接口层级 |
单一接口 |
go(底层)+ px(高级) |
|
仪表板大屏 |
✅ Page + 拖拽布局 |
需配合 Dash |
|
3D 图表 |
支持 |
✅ 原生支持,交互流畅 |
|
动态动画 |
支持 |
✅ animation_frame 原生动画 |
|
地图 |
✅ 支持中国地图 |
✅ 全球地图 |
|
中文支持 |
✅ 原生中文 |
✅ 自动识别中文 |
|
学习曲线 |
较低 |
中等(两套接口) |
|
适用场景 |
大屏展示、中国业务 |
数据分析、科学可视化 |
四、总结
本篇博客涵盖了 Python 数据可视化的两大主流库:
-
pyecharts:链式调用风格,适合制作仪表板大屏,支持拖拽布局,对中国业务场景友好
-
plotly:双接口设计(go 底层 + px 高级),交互性强,3D/动画/地图能力突出
核心知识点速查
|
图表类型 |
pyecharts |
plotly go |
plotly px |
|---|---|---|---|
|
柱状图 |
|
|
|
|
折线图 |
|
|
|
|
散点图 |
|
|
|
|
饼图 |
|
|
|
|
圆环图 |
|
|
|
|
旭日图 |
|
|
|
|
小提琴图 |
— |
|
|
|
3D 散点图 |
|
|
|
|
地图 |
|
|
|
|
气泡图 |
|
|
|
更多推荐



所有评论(0)