一、环境准备
from pyecharts import options as opts
from pyecharts.charts import *
pyecharts 是基于 Apache ECharts 的 Python 可视化库,支持在 Jupyter Notebook 中交互式展示,也可导出为独立 HTML 文件。
两种渲染方式:
-
bar.render("./output.html")--- 保存为本地 HTML(PyCharm 推荐) -
bar.render_notebook()--- 在 Jupyter 中直接显示
二、柱状图(Bar Chart)
柱状图是最基础的数据可视化图表,适合展示分类数据的对比。
months = ['一月', '二月', '三月', '四月', '五月', '六月']
cost = [1200, 1500, 1800, 1400, 1600, 2000]
bar = (
Bar()
.add_xaxis(months)
.add_yaxis('消费金额', cost)
)
bar.render_notebook()
数据解读:六月份消费最高(2000元),四月份最低(1400元),整体呈上升趋势。
自定义尺寸
bar = (
Bar(init_opts=opts.InitOpts(width="700px", height="450px"))
.add_xaxis(months)
.add_yaxis('消费金额', cost)
)
通过 InitOpts 可控制图表的宽高、主题等全局配置。
三、散点图(Scatter Chart)
散点图用于展示数据点的分布情况,适合观察数据的离散程度和聚类趋势。
scatter = (
Scatter()
.add_xaxis(months)
.add_yaxis('消费金额', cost)
)
scatter.render_notebook()
与柱状图的区别:同样的数据,散点图更侧重展示每个数据点的位置关系,而非分类对比。
四、折线图(Line Chart)
折线图适合展示数据随时间的变化趋势,支持多系列对比。
cost1 = [1200, 1500, 1800, 1400, 1600, 2000]
cost2 = [1800, 1400, 1560, 2200, 3500, 1900]
line = (
Line()
.add_xaxis(months)
.add_yaxis('A', cost1, is_smooth=True)
.add_yaxis('B', cost2, is_smooth=True)
)
line.render_notebook()
关键参数:
-
is_smooth=True--- 平滑曲线,使折线更加美观 -
支持多系列叠加,方便对比 A/B 两组数据的趋势
数据解读:B 组在五月出现明显峰值(3500),而 A 组整体较为平稳。
五、饼图(Pie Chart)
饼图用于展示各部分占总体的比例关系。
fruits = ['苹果', '香蕉', '橙子', '草莓', '葡萄']
sales = [45, 30, 25, 20, 15]
pie = (
Pie()
.add('水果销售比例', [list(z) for z in zip(fruits, sales)],
radius=["30%", "60%"], # 环形饼图
rosetype="area") # 南丁格尔玫瑰图
.set_global_opts(
title_opts=opts.TitleOpts(title="水果销售比例")
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
)
pie.render_notebook()
关键参数:
-
radius=["30%","60%"]--- 内半径30%、外半径60%,形成环形饼图 -
rosetype="area"--- 南丁格尔玫瑰图,扇区半径按数据大小映射 -
formatter="{b}: {d}%"--- 标签显示名称和百分比
数据解读:苹果占比最大(30%),葡萄最小(10%)。
六、地理坐标图(Geo)
地理坐标图适合在地图上展示各区域的数据分布,配合涟漪特效更加直观。
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.globals import ChartType
data = [
("广东", 130000), ("浙江", 80000), ("江苏", 70000), ("上海", 85000),
("北京", 50000), ("福建", 40000), ("山东", 95000), ("河南", 30000),
("河北", 28000), ("四川", 25000), ("湖北", 22000), ("湖南", 20000),
("安徽", 18000), ("辽宁", 16000), ("陕西", 14000), ("江西", 12000),
("广西", 10000), ("云南", 8000), ("重庆", 7000), ("黑龙江", 6000),
]
geo = (
Geo()
.add_schema(maptype="china")
.add("快递业务量", data, type_=ChartType.EFFECT_SCATTER)
.set_global_opts(
title_opts=opts.TitleOpts(title="中国各省份快递业务量分布"),
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
pieces=[
{"min": 120000, "label": "12万+", "color": "#7f1100"},
{"min": 80000, "max": 120000, "label": "8万-12万", "color": "#ff5428"},
{"min": 40000, "max": 80000, "label": "4万-8万", "color": "#ff8c71"},
{"min": 1, "max": 40000, "label": "1-4万", "color": "#ffd768"},
]
)
)
)
geo.render_notebook()
关键参数:
-
ChartType.EFFECT_SCATTER--- 涟漪特效散点,数据点有动态效果 -
is_piecewise=True--- 分段型视觉映射 -
pieces--- 自定义每段的颜色和范围
数据解读:广东快递业务量遥遥领先(13万),山东次之(9.5万),长三角和珠三角是快递业务的核心区域。
七、地图(Map)
地图适合展示各省份的填充色数据,直观反映地域差异。
from pyecharts.charts import Map
data = [
("广东省", 51), ("湖北省", 118), ("湖南省", 143), ("四川省", 121),
("重庆市", 113), ("黑龙江省", 211), ("浙江省", 175), ("山西省", 230),
("河北省", 63), ("安徽省", 179), ("河南省", 173), ("山东省", 123),
("西藏自治区", 212),
]
map_chart = (
Map()
.add("确诊人数", data, "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="全国疫情地图"),
visualmap_opts=opts.VisualMapOpts(
max_=250, is_piecewise=True,
pieces=[
{"min": 200, "label": "≥200", "color": "#7f1100"},
{"min": 150, "max": 199, "color": "#ff5428"},
{"min": 100, "max": 149, "color": "#ff8c71"},
{"min": 50, "max": 99, "color": "#ffd768"},
]
)
)
)
map_chart.render_notebook()
注意:省份名称必须使用全称(如"广东省"而非"广东"),否则无法匹配地图数据。
数据解读:山西省确诊人数最多(230),广东省最少(51)。
八、词云图(WordCloud)
词云图适合展示文本词频统计结果,字体越大表示词频越高。
from pyecharts.charts import WordCloud
words = [
("dont", 436), ("then", 365), ("you", 360), ("can", 282),
("her", 266), ("make", 255), ("remember", 255), ("it", 247),
("bad", 244), ("start", 273), ("hey", 230), ("heart", 173),
("a sad song", 184), ("better", 182), ("let", 162),
("to", 150), ("jude", 124), ("Take", 138), ("into", 60),
("your", 82), ("and", 12),
]
wordcloud = (
WordCloud()
.add("", words, word_size_range=[20, 100], shape="circle")
)
wordcloud.render_notebook()
数据来源:Beatles 经典歌曲 "Hey Jude" 的歌词词频统计。
关键参数:
-
word_size_range=[20, 100]--- 字体大小范围 -
shape="circle"--- 词云形状为圆形
九、层叠图(Overlap)
层叠图可以将不同类型的图表叠加在一起,实现更丰富的数据展示。
x_data = ['Apple', 'Huawei', 'Xiaomi', 'Oppo', 'Vivo', 'Meizu']
y_data_bar = [123, 153, 89, 107, 98, 23]
y_data_line = [153, 107, 23, 89, 123, 107]
bar1 = (
Bar()
.add_xaxis(x_data)
.add_yaxis('bar', y_data_bar)
)
line1 = (
Line()
.add_xaxis(x_data)
.add_yaxis('line', y_data_line)
)
bar1.overlap(line1)
bar1.render_notebook()
使用场景:柱状图展示绝对值,折线图展示趋势或另一维度数据,两者叠加可同时观察销量和增长率。
数据解读:Huawei 柱状值最高(153),但折线值 Apple 最高(153),说明两个维度的排名并不一致。
十、图表类型选择指南
| 数据特征 | 推荐图表 | 适用场景 |
|---|---|---|
| 分类对比 | 柱状图 | 各月消费、各产品销量 |
| 趋势变化 | 折线图 | 时间序列、股价走势 |
| 占比分析 | 饼图 | 市场份额、预算分配 |
| 分布关系 | 散点图 | 相关性分析、聚类 |
| 地域分布 | 地图/Geo | 各省数据、疫情分布 |
| 文本分析 | 词云图 | 评论关键词、歌词词频 |
| 多维对比 | 层叠图 | 销量+增长率、收入+利润 |