目录


一、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 绘图三步法:

  1. 画轨迹go.Scatter() / go.Bar()

  2. 创建画布go.Figure(data)

  3. 更新布局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

柱状图

Bar()

go.Bar()

px.bar()

折线图

Line()

go.Scatter(mode='lines')

px.line()

散点图

Scatter()

go.Scatter(mode='markers')

px.scatter()

饼图

Pie()

go.Pie()

px.pie()

圆环图

Pie(radius=[...])

go.Pie(hole=...)

px.pie(hole=...)

旭日图

Sunburst()

go.Sunburst()

px.sunburst()

小提琴图

go.Violin()

px.violin()

3D 散点图

Scatter3D()

go.Scatter3d()

px.scatter_3d()

地图

Geo() / Map()

go.Scattergeo()

px.scatter_geo()

气泡图

EffectScatter()

go.Scatter(marker.size)

px.scatter(size=...)

更多推荐