Pyecharts入门教程
从基础到进阶,详细讲解Pyecharts库的使用方法,创建各种精美的可视化图表
什么是Pyecharts?
Pyecharts是一个基于ECharts的Python可视化库,可以帮助你轻松创建各种交互式图表。通过Pyecharts,你可以用Python代码生成ECharts图表,这些图表具有美观的外观和丰富的交互功能。
本教程将详细介绍Pyecharts的安装方法和各种常见图表的绘制方式,包括柱状图、折线图、饼图、散点图等,并提供代码示例和效果展示。
安装与基础设置
安装Pyecharts
使用pip安装Pyecharts库:
pip install pyecharts
基础图表结构
Pyecharts创建图表的基本步骤:
- 导入相应的图表类
- 创建图表实例
- 添加数据和配置项
- 渲染图表(生成HTML文件或在Jupyter Notebook中显示)
基础图表类型
1. 柱状图 (Bar)
柱状图是一种常用的图表类型,适用于比较不同类别的数据。
代码示例:
from pyecharts import options as opts
from pyecharts.charts import Bar
# 创建柱状图实例
bar = Bar()
# 添加数据
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.add_yaxis("商家B", [15, 6, 45, 20, 35, 66])
# 设置全局配置项
bar.set_global_opts(
title_opts=opts.TitleOpts(title="商品销量统计"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
legend_opts=opts.LegendOpts(pos_left="center"),
xaxis_opts=opts.AxisOpts(name="商品类别"),
yaxis_opts=opts.AxisOpts(name="销量")
)
# 渲染图表
bar.render("bar_chart.html")
效果展示:
2. 折线图 (Line)
折线图适用于展示数据随时间变化的趋势。
代码示例:
from pyecharts import options as opts
from pyecharts.charts import Line
# 创建折线图实例
line = Line()
# 添加数据
line.add_xaxis(["1月", "2月", "3月", "4月", "5月", "6月"])
line.add_yaxis("降水量", [58, 48, 78, 88, 68, 98],
is_smooth=True, # 平滑曲线
symbol="circle", # 标记点样式
symbol_size=8) # 标记点大小
line.add_yaxis("温度", [15, 18, 22, 25, 28, 30],
is_smooth=True,
yaxis_index=1) # 使用第二个y轴
# 设置全局配置项
line.set_global_opts(
title_opts=opts.TitleOpts(title="月度气象数据"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
legend_opts=opts.LegendOpts(pos_left="center"),
xaxis_opts=opts.AxisOpts(name="月份")
)
# 使用extend_axis方法添加第二个y轴
line.extend_axis(
yaxis=opts.AxisOpts(
name="温度(°C)",
is_show=True,
position="right"
)
)
# 渲染图表
line.render("line_chart.html")
效果展示:
3. 饼图 (Pie)
饼图适用于展示各部分数据占总体的比例关系。
代码示例:
from pyecharts import options as opts
from pyecharts.charts import Pie
# 创建饼图实例
pie = Pie()
# 添加数据
data = [
("苹果", 35),
("香蕉", 25),
("橙子", 20),
("梨", 15),
("葡萄", 5)
]
pie.add("水果销量", data)
# 设置全局配置项
pie.set_global_opts(
title_opts=opts.TitleOpts(title="水果销量占比"),
legend_opts=opts.LegendOpts(orient="vertical", pos_left="left")
)
# 设置系列配置项
pie.set_series_opts(
label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)") # 标签格式
)
# 渲染图表
pie.render("pie_chart.html")
效果展示:
4. 散点图 (Scatter)
散点图适用于展示两个变量之间的关系,发现数据分布和相关性。
代码示例:
from pyecharts import options as opts
from pyecharts.charts import Scatter
import random
# 创建散点图实例
scatter = Scatter()
# 生成随机数据
x_data = [random.uniform(0, 100) for _ in range(50)]
y_data = [x * 2 + random.uniform(-20, 20) for x in x_data]
# 添加数据
scatter.add_xaxis(x_data)
scatter.add_yaxis("数据点",
list(zip(x_data, y_data)),
symbol_size=10)
# 设置全局配置项
scatter.set_global_opts(
title_opts=opts.TitleOpts(title="相关性分析"),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
xaxis_opts=opts.AxisOpts(name="X值", type_="value"),
yaxis_opts=opts.AxisOpts(name="Y值", type_="value")
)
# 渲染图表
scatter.render("scatter_chart.html")
效果展示:
进阶图表类型
1. 雷达图 (Radar)
雷达图适用于多维度数据的比较,展示不同事物在多个维度上的表现。
代码示例:
from pyecharts import options as opts
from pyecharts.charts import Radar
# 创建雷达图实例
radar = Radar()
# 定义雷达图的指示器
indicator = [
opts.RadarIndicatorItem(name="数学", max_=100),
opts.RadarIndicatorItem(name="语文", max_=100),
opts.RadarIndicatorItem(name="英语", max_=100),
opts.RadarIndicatorItem(name="物理", max_=100),
opts.RadarIndicatorItem(name="化学", max_=100),
opts.RadarIndicatorItem(name="生物", max_=100)
]
# 添加指示器
radar.add_schema(indicator)
# 添加数据 - 使用linestyle_opts设置线条颜色,使用areastyle_opts设置填充区域 (pyecharts 2.0.8兼容)
radar.add(
"学生A",
[[85, 90, 80, 70, 65, 75]],
linestyle_opts=opts.LineStyleOpts(color="rgba(59, 130, 246, 0.6)"),
areastyle_opts=opts.AreaStyleOpts(color="rgba(59, 130, 246, 0.3)")
)
radar.add(
"学生B",
[[70, 75, 90, 85, 80, 60]],
linestyle_opts=opts.LineStyleOpts(color="rgba(16, 185, 129, 0.6)"),
areastyle_opts=opts.AreaStyleOpts(color="rgba(16, 185, 129, 0.3)")
)
# 设置全局配置项
radar.set_global_opts(
title_opts=opts.TitleOpts(title="学生成绩雷达图"),
legend_opts=opts.LegendOpts(pos_bottom="0%")
)
# 渲染图表
radar.render("radar_chart.html")
效果展示:
2. 箱线图 (Boxplot)
箱线图适用于展示数据分布情况,包括中位数、四分位数和异常值等统计特征。
代码示例:
from pyecharts import options as opts
from pyecharts.charts import Boxplot
import random
# 创建箱线图实例
boxplot = Boxplot()
# 生成数据
categories = ["班级A", "班级B", "班级C", "班级D"]
data = []
for _ in categories:
# 为每个类别生成一组随机数据
group_data = [random.randint(60, 100) for _ in range(50)]
data.append(group_data)
# 预处理数据为箱线图所需的格式
boxplot_data = boxplot.prepare_data(data)
# 添加数据
boxplot.add_xaxis(categories)
boxplot.add_yaxis("数学成绩", boxplot_data)
# 设置全局配置项
boxplot.set_global_opts(
title_opts=opts.TitleOpts(title="各班级数学成绩分布"),
tooltip_opts=opts.TooltipOpts(trigger="item"),
xaxis_opts=opts.AxisOpts(name="班级"),
yaxis_opts=opts.AxisOpts(name="分数")
)
# 渲染图表
boxplot.render("boxplot_chart.html")
效果展示:
3. 热力图 (HeatMap)
热力图适用于展示数据的密度和分布情况,通过颜色深浅表示数值大小。
代码示例:
from pyecharts import options as opts
from pyecharts.charts import HeatMap
import random
# 创建热力图实例
heatmap = HeatMap()
# 生成数据
x_axis = [f"1月{x}日" for x in range(1, 8)]
y_axis = [f"{y}时" for y in range(0, 24, 3)]
# 生成随机数据点
data = []
for i in range(len(x_axis)):
for j in range(len(y_axis)):
data.append([i, j, random.randint(10, 50)])
# 添加数据
heatmap.add_xaxis(x_axis)
heatmap.add_yaxis(
"访问量",
y_axis,
data,
label_opts=opts.LabelOpts(is_show=True)
)
# 设置全局配置项
heatmap.set_global_opts(
title_opts=opts.TitleOpts(title="网站访问量热力图"),
visualmap_opts=opts.VisualMapOpts(min_=10, max_=50),
tooltip_opts=opts.TooltipOpts(formatter="{c} 次访问")
)
# 渲染图表
heatmap.render("heatmap_chart.html")
效果展示:
4. 地图 (Map)
地图适用于展示地理数据的分布情况,如各地区的人口、GDP等数据。
代码示例:
from pyecharts import options as opts
from pyecharts.charts import Map
# 创建地图实例
map_chart = Map()
# 添加数据
data = [
("北京", 300),
("上海", 400),
("广东", 500),
("江苏", 450),
("浙江", 420),
("山东", 380),
("河南", 350),
("四川", 320),
("湖北", 300),
("福建", 280)
]
# 添加数据到地图
map_chart.add(
"数据示例",
data,
"china", # 指定地图类型为中国地图
label_opts=opts.LabelOpts(is_show=True)
)
# 设置全局配置项
map_chart.set_global_opts(
title_opts=opts.TitleOpts(title="中国各地区数据分布"),
visualmap_opts=opts.VisualMapOpts(min_=200, max_=500),
tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}")
)
# 渲染图表
map_chart.render("map_chart.html")
效果展示:
4. 词云图 (WordCloud)
词云图适用于展示文本数据中词语的频率和重要性,词语大小表示频率高低。
代码示例:
from pyecharts import options as opts
from pyecharts.charts import WordCloud
# 创建词云图实例
wordcloud = WordCloud()
# 添加数据
data = [
("Python", 100),
("Java", 80),
("JavaScript", 75),
("C++", 70),
("C#", 60),
("Go", 55),
("Rust", 45),
("TypeScript", 40),
("PHP", 35),
("Ruby", 30),
("Swift", 25),
("Kotlin", 20)
]
# 添加数据到词云图
wordcloud.add(
"编程语言热度",
data,
word_size_range=[20, 80] # 词语大小范围
)
# 设置全局配置项
wordcloud.set_global_opts(
title_opts=opts.TitleOpts(title="编程语言热度词云图")
)
# 渲染图表
wordcloud.render("wordcloud_chart.html")
效果展示:
6. 漏斗图 (Funnel)
漏斗图适用于展示业务流程中各个阶段的数据转化情况,如用户转化漏斗。
代码示例:
from pyecharts import options as opts
from pyecharts.charts import Funnel
# 创建漏斗图实例
funnel = Funnel()
# 添加数据 - 设置漏斗图样式参数以匹配JavaScript效果
funnel.add(
"用户转化漏斗",
[
("访问网站", 10000),
("浏览产品", 8000),
("添加购物车", 3000),
("提交订单", 2000),
("完成支付", 1500)
],
label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)"),
gap=2 # 设置漏斗各部分之间的间距
)
# 设置全局配置项
funnel.set_global_opts(
title_opts=opts.TitleOpts(title="电商网站用户转化漏斗")
)
# 渲染图表
funnel.render("funnel_chart.html")
效果展示:
7. 桑基图 (Sankey)
桑基图适用于展示数据的流动情况,如能量、资源或信息的流动和转换。
代码示例:
from pyecharts import options as opts
from pyecharts.charts import Sankey
# 创建桑基图实例
sankey = Sankey()
# 定义节点和链接
data = {
"nodes": [
{"name": "产品A"},
{"name": "产品B"},
{"name": "华东地区"},
{"name": "华南地区"},
{"name": "华北地区"}
],
"links": [
{"source": "产品A", "target": "华东地区", "value": 100},
{"source": "产品A", "target": "华南地区", "value": 80},
{"source": "产品A", "target": "华北地区", "value": 60},
{"source": "产品B", "target": "华东地区", "value": 90},
{"source": "产品B", "target": "华南地区", "value": 70},
{"source": "产品B", "target": "华北地区", "value": 50}
]
}
# 添加数据
sankey.add(
"产品销售流向",
nodes=data["nodes"],
links=data["links"],
linestyle_opt=opts.LineStyleOpts(opacity=0.6, curve=0.5, color="source"),
label_opts=opts.LabelOpts(position="right")
)
# 设置全局配置项
sankey.set_global_opts(
title_opts=opts.TitleOpts(title="产品销售流向桑基图"),
tooltip_opts=opts.TooltipOpts(formatter="{c}")
)
# 渲染图表
sankey.render("sankey_chart.html")
效果展示:
8. K线图 (Kline)
K线图适用于展示金融市场的交易数据,包括开盘价、最高价、最低价和收盘价。
代码示例:
from pyecharts import options as opts
from pyecharts.charts import Kline
# 创建K线图实例
kline = Kline()
# 添加数据
# 数据格式:[开盘价, 最高价, 最低价, 收盘价]
ohlc_data = [
[2320.26, 2320.26, 2287.3, 2315.32],
[2313.91, 2340.84, 2309.39, 2324.18],
[2322.39, 2322.39, 2286.47, 2305.89],
[2305.44, 2327.71, 2304.22, 2327.71],
[2327.39, 2339.28, 2322.81, 2338.38],
[2337.4, 2338.63, 2321.36, 2337.46],
[2337.46, 2364.8, 2337.46, 2356.82],
[2356.44, 2356.44, 2341.57, 2354.22],
[2355.36, 2368.9, 2347.89, 2363.97],
[2363.97, 2363.97, 2351.76, 2358.11]
]
# 日期数据
date_data = [
"2023-01-01", "2023-01-02", "2023-01-03", "2023-01-04", "2023-01-05",
"2023-01-06", "2023-01-07", "2023-01-08", "2023-01-09", "2023-01-10"
]
# 添加数据
kline.add_xaxis(date_data)
kline.add_yaxis("股票价格", ohlc_data)
# 设置全局配置项
kline.set_global_opts(
title_opts=opts.TitleOpts(title="股票K线图"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
legend_opts=opts.LegendOpts(pos_bottom="10%"),
datazoom_opts=[
opts.DataZoomOpts(type_="inside", xaxis_index=[0], range_start=30, range_end=100),
opts.DataZoomOpts(type_="slider", xaxis_index=[0], range_start=30, range_end=100)
],
yaxis_opts=opts.AxisOpts(is_scale=True)
)
# 渲染图表
kline.render("kline_chart.html")
效果展示:
效果展示:
Pyecharts高级特性
1. 图表组合
Pyecharts支持将多个图表组合在一起显示,创建仪表盘效果。
from pyecharts import options as opts
from pyecharts.charts import Bar, Line, Grid
# 创建柱状图和折线图
bar = Bar().add_xaxis(["1月", "2月", "3月"]).add_yaxis("销售额", [100, 200, 150])
line = Line().add_xaxis(["1月", "2月", "3月"]).add_yaxis("增长率", [0.1, 0.2, 0.15])
# 创建网格并添加图表
grid = Grid()
grid.add(bar, grid_opts=opts.GridOpts(pos_bottom="60%"))
grid.add(line, grid_opts=opts.GridOpts(pos_top="60%"))
# 设置全局配置项
grid.set_global_opts(title_opts=opts.TitleOpts(title="销售数据仪表盘"))
# 渲染图表
grid.render("dashboard.html")
2. 主题设置
Pyecharts提供了多种主题风格,可以根据需要选择不同的主题。
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType
# 创建柱状图并指定主题
bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
# 添加数据
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫"])
bar.add_yaxis("商家A", [5, 20, 36])
# 渲染图表
bar.render("dark_theme_chart.html")
# 其他可用主题
# ThemeType.LIGHT
# ThemeType.WHITE
# ThemeType.CHALK
# ThemeType.ESSOS
# ThemeType.INFOGRAPHIC
# ThemeType.MACARONS
# ThemeType.PURPLE_PASSION
# ThemeType.ROMA
# ThemeType.ROMANTIC
# ThemeType.SHINE
# ThemeType.VINTAGE
# ThemeType.WALDEN
# ThemeType.WESTEROS
# ThemeType.WONDERLAND
3. 动态交互效果
Pyecharts支持丰富的交互效果,如数据筛选、缩放、平移等。
from pyecharts import options as opts
from pyecharts.charts import Bar
# 创建柱状图
bar = Bar()
# 添加数据
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.add_yaxis("商家B", [15, 6, 45, 20, 35, 66])
# 设置全局配置项,启用交互功能
bar.set_global_opts(
title_opts=opts.TitleOpts(title="商品销量统计"),
tooltip_opts=opts.TooltipOpts(
trigger="axis",
axis_pointer_type="cross", # 十字光标
formatter="{b}: {c}" # 提示框格式化
),
datazoom_opts=[ # 数据缩放
opts.DataZoomOpts(type_="inside"), # 内置缩放
opts.DataZoomOpts(type_="slider") # 滑动条缩放
],
toolbox_opts=opts.ToolboxOpts(
feature={
"saveAsImage": {}, # 保存为图片
"dataZoom": {}, # 数据缩放
"restore": {}, # 重置
"dataView": {} # 数据视图
}
)
)
# 渲染图表
bar.render("interactive_chart.html")
使用Pyecharts的注意事项
版本兼容性
Pyecharts的API可能会随着版本更新而变化,使用前请确认你安装的Pyecharts版本,并参考对应版本的官方文档。
中文字体显示
在生成图表时,如果中文显示不正常,可以在初始化图表时设置字体:`init_opts=opts.InitOpts(page_title="页面标题", theme=ThemeType.WHITE)`
图表导出
Pyecharts生成的图表默认为HTML格式,可以在浏览器中查看和交互。如果需要导出为图片,可以使用`render_notebook()`在Jupyter环境中显示,然后手动截图。
数据量优化
当数据量较大时,图表可能会变得卡顿。可以考虑对数据进行采样、聚合或使用大数据可视化的优化方案。
练习题:Pyecharts实践
通过以下练习,实践如何使用Pyecharts创建各种图表:
练习题1:销售数据分析
使用Pyecharts创建柱状图,展示以下销售数据:
# 月度销售额数据 months = ["1月", "2月", "3月", "4月", "5月", "6月"] sales = [150, 230, 320, 280, 350, 420]
要求:添加标题、坐标轴标签、数据提示框,并为柱状图添加动画效果。
练习题2:学生成绩统计
使用Pyecharts创建饼图,展示学生成绩分布:
# 成绩分布数据
grades = [
("优秀(90-100)", 15),
("良好(80-89)", 25),
("中等(70-79)", 30),
("及格(60-69)", 15),
("不及格(0-59)", 15)
]
要求:添加标题、图例,显示每个部分的百分比,并为饼图设置合适的颜色。
练习题3:多图表组合
使用Pyecharts的Grid组件,创建一个包含柱状图和折线图的组合图表,展示以下数据:
# 月度数据 months = ["1月", "2月", "3月", "4月", "5月", "6月"] sales = [150, 230, 320, 280, 350, 420] users = [1000, 1200, 1500, 1800, 2000, 2500]
要求:柱状图展示销售额,折线图展示用户数量,使用不同的Y轴,并添加适当的标题和图例。
练习题4:地理数据可视化
使用Pyecharts创建中国地图,展示各省份的人口数据:
# 部分省份人口数据(单位:千万)
population_data = [
("广东", 12.6),
("山东", 10.2),
("河南", 9.8),
("江苏", 8.5),
("四川", 8.4),
("河北", 7.5),
("湖南", 6.7),
("浙江", 6.5),
("安徽", 6.1),
("湖北", 5.9)
]
要求:添加标题、视觉映射组件,设置合适的颜色范围,并显示各省份的名称和数据。
练习题5:自定义主题
选择一个Pyecharts主题,并创建一个自定义样式的图表:
- 选择一个你喜欢的主题(如DARK、WONDERLAND等)
- 创建一个包含至少两种数据系列的图表
- 自定义图表的标题、图例、提示框样式
- 添加至少一种交互功能(如数据缩放、导出图片等)