每日五个pyecharts可视化图表日历图和箱线图:从入门到精通
📊 本文特色:从零开始掌握日历图和箱线图可视化技巧,包含多个完整实例、核心配置项解析和实用场景指南,助您快速构建专业数据可视化图表。pyecharts源码
目录
- 什么是日历图和箱线图?
- 📅 日历图(Calendar)
- 📊 箱线图(Boxplot)
- 环境准备
- 📋 基础依赖
- 🔧 安装步骤
- 基础日历图实现
- 代码详解
- 📌 日历图关键点总结
- 更多图表实现
- 图表2:Calendar_heatmap(高级日历图)
- 代码详解
- 📌 Calendar_heatmap关键点总结
- 图表2与图表1的对比
- 图表3:BoxPlot-基本示例(基础箱线图)
- 代码详解
- 📌 箱线图关键点总结
- 箱线图核心参数解释
- 图表4:Boxplot & Scatter 组合图表(高级箱线图)
- 代码详解
- 📌 组合图表关键点总结
- 组合图表的优势
- 图表5:多类别箱线图(自定义提示框)
- 代码详解
- 📌 多类别箱线图关键点总结
- 自定义提示框的优势
- 常见问题解答
- ❓ 日历图数据格式有什么要求?
- ❓ 如何更改日历图的颜色主题?
- ❓ 日历图支持哪些交互功能?
- 总结与展望
- 核心收获
- 实用建议
- 进阶方向
日历图和箱线图是两种非常实用的数据可视化图表类型,它们分别适用于不同的数据展示场景。本教程将从基础到进阶,帮助您系统掌握这两种图表的使用方法。
什么是日历图和箱线图?
📅 日历图(Calendar)
日历图以日历的形式展示数据随时间的变化,通过颜色深浅直观呈现数值大小,非常适合展示全年或长时间范围内的趋势变化。
核心优势:
- 时间维度清晰,直观展示数据在全年的分布
- 色彩渐变效果突出异常值和趋势模式
- 适合展示步数、销售额、访问量等日常记录数据
典型应用场景:
- 健康数据跟踪(步数、心率等)
- 业务销售数据分析
- 网站访问量统计
- 气象数据可视化
📊 箱线图(Boxplot)
箱线图通过显示一组数据的最小值、第一四分位数、中位数、第三四分位数和最大值,直观地展示数据分布特征和异常值。
核心优势:
- 有效识别数据集中的异常值
- 比较多组数据的分布特征
- 不受样本量影响的统计可视化
- 清晰展示数据的离散程度
典型应用场景:
- 质量控制和过程监控
- 实验数据结果分析
- 多组数据对比分析
- 金融风险评估
环境准备
日历图和箱线图开发需要以下环境支持,请确保系统已正确配置:
📋 基础依赖
- Python 3.6+(推荐3.8+版本)
- pyecharts 1.9.0+(本教程基于最新版开发)
🔧 安装步骤
# 创建并激活虚拟环境(推荐)
python -m venv venv
# Windows激活虚拟环境
venv\Scripts\activate
# macOS/Linux激活虚拟环境
# source venv/bin/activate# 安装依赖包
pip install pyecharts==2.0.3# 验证安装
python -c "import pyecharts; print('pyecharts版本:', pyecharts.__version__)"
💡 提示:使用虚拟环境可以避免包版本冲突,是Python项目开发的最佳实践。如果不需要虚拟环境,可以直接执行
pip install pyecharts
命令。
基础日历图实现
下面是一个基础日历图的实现代码,展示了2017年全年的微信步数情况:
import datetime # 导入日期时间处理模块
import random # 导入随机数生成模块from pyecharts import options as opts # 导入pyecharts配置选项
from pyecharts.charts import Calendar # 导入日历图图表类型begin = datetime.date(2017, 1, 1) # 设置开始日期为2017年1月1日
end = datetime.date(2017, 12, 31) # 设置结束日期为2017年12月31日
# 生成2017年全年每一天的数据,数据格式为[日期字符串, 随机数值]
data = [[str(begin + datetime.timedelta(days=i)), random.randint(1000, 25000)]for i in range((end - begin).days + 1)
]# 创建日历图实例并配置
c = (Calendar() # 初始化日历图# 添加数据,设置日历范围为2017年.add("", data, calendar_opts=opts.CalendarOpts(range_="2017")).set_global_opts(title_opts=opts.TitleOpts(title="Calendar-2017年微信步数情况"), # 设置图表标题visualmap_opts=opts.VisualMapOpts(max_=20000, # 视觉映射最大值min_=500, # 视觉映射最小值orient="horizontal", # 水平方向显示is_piecewise=True, # 分段显示pos_top="230px", # 视觉映射组件顶部位置pos_left="100px", # 视觉映射组件左侧位置),)#.render("calendar_base.html") # 渲染到HTML文件(可选)
)
# 在Jupyter Notebook中渲染图表
c.render_notebook()
代码详解
-
导入模块:
datetime
:用于处理日期和时间random
:用于生成随机数据pyecharts.options
:用于配置图表选项pyecharts.charts.Calendar
:用于创建日历图
-
数据准备:
- 设置数据的开始和结束日期(2017年全年)
- 使用列表推导式生成全年每一天的数据,格式为[日期字符串, 数值]
- 这里使用
random.randint(1000, 25000)
模拟每日微信步数
-
创建图表:
Calendar()
:创建日历图实例.add("", data, calendar_opts=opts.CalendarOpts(range_="2017"))
:添加数据并设置日历范围.set_global_opts()
:设置全局选项title_opts
:设置图表标题visualmap_opts
:配置视觉映射,控制日历中颜色深浅对应的数值范围
-
渲染展示:
render_notebook()
:在Jupyter Notebook中显示图表- 如果需要保存为HTML文件,可以取消注释
.render("calendar_base.html")
📌 日历图关键点总结
- 数据格式必须是
[日期字符串, 数值]
的列表形式 CalendarOpts(range_)
参数用于指定日历的年份范围- 视觉映射组件(
VisualMapOpts
)控制颜色与数值的对应关系 - 适合展示全年或特定时间段内的数据分布情况
更多图表实现
图表2:Calendar_heatmap(高级日历图)
下面是一个高级日历图的实现代码,展示了2017年全年步数情况的热图效果:
import random # 导入随机数生成模块
import datetime # 导入日期时间处理模块import pyecharts.options as opts # 导入pyecharts配置选项
from pyecharts.charts import Calendar # 导入日历图图表类型begin = datetime.date(2017, 1, 1) # 设置开始日期为2017年1月1日
end = datetime.date(2017, 12, 31) # 设置结束日期为2017年12月31日
# 生成2017年全年每一天的数据,数据格式为[日期字符串, 随机数值]
data = [[str(begin + datetime.timedelta(days=i)), random.randint(1000, 25000)]for i in range((end - begin).days + 1)
](Calendar() # 初始化日历图.add(series_name="", # 系列名称为空yaxis_data=data, # 设置Y轴数据calendar_opts=opts.CalendarOpts(pos_top="120", # 日历图距离顶部的距离pos_left="30", # 日历图距离左侧的距离pos_right="30", # 日历图距离右侧的距离range_="2017", # 日历的年份范围yearlabel_opts=opts.CalendarYearLabelOpts(is_show=False), # 不显示年份标签),).set_global_opts(title_opts=opts.TitleOpts(pos_top="30", pos_left="center", title="2017年步数情况"), # 设置标题位置和内容visualmap_opts=opts.VisualMapOpts(max_=20000, # 视觉映射最大值min_=500, # 视觉映射最小值orient="horizontal", # 水平方向显示is_piecewise=False # 连续显示,非分段),)#.render("calendar_heatmap.html") # 渲染到HTML文件(可选).render_notebook() # 在Jupyter Notebook中渲染
)
代码详解
-
数据准备:
- 与基础日历图相同,使用
datetime
和random
模块生成2017年全年的数据 - 数据格式保持为
[日期字符串, 数值]
的列表形式
- 与基础日历图相同,使用
-
布局优化:
- 通过
pos_top
、pos_left
和pos_right
参数调整日历图在容器中的位置 - 这些参数可以使图表在不同尺寸的显示区域中更好地布局
- 通过
-
视觉效果优化:
- 设置
yearlabel_opts=opts.CalendarYearLabelOpts(is_show=False)
隐藏年份标签 - 这可以使日历图更加简洁,专注于数据本身
- 设置
-
颜色映射调整:
- 设置
is_piecewise=False
使颜色映射变为连续渐变 - 连续渐变比分段显示更加平滑,适合展示热图效果
- 设置
📌 Calendar_heatmap关键点总结
- 可以通过
pos_top
、pos_left
和pos_right
参数精确控制图表位置 is_show=False
可以隐藏不需要的标签,使图表更加简洁is_piecewise=False
启用连续颜色渐变,适合热图展示- 这种配置更适合创建专业的数据分析仪表盘
图表2与图表1的对比
特性 | 基础日历图(图表1) | 高级日历图(图表2) |
---|---|---|
标题位置 | 默认位置 | 顶部居中(pos_top=“30”, pos_left=“center”) |
日历位置 | 默认位置 | 自定义边距(pos_top=“120”, pos_left=“30”, pos_right=“30”) |
年份标签 | 显示 | 隐藏(is_show=False) |
颜色映射 | 分段显示(is_piecewise=True) | 连续渐变(is_piecewise=False) |
适用场景 | 基础数据展示 | 专业仪表盘、报告 |
图表3:BoxPlot-基本示例(基础箱线图)
下面是一个基础箱线图的实现代码,展示了两组数据的分布情况:
from pyecharts import options as opts # 导入pyecharts配置选项
from pyecharts.charts import Boxplot # 导入箱线图图表类型# 准备数据,v1和v2分别代表两组不同的数据系列
v1 = [[850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980], # 第一组数据[960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790], # 第二组数据
]
v2 = [[890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920], # 第三组数据[890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870], # 第四组数据
]# 创建箱线图实例
c = Boxplot()
c.add_xaxis(["expr1", "expr2"]) # 设置X轴数据
c.add_yaxis("A", c.prepare_data(v1)) # 添加Y轴数据系列A,注意需要使用prepare_data处理数据
c.add_yaxis("B", c.prepare_data(v2)) # 添加Y轴数据系列B,同样需要使用prepare_data处理数据
c.set_global_opts(title_opts=opts.TitleOpts(title="BoxPlot-基本示例")) # 设置图表标题
#c.render("boxplot_base.html") # 渲染到HTML文件(可选)
c.render_notebook() # 在Jupyter Notebook中渲染
代码详解
-
导入模块:
pyecharts.options
:用于配置图表选项pyecharts.charts.Boxplot
:用于创建箱线图
-
数据准备:
- 准备了两组数据
v1
和v2
,每组数据又包含两个子组 - 这种嵌套列表的形式是箱线图的数据要求格式
- 准备了两组数据
-
数据预处理:
- 注意箱线图需要使用
prepare_data()
方法预处理数据 - 这是因为箱线图需要计算每个数据组的最小值、第一四分位数、中位数、第三四分位数和最大值
- 注意箱线图需要使用
-
创建图表:
Boxplot()
:创建箱线图实例- `.add_xaxis([“expr1”, “expr2”]):设置X轴的分类标签
.add_yaxis()
:添加Y轴数据系列,可以添加多个系列进行对比.set_global_opts()
:设置全局选项,如标题等
📌 箱线图关键点总结
- 数据格式必须是嵌套列表,外层列表代表不同的数据系列,内层列表代表每个系列的数据点
- 必须使用
prepare_data()
方法预处理数据,这是箱线图的特殊要求 - 箱线图非常适合比较多组数据的分布特征和离散程度
- 可以直观地识别数据中的异常值(箱线图中的"离群点")
箱线图核心参数解释
参数 | 说明 | 示例 |
---|---|---|
add_xaxis | 设置X轴的分类标签 | `add_xaxis([“类别1”, “类别2”, “类别3”]) |
add_yaxis | 添加Y轴数据系列 | add_yaxis("系列名称", data) |
prepare_data | 预处理箱线图数据,计算统计指标 | c.prepare_data(raw_data) |
set_global_opts | 设置全局选项 | set_global_opts(title_opts=...) |
图表4:Boxplot & Scatter 组合图表(高级箱线图)
下面是一个高级箱线图的实现代码,展示了箱线图与散点图的组合使用,模拟了著名的迈克尔逊-莫雷实验数据:
import pyecharts.options as opts
from pyecharts.charts import Grid, Boxplot, Scatter y_data = [ [ 850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960, ], [ 960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790, 810, 880, 880, 830, 800, 790, 760, 800, ], [ 880, 880, 880, 860, 720, 720, 620, 860, 970, 950, 880, 910, 850, 870, 840, 840, 850, 840, 840, 840, ], [ 890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920, 890, 860, 880, 720, 840, 850, 850, 780, ], [ 890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870, 810, 740, 810, 940, 950, 800, 810, 870, ],
]
scatter_data = [650, 620, 720, 720, 950, 970] box_plot = Boxplot() box_plot = ( box_plot.add_xaxis(xaxis_data=["expr 0", "expr 1", "expr 2", "expr 3", "expr 4"]) .add_yaxis(series_name="", y_axis=box_plot.prepare_data(y_data)) .set_global_opts( title_opts=opts.TitleOpts( pos_left="center", title="Michelson-Morley Experiment" ), tooltip_opts=opts.TooltipOpts(trigger="item", axis_pointer_type="shadow"), xaxis_opts=opts.AxisOpts( type_="category", boundary_gap=True, splitarea_opts=opts.SplitAreaOpts(is_show=False), axislabel_opts=opts.LabelOpts(formatter="expr {value}"), splitline_opts=opts.SplitLineOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( type_="value", name="km/s minus 299,000", splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1) ), ), ) .set_series_opts(tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}"))
) scatter = ( Scatter() .add_xaxis(xaxis_data=["expr 0", "expr 1", "expr 2", "expr 3", "expr 4"]) .add_yaxis(series_name="", y_axis=scatter_data) .set_global_opts( title_opts=opts.TitleOpts( pos_left="10%", pos_top="90%", title="upper: Q3 + 1.5 * IQR \nlower: Q1 - 1.5 * IQR", title_textstyle_opts=opts.TextStyleOpts( border_color="#999", border_width=1, font_size=14 ), ), yaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(is_show=False), axistick_opts=opts.AxisTickOpts(is_show=False), ), )
) grid = ( Grid() .add( box_plot, grid_opts=opts.GridOpts(pos_left="10%", pos_right="10%", pos_bottom="15%"), ) .add( scatter, grid_opts=opts.GridOpts(pos_left="10%", pos_right="10%", pos_bottom="15%"), ) #.render("boxplot_light_velocity.html")
)
grid.render_notebook()
代码详解
-
数据准备:
y_data
:包含5组实验数据,每组有20个数据点,模拟迈克尔逊-莫雷实验的测量结果scatter_data
:一组特殊的散点数据,用于在图表上标记特定点(如异常值或参考点)
-
创建箱线图:
- 使用
Boxplot()
创建箱线图实例 - 添加X轴数据,对应5个实验表达式
- 使用
prepare_data()
方法预处理箱线图数据 - 配置全局选项,包括标题、提示框、坐标轴样式等
- 设置Y轴名称为"km/s minus 299,000",符合物理学实验的表示习惯
- 使用
-
创建散点图:
- 使用
Scatter()
创建散点图实例 - 添加相同的X轴数据
- 添加
scatter_data
作为Y轴数据 - 配置散点图的标题,解释箱线图的异常值判断标准
- 隐藏Y轴的标签和刻度,避免与箱线图的Y轴重复
- 使用
-
组合图表:
- 使用
Grid()
组件将箱线图和散点图组合在同一个画布上 - 通过
grid_opts
设置相同的网格选项,确保两个图表对齐 - 散点图会显示在箱线图的上方,两者共享同一坐标系
- 使用
📌 组合图表关键点总结
Grid()
组件是pyecharts中组合多个图表的强大工具- 可以通过
pos_left
、pos_right
、pos_bottom
等参数精确控制图表位置 - 箱线图与散点图组合可以同时展示数据分布和特定点标记
SplitAreaOpts
参数可以设置Y轴的分隔区域,增强可读性- 散点图的坐标轴选项可以独立配置,如隐藏标签和刻度
组合图表的优势
这种箱线图与散点图的组合有以下优势:
- 多层次信息展示:同时展示数据的整体分布特征和特定数据点
- 异常值可视化:可以清晰地标记和解释异常值的判断标准
- 增强可读性:通过网格布局和分隔区域,使复杂数据更加直观易懂
- 专业数据分析:适合科学实验、统计分析等专业场景
图表5:多类别箱线图(自定义提示框)
下面是一个多类别箱线图的实现代码,展示了如何添加多个数据系列并自定义提示框内容:
from pyecharts import options as opts
from pyecharts.charts import Boxplot
from pyecharts.commons.utils import JsCode# 省略数据字典(Boxplot().add_xaxis(xaxis_data=axis_data).add_yaxis(series_name="category0",y_axis=data[0]["boxData"],tooltip_opts=opts.TooltipOpts(formatter=JsCode("""function(param) { return ['Experiment ' + param.name + ': ','upper: ' + param.data[0],'Q1: ' + param.data[1],'median: ' + param.data[2],'Q3: ' + param.data[3],'lower: ' + param.data[4]].join('<br/>') }""")),).add_yaxis(series_name="category1",y_axis=data[1]["boxData"],tooltip_opts=opts.TooltipOpts(formatter=JsCode("""function(param) { return ['Experiment ' + param.name + ': ','upper: ' + param.data[0],'Q1: ' + param.data[1],'median: ' + param.data[2],'Q3: ' + param.data[3],'lower: ' + param.data[4]].join('<br/>') }""")),).add_yaxis(series_name="category2",y_axis=data[2]["boxData"],tooltip_opts=opts.TooltipOpts(formatter=JsCode("""function(param) { return ['Experiment ' + param.name + ': ','upper: ' + param.data[0],'Q1: ' + param.data[1],'median: ' + param.data[2],'Q3: ' + param.data[3],'lower: ' + param.data[4]].join('<br/>') }""")),).set_global_opts(title_opts=opts.TitleOpts(title="Multiple Categories", pos_left="center"),legend_opts=opts.LegendOpts(pos_top="3%"),tooltip_opts=opts.TooltipOpts(trigger="item", axis_pointer_type="shadow"),xaxis_opts=opts.AxisOpts(name_gap=30,boundary_gap=True,splitarea_opts=opts.SplitAreaOpts(areastyle_opts=opts.AreaStyleOpts(opacity=1)),axislabel_opts=opts.LabelOpts(formatter="expr {value}"),splitline_opts=opts.SplitLineOpts(is_show=False),),yaxis_opts=opts.AxisOpts(type_="value",min_=-400,max_=600,splitarea_opts=opts.SplitAreaOpts(is_show=False),),datazoom_opts=[opts.DataZoomOpts(type_="inside", range_start=0, range_end=20),opts.DataZoomOpts(type_="slider", xaxis_index=0, is_show=True),],)#.render("multiple_categories.html").render_notebook()
)
代码详解
-
数据准备:
axis_data
:X轴的分类标签data
:包含三个类别的数据字典,每个类别包含箱线图所需的统计数据- 每个箱线图数据点格式为
[upper, Q1, median, Q3, lower]
,对应箱线图的五个关键统计量
-
自定义提示框:
- 使用
JsCode
自定义提示框格式,展示箱线图的五个关键统计量 - 提示框内容使用HTML格式,通过
<br/>
实现换行 - 这种自定义格式使数据解读更加直观,用户可以清晰看到每个实验的统计指标
- 使用
-
多系列添加:
- 通过三次调用
add_yaxis
方法添加三个数据系列 - 每个系列使用不同的类别名称和对应的数据
- 每个系列都应用了相同的自定义提示框格式
- 通过三次调用
-
全局配置:
- 设置标题居中显示
- 图例放置在顶部3%的位置
- X轴设置了分隔区域,增强可读性
- 添加数据缩放功能,支持内部缩放和滑块缩放两种模式
- Y轴设置了固定的取值范围,确保图表展示效果
📌 多类别箱线图关键点总结
- 使用
JsCode
可以高度自定义提示框内容,满足专业数据展示需求 - 多系列箱线图通过多次调用
add_yaxis
实现,适合多组数据对比 datazoom_opts
参数为图表添加交互缩放功能,提升用户体验- 数据格式可以灵活定义为字典结构,便于管理多个类别的数据
boundary_gap
参数控制坐标轴两侧留白,影响图表视觉效果
自定义提示框的优势
自定义提示框为数据可视化带来以下优势:
- 信息丰富度:可以展示比默认提示框更多的统计信息
- 可读性:通过格式化排版,使数据更加易于理解
- 专业性:展示专业统计指标,满足高级数据分析需求
- 交互体验:鼠标悬停时提供详细数据解读,增强用户交互体验
后续将继续添加更多图表的实现,包括分组箱线图和自定义箱线图等。请继续关注本博客,获取更多pyecharts可视化技巧!
常见问题解答
❓ 日历图数据格式有什么要求?
日历图要求数据格式为[日期字符串, 数值]
的列表,日期字符串需要是YYYY-MM-DD
格式。例如:
data = [["2023-01-01", 1500], ["2023-01-02", 2000], ...]
❓ 如何更改日历图的颜色主题?
可以通过VisualMapOpts
中的range_color
参数自定义颜色:
visualmap_opts=opts.VisualMapOpts(range_color=["#e6f7ff", "#bae7ff", "#91d5ff", "#69c0ff", "#40a9ff"],# 其他配置...
)
❓ 日历图支持哪些交互功能?
日历图支持鼠标悬停显示详细信息,点击日期高亮等交互功能。可以通过tooltip_opts
自定义提示框内容。
💡 专业建议:数据可视化的核心是传递信息而非炫技。根据数据特点和展示需求选择合适的图表类型,才能让数据故事更清晰易懂。
总结与展望
通过本教程,我们系统学习了如何使用pyecharts创建五种实用的日历图和箱线图可视化图表,从基础到进阶,全面掌握了这两种图表类型的核心功能和高级应用。
核心收获
-
日历图应用:掌握了基础日历图和高级日历热图的实现方法,学会了通过位置调整、颜色映射和标签控制来优化视觉效果
-
箱线图技术:从基础箱线图到多类别箱线图,再到与散点图的组合应用,全面理解了箱线图在数据分布分析中的强大功能
-
高级技巧:学习了Grid组件的使用、自定义提示框、数据预处理等高级技巧,能够创建更加专业和个性化的可视化图表
实用建议
- 数据准备:日历图需要严格的日期格式数据,箱线图需要特定的嵌套列表结构,务必注意数据格式要求
- 视觉优化:合理使用位置参数、颜色映射和标签控制,可以显著提升图表的可读性和专业感
- 组合应用:尝试将不同图表类型组合使用,如箱线图与散点图的组合,能够展示更丰富的数据分析维度
进阶方向
- 探索更多pyecharts组件(如Tab、Timeline)与日历图/箱线图的结合应用
- 学习pyecharts的主题定制功能,创建符合特定品牌风格的可视化图表
- 研究大数据量下的图表性能优化技巧
- 结合实际业务场景,开发更复杂的交互式数据仪表盘
希望本教程能够帮助您更好地掌握pyecharts的日历图和箱线图可视化技术,为您的数据可视化工作提供有力支持!