在数据可视化中,柱状图是一种常用且直观的图表类型。本文将介绍五个使用pyecharts库创建的柱状图示例,每个示例都有详细的代码解释和实现原理。
pyecahts图表源码
图表一:带百分比标签的堆叠柱状图
python
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
# 准备数据,包含值和百分比
list2 = [
{"value": 12, "percent": 12 / (12 + 3)},
{"value": 23, "percent": 23 / (23 + 21)},
{"value": 33, "percent": 33 / (33 + 5)},
{"value": 3, "percent": 3 / (3 + 52)},
{"value": 33, "percent": 33 / (33 + 43)},
]
list3 = [
{"value": 3, "percent": 3 / (12 + 3)},
{"value": 21, "percent": 21 / (23 + 21)},
{"value": 5, "percent": 5 / (33 + 5)},
{"value": 52, "percent": 52 / (3 + 52)},
{"value": 43, "percent": 43 / (33 + 43)},
]
# 创建图表对象并设置主题
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
# 添加X轴数据
.add_xaxis([1, 2, 3, 4, 5])
# 添加Y轴数据,设置堆叠和分类间距
.add_yaxis("product1", list2, stack="stack1", category_gap="50%")
.add_yaxis("product2", list3, stack="stack1", category_gap="50%")
# 设置系列配置项,特别是标签格式
.set_series_opts(
label_opts=opts.LabelOpts(
position="right",
formatter=JsCode(
"function(x){return Number(x.data.percent * 100).toFixed() + '%';}"
),
)
)
)
# 在notebook中显示图表
c.render_notebook()
首先,我们导入了必要的模块,包括pyecharts的选项、柱状图类、JS代码工具和主题设置。然后,我们准备了两组数据,每组数据都包含具体值和对应的百分比。
通过,我们创建了一个Bar对象并设置了主题为LIGHT。接着,我们添加了X轴数据和两组Y轴数据,并将它们设置为堆叠显示,分类间距为50%。
因为需要在图表上显示百分比,我们使用了JsCode工具来自定义标签格式化函数,将数据中的percent字段乘以100并取整,最后添加百分号。标签位置设置为右侧,以便更好地展示。
图表二:旋转X轴标签的柱状图
python
from pyecharts import options as opts
from pyecharts.charts import Bar
# 创建图表对象
c = (
Bar()
# 添加X轴数据,注意这里使用了较长的标签名称
.add_xaxis(
[
"名字很长的X轴标签1",
"名字很长的X轴标签2",
"名字很长的X轴标签3",
"名字很长的X轴标签4",
"名字很长的X轴标签5",
"名字很长的X轴标签6",
]
)
# 添加两组Y轴数据
.add_yaxis("商家A", [10, 20, 30, 40, 50, 40])
.add_yaxis("商家B", [20, 10, 40, 30, 40, 50])
# 设置全局配置项
.set_global_opts(
# 旋转X轴标签以解决过长问题
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
# 设置标题和副标题
title_opts=opts.TitleOpts(title="Bar-旋转X轴标签", subtitle="解决标签名字过长的问题"),
)
)
# 在notebook中显示图表
c.render_notebook()
首先,我们导入了必要的模块。然后,创建了一个Bar对象并添加了X轴数据,这里特意使用了较长的标签名称来演示问题。
通过,我们添加了两组Y轴数据,分别代表商家A和商家B。
因为X轴标签过长可能会导致重叠,我们在全局配置项中设置了X轴标签的旋转角度为-15度,这样标签会倾斜显示,避免重叠。同时,我们还设置了图表的标题和副标题,使图表更加完整。
图表三:基础堆叠柱状图
python
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker
# 创建图表对象
c = (
Bar()
# 使用Faker库生成X轴数据
.add_xaxis(Faker.choose())
# 添加两组Y轴数据并设置堆叠
.add_yaxis("商家A", Faker.values(), stack="stack1")
.add_yaxis("商家B", Faker.values(), stack="stack1")
# 设置系列配置项,隐藏标签
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
# 设置全局配置项,添加标题
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-堆叠数据(全部)"))
)
# 在notebook中显示图表
c.render_notebook()
首先,我们导入了必要的模块,包括Faker库用于生成模拟数据。
通过,我们创建了一个Bar对象,并使用Faker.choose()生成了X轴的类别数据。然后,添加了两组Y轴数据,都使用Faker.values()生成随机数值,并将它们设置为堆叠显示。
因为这里主要展示堆叠效果,我们隐藏了数据标签以避免图表过于拥挤。最后,我们添加了图表标题,使图表更加清晰。
图表四:带时间轴的宏观经济指标组合图表
这个图表是一个动态的组合可视化,通过时间轴展示2002-2011年全国各地区的多维度经济数据,并结合柱状图和饼图呈现详细数据与占比关系。
代码实现解析
首先,定义了核心函数 get_year_overlap_chart
,它接收一个年份参数并返回该年份的组合图表:
python
#数据可以去pyecharts官网获取
#####################################################################################
# 2002 - 2011 年的数据
def get_year_overlap_chart(year: int) -> Bar:
# 创建柱状图
bar = (Bar()
.add_xaxis(xaxis_data=name_list) # 添加地区名称作为X轴
# 添加6个数据系列
.add_yaxis(series_name="GDP", y_axis=total_data["dataGDP"][year], label_opts=opts.LabelOpts(is_show=False))
.add_yaxis(series_name="金融", y_axis=total_data["dataFinancial"][year], label_opts=opts.LabelOpts(is_show=False))
.add_yaxis(series_name="房地产", y_axis=total_data["dataEstate"][year], label_opts=opts.LabelOpts(is_show=False))
.add_yaxis(series_name="第一产业", y_axis=total_data["dataPI"][year], label_opts=opts.LabelOpts(is_show=False))
.add_yaxis(series_name="第二产业", y_axis=total_data["dataSI"][year], label_opts=opts.LabelOpts(is_show=False))
.add_yaxis(series_name="第三产业", y_axis=total_data["dataTI"][year], label_opts=opts.LabelOpts(is_show=False))
# 设置全局配置
.set_global_opts(
title_opts=opts.TitleOpts(title="{}全国宏观经济指标".format(year), subtitle="数据来自国家统计局"),
tooltip_opts=opts.TooltipOpts(is_show=True, trigger="axis", axis_pointer_type="shadow"),
legend_opts=opts.LegendOpts(selected_map={"GDP": False, "金融": False, "房地产": False})
)
)
# 创建饼图
pie = (Pie()
.add(
series_name="GDP占比",
data_pair=[
["第一产业", total_data["dataPI"]["{}sum".format(year)]],
["第二产业", total_data["dataSI"]["{}sum".format(year)]],
["第三产业", total_data["dataTI"]["{}sum".format(year)]]
],
center=["75%", "35%"], radius="28%"
)
.set_series_opts(tooltip_opts=opts.TooltipOpts(is_show=True, trigger="item"))
)
return bar.overlap(pie) # 重叠饼图到柱状图上
通过这段代码,我们可以看到:
-
柱状图部分 :展示了各地区(
name_list
)在六个经济指标上的数据,包括GDP、金融、房地产、第一产业、第二产业和第三产业。所有标签都被隐藏以避免图表拥挤。 -
图例配置 :默认将GDP、金融、房地产三个系列设置为不选中状态(
selected_map
),因为这三个指标数值通常远大于产业数据,这样设置可以让初始视图更清晰地展示产业结构。 -
饼图部分 :位于图表右侧(
center=["75%", "35%"]
),展示了该年份第一、二、三产业在GDP中的占比情况,数据来自各产业的年度总和(如total_data["dataPI"]["{}sum".format(year)]
)。 -
重叠显示 :使用
.overlap(pie)
方法将饼图叠加到柱状图上,实现了两种图表类型的融合展示。
时间轴功能
代码的第二部分创建了时间轴,实现了数据的动态展示:
python
timeline = Timeline()
for y in range(2002, 2012):
timeline.add(get_year_overlap_chart(year=y), time_point=str(y))
timeline.add_schema(is_auto_play=True, play_interval=1000)
timeline.render_notebook()
因为添加了时间轴,图表可以自动播放(is_auto_play=True
),每1000毫秒切换一个年份(play_interval=1000
),直观地展示2002-2011年十年间经济数据的变化趋势。
图表特点
- 多维度数据展示:同时呈现六个经济指标,提供全面的经济图景。
- 组合可视化:柱状图展示地区差异,饼图展示产业结构,互补性强。
- 交互式体验:时间轴动画展示数据变化,图例可交互切换指标显示。
- 数据层次清晰:通过默认隐藏大数值指标,突出展示产业结构比例。
这个图表设计巧妙,既展示了各地区的详细经济数据,又呈现了全国层面的产业结构,同时通过时间轴展示了十年间的变化趋势,是一个信息密度高、交互性强的综合可视化作品。
图表五:使用字典配置的基础柱状图
这个图表展示了pyecharts库的另一种配置方式------通过字典进行配置,更加灵活简洁。
代码实现解析
python
from pyecharts.charts import Bar
from pyecharts.faker import Faker
from pyecharts.globals import ThemeType
c = (
Bar({"theme": ThemeType.MACARONS}) # 使用字典配置主题
.add_xaxis(Faker.choose()) # 添加X轴数据
.add_yaxis("商家A", Faker.values()) # 添加商家A的数据
.add_yaxis("商家B", Faker.values()) # 添加商家B的数据
.set_global_opts(
title_opts={"text": "Bar-通过 dict 进行配置", "subtext": "我也是通过 dict 进行配置的"}
)
#.render("bar_base_dict_config.html")
)
c.render_notebook()
核心特点
-
字典配置方式 :与之前使用
opts
对象不同,这里直接使用Python字典进行配置。例如:Bar({"theme": ThemeType.MACARONS})
:通过字典设置主题title_opts={"text": "Bar-通过 dict 进行配置", "subtext": "我也是通过 dict 进行配置的"}
:通过字典设置标题
-
马卡龙主题 :使用了
ThemeType.MACARONS
主题,这是pyecharts提供的一种色彩鲜艳、现代感强的主题风格。 -
模拟数据 :继续使用
Faker
库生成模拟数据:Faker.choose()
:生成类别数据作为X轴Faker.values()
:生成随机数值作为Y轴数据
-
简洁明了:代码结构简单,易于理解,适合初学者上手。
与其他图表的对比
与前面的图表相比,这个图表的最大特点是配置方式的不同。pyecharts支持两种主要配置方式:
- 对象配置:使用
opts
相关类,如opts.TitleOpts
、opts.AxisOpts
等 - 字典配置:直接使用Python字典,键为配置项名称,值为配置值
两种方式各有优势:对象配置提供了更好的类型提示和自动补全,而字典配置更加灵活简洁。
适用场景
这种基础柱状图适用于:
- 简单的数据对比展示
- 快速生成图表原型
- 学习pyecharts的基础用法
- 需要使用字典配置方式的场景
这个图表虽然简单,但展示了pyecharts的核心功能和灵活的配置方式,是学习pyecharts的很好起点。