一、引言
在大数据和信息爆炸的时代,数据可视化成为了信息传递和展示的关键手段。通过直观的图表和图形,我们能够更好地理解数据,挖掘其背后的信息。Pyecharts,作为一款基于Python的数据可视化库,凭借其丰富的图表类型和灵活的配置选项,成为了数据可视化领域的佼佼者。
Pyecharts的特点和优势主要包括:
- 丰富的图表类型:Pyecharts支持多种常见的图表类型,如折线图、柱状图、饼图、地图等,满足各种数据可视化的需求。
- 灵活的配置选项:Pyecharts提供了丰富的配置项和参数,用户可以根据需要自定义图表的样式、布局等,使图表更加符合个人或团队的风格。
- 易于集成:Pyecharts可以与Python的各种Web框架(如Flask、Django)无缝集成,方便在Web应用中展示数据可视化图表。
- 交互式图表:Pyecharts支持创建交互式图表,用户可以通过鼠标点击、拖动等方式与图表进行交互,更深入地探索数据。
本文的目的是详细介绍Pyecharts的使用方法和一些常见的图表类型,并通过实际案例展示Pyecharts在数据可视化中的应用。
二、Pyecharts基础
1. Pyecharts的安装和基本使用
安装:
Pyecharts的安装非常简单,可以通过pip进行安装。在命令行中输入以下命令即可:
pip install pyecharts
基本使用:
使用Pyecharts创建图表的基本步骤包括:
- 导入所需的库和模块。
- 创建一个图表对象(如折线图对象、柱状图对象等)。
- 添加数据到图表中(使用add_xaxis()和add_yaxis()等方法)。
- 配置图表的样式和布局(使用各种配置项和参数)。
- 渲染图表并保存为图片或HTML文件。
以下是一个简单的示例,展示如何使用Pyecharts创建一个柱状图:
from pyecharts.charts import Bar
from pyecharts import options as opts
# 创建一个柱状图对象
bar = Bar()
# 添加数据到图表中
bar.add_xaxis(["A", "B", "C", "D", "E"])
bar.add_yaxis("Series", [10, 20, 30, 40, 50])
# 配置图表的样式和布局(可选)
bar.set_global_opts(title_opts=opts.TitleOpts(title="My Bar Chart"))
# 渲染图表并保存为HTML文件
bar.render("my_bar_chart.html")
结果如下3.1所示:
2. 常用的配置项和参数介绍
Pyecharts提供了丰富的配置项和参数,用于自定义图表的样式、布局等。以下是一些常用的配置项和参数:
- 标题配置:使用
title_opts
参数配置图表的标题,包括标题文本、位置、颜色等。 - 坐标轴配置:使用
xaxis_opts
和yaxis_opts
参数配置X轴和Y轴的样式和属性,如标签、刻度线、分割线等。 - 数据项配置:使用
add_xaxis()
和add_yaxis()
等方法添加数据到图表中,并可以配置数据项的样式和属性,如颜色、标记符号等。 - 全局配置项:使用
set_global_opts()
方法配置图表的全局样式和布局,如标题、图例、背景色等。 - 其他配置项:根据不同的图表类型,还有一些特定的配置项和参数可供选择,如饼图的扇区标签、地图的区域颜色等。
通过合理配置这些参数,用户可以创建出符合自己需求的精美图表。
三、基础图表绘制
1. 柱状图(Bar Chart)
from pyecharts.charts import Bar
from pyecharts import options as opts
# 创建一个柱状图对象
bar = Bar()
# 添加数据到图表中
bar.add_xaxis(["A", "B", "C", "D", "E"])
bar.add_yaxis("Series", [10, 20, 30, 40, 50])
# 配置图表的样式和布局(可选)
bar.set_global_opts(title_opts=opts.TitleOpts(title="My Bar Chart"))
# 渲染图表并保存为HTML文件
bar.render("my_bar_chart.html")
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
.render("bar_base.html")
)
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))
.add_xaxis([1, 2, 3, 4, 5])
.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() + '%';}"
),
)
)
.render("stack_bar_percent.html")
)
2. 折线图(Line Chart)
import pyecharts.options as opts
from pyecharts.charts import Line
"""
Gallery 使用 pyecharts 1.1.0
参考地址: https://echarts.apache.org/examples/editor.html?c=line-stack
目前无法实现的功能:
暂无
"""
x_data = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
y_data = [820, 932, 901, 934, 1290, 1330, 1320]
(
Line()
.add_xaxis(xaxis_data=x_data)
.add_yaxis(
series_name="邮件营销",
stack="总量",
y_axis=[120, 132, 101, 134, 90, 230, 210],
label_opts=opts.LabelOpts(is_show=False),
)
.add_yaxis(
series_name="联盟广告",
stack="总量",
y_axis=[220, 182, 191, 234, 290, 330, 310],
label_opts=opts.LabelOpts(is_show=False),
)
.add_yaxis(
series_name="视频广告",
stack="总量",
y_axis=[150, 232, 201, 154, 190, 330, 410],
label_opts=opts.LabelOpts(is_show=False),
)
.add_yaxis(
series_name="直接访问",
stack="总量",
y_axis=[320, 332, 301, 334, 390, 330, 320],
label_opts=opts.LabelOpts(is_show=False),
)
.add_yaxis(
series_name="搜索引擎",
stack="总量",
y_axis=[820, 932, 901, 934, 1290, 1330, 1320],
label_opts=opts.LabelOpts(is_show=False),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="折线图堆叠"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
yaxis_opts=opts.AxisOpts(
type_="value",
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
)
.render("stacked_line_chart.html")
)
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker
c = (
Line()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values(), areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
.add_yaxis("商家B", Faker.values(), areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
.set_global_opts(title_opts=opts.TitleOpts(title="Line-面积图"))
.render("line_area_style.html")
)
3. 散点图(Scatter Chart)
from pyecharts import options as opts
from pyecharts.charts import Scatter
from pyecharts.faker import Faker
c = (
Scatter()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title="Scatter-VisualMap(Color)"),
visualmap_opts=opts.VisualMapOpts(max_=150),
)
.render("scatter_visualmap_color.html")
)
from pyecharts import options as opts
from pyecharts.charts import Scatter
from pyecharts.faker import Faker
c = (
Scatter()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title="Scatter-VisualMap(Size)"),
visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20),
)
.render("scatter_visualmap_size.html")
)
4. 饼图(Pie Chart)
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
c = (
Pie()
.add("", [list(z) for z in zip(Faker.choose(), Faker.values())])
.set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-设置颜色"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
.render("pie_set_color.html")
)
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
v = Faker.choose()
c = (
Pie()
.add(
"",
[list(z) for z in zip(v, Faker.values())],
radius=["30%", "75%"],
center=["25%", "50%"],
rosetype="radius",
label_opts=opts.LabelOpts(is_show=False),
)
.add(
"",
[list(z) for z in zip(v, Faker.values())],
radius=["30%", "75%"],
center=["75%", "50%"],
rosetype="area",
)
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-玫瑰图示例"))
.render("pie_rosetype.html")
)
四、进阶图表绘制
1. 地图(Map)
from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker
c = (
Map()
.add("商家A", [list(z) for z in zip(Faker.guangdong_city, Faker.values())], "广东")
.set_global_opts(
title_opts=opts.TitleOpts(title="Map-广东地图"), visualmap_opts=opts.VisualMapOpts()
)
.render("map_guangdong.html")
)
from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker
c = (
Map()
.add("商家A", [list(z) for z in zip(Faker.provinces, Faker.values())], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="Map-VisualMap(连续型)"),
visualmap_opts=opts.VisualMapOpts(max_=200),
)
.render("map_visualmap.html")
)
from pyecharts import options as opts
from pyecharts.charts import Map3D
from pyecharts.globals import ChartType
example_data = [
[[119.107078, 36.70925, 1000], [116.587245, 35.415393, 1000]],
[[117.000923, 36.675807], [120.355173, 36.082982]],
[[118.047648, 36.814939], [118.66471, 37.434564]],
[[121.391382, 37.539297], [119.107078, 36.70925]],
[[116.587245, 35.415393], [122.116394, 37.509691]],
[[119.461208, 35.428588], [118.326443, 35.065282]],
[[116.307428, 37.453968], [115.469381, 35.246531]],
]
c = (
Map3D()
.add_schema(
maptype="山东",
itemstyle_opts=opts.ItemStyleOpts(
color="rgb(5,101,123)",
opacity=1,
border_width=0.8,
border_color="rgb(62,215,213)",
),
light_opts=opts.Map3DLightOpts(
main_color="#fff",
main_intensity=1.2,
is_main_shadow=False,
main_alpha=55,
main_beta=10,
ambient_intensity=0.3,
),
view_control_opts=opts.Map3DViewControlOpts(center=[-10, 0, 10]),
post_effect_opts=opts.Map3DPostEffectOpts(is_enable=False),
)
.add(
series_name="",
data_pair=example_data,
type_=ChartType.LINES3D,
effect=opts.Lines3DEffectOpts(
is_show=True,
period=4,
trail_width=3,
trail_length=0.5,
trail_color="#f00",
trail_opacity=1,
),
linestyle_opts=opts.LineStyleOpts(is_show=False, color="#fff", opacity=0),
)
.set_global_opts(title_opts=opts.TitleOpts(title="Map3D-Lines3D"))
.render("map3d_with_lines3d.html")
)
2. 雷达图(Radar Chart)
from pyecharts import options as opts
from pyecharts.charts import Radar
value_bj = [
[55, 9, 56, 0.46, 18, 6, 1],
[25, 11, 21, 0.65, 34, 9, 2],
[56, 7, 63, 0.3, 14, 5, 3],
[33, 7, 29, 0.33, 16, 6, 4],
[42, 24, 44, 0.76, 40, 16, 5],
[82, 58, 90, 1.77, 68, 33, 6],
[74, 49, 77, 1.46, 48, 27, 7],
[78, 55, 80, 1.29, 59, 29, 8],
[267, 216, 280, 4.8, 108, 64, 9],
[185, 127, 216, 2.52, 61, 27, 10],
[39, 19, 38, 0.57, 31, 15, 11],
[41, 11, 40, 0.43, 21, 7, 12],
]
value_sh = [
[91, 45, 125, 0.82, 34, 23, 1],
[65, 27, 78, 0.86, 45, 29, 2],
[83, 60, 84, 1.09, 73, 27, 3],
[109, 81, 121, 1.28, 68, 51, 4],
[106, 77, 114, 1.07, 55, 51, 5],
[109, 81, 121, 1.28, 68, 51, 6],
[106, 77, 114, 1.07, 55, 51, 7],
[89, 65, 78, 0.86, 51, 26, 8],
[53, 33, 47, 0.64, 50, 17, 9],
[80, 55, 80, 1.01, 75, 24, 10],
[117, 81, 124, 1.03, 45, 24, 11],
[99, 71, 142, 1.1, 62, 42, 12],
]
c_schema = [
{"name": "AQI", "max": 300, "min": 5},
{"name": "PM2.5", "max": 250, "min": 20},
{"name": "PM10", "max": 300, "min": 5},
{"name": "CO", "max": 5},
{"name": "NO2", "max": 200},
{"name": "SO2", "max": 100},
]
c = (
Radar()
.add_schema(schema=c_schema, shape="circle")
.add("北京", value_bj, color="#f9713c")
.add("上海", value_sh, color="#b3e4a1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="Radar-空气质量"))
.render("radar_air_quality.html")
)
3. 词云图(Word Cloud)
import pyecharts.options as opts
from pyecharts.charts import WordCloud
"""
Gallery 使用 pyecharts 1.1.0
参考地址: https://gallery.echartsjs.com/editor.html?c=xS1jMxuOVm
目前无法实现的功能:
1、暂无
"""
data = [
("生活资源", "999"),
("供热管理", "888"),
,...,
("社会福利及事务", "11"),
("一次供水问题", "11"),
]
(
WordCloud()
.add(series_name="热点分析", data_pair=data, word_size_range=[6, 66])
.set_global_opts(
title_opts=opts.TitleOpts(
title="热点分析", title_textstyle_opts=opts.TextStyleOpts(font_size=23)
),
tooltip_opts=opts.TooltipOpts(is_show=True),
)
.render("basic_wordcloud.html")
)
4. 热力图(Heatmap)
import random
from pyecharts import options as opts
from pyecharts.charts import HeatMap
from pyecharts.faker import Faker
value = [[i, j, random.randint(0, 50)] for i in range(24) for j in range(7)]
c = (
HeatMap()
.add_xaxis(Faker.clock)
.add_yaxis(
"series0",
Faker.week,
value,
label_opts=opts.LabelOpts(is_show=True, position="inside"),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="HeatMap-Label 显示"),
visualmap_opts=opts.VisualMapOpts(),
)
.render("heatmap_with_label_show.html")
)
五、其他类型图片
1. 3d柱状图
具体参考链接:https://gallery.pyecharts.org/#/Bar3D/bar3d_punch_card
2. K线图
具体参考链接:https://gallery.pyecharts.org/#/Candlestick/professional_kline_chart
3. 漏斗图
具体参考链接:https://gallery.pyecharts.org/#/Funnel/funnel_base
4. 桑基图
具体参考链接:https://gallery.pyecharts.org/#/Sankey/sankey_diagram
在Pyecharts库还存在一系列优秀的可绘制的图形,如旭日图、关系图、日历图和树状图等,需要去查阅官方文档进行详细的了解。
六、Pyecharts组件
1. 层叠组件:Overlap - Overlap_bar_line
Overlap是Pyecharts中的一种特殊图表类型,它允许用户将多个不同类型的图表叠加在一个坐标系中,从而实现多图表的对比展示。例如,可以将柱状图和折线图叠加,以在同一视图中同时展示两种类型的数据。通过Overlap类,用户可以使用如Line类、Scatter类和Bar类等创建多个不同类型的图表实例,并将它们叠加在同一张图上展示。
Overlap类的主要方法包括:
- add:向Overlap中添加单个图表实例。
- extend_axis:为Overlap中的指定轴添加双轴支持。
- set_global_opts:设置全局参数。
from pyecharts import options as opts
from pyecharts.charts import Bar, Line
from pyecharts.faker import Faker
v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]
v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3]
v3 = [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2]
bar = (
Bar()
.add_xaxis(Faker.months)
.add_yaxis("蒸发量", v1)
.add_yaxis("降水量", v2)
.extend_axis(
yaxis=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(formatter="{value} °C"), interval=5
)
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="Overlap-bar+line"),
yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} ml")),
)
)
line = Line().add_xaxis(Faker.months).add_yaxis("平均温度", v3, yaxis_index=1)
bar.overlap(line)
bar.render("overlap_bar_line.html")
2、页面组件
页面组件如标题组件(TitleOpts)在Pyecharts中用于定制图表的显示。以标题组件为例,它允许用户控制标题的显示、文本内容、链接、跳转方式以及副标题等。通过这些设置,用户可以创建出更符合自己需求的图表展示。
具体参考:https://gallery.pyecharts.org/#/Page/page_simple_layout
七、总结与展望
1. 总结Pyecharts在数据可视化方面的优势和不足
优势:
-
丰富的图表类型:Pyecharts支持多种类型的图表,包括折线图、柱状图、散点图、饼图、地图等,满足了数据可视化的各种需求。
-
易于使用:Pyecharts提供了简洁易懂的API接口,使得用户能够快速地创建出美观的图表。同时,它还提供了丰富的配置项,允许用户自定义图表的外观和行为。
-
交互式图表:Pyecharts支持创建交互式图表,用户可以通过点击、拖动等方式与图表进行交互,增强了数据的展示效果和用户的参与感。
-
跨平台支持:Pyecharts生成的图表可以在多种平台上展示,包括网页、桌面应用等,具有良好的兼容性。
-
高度可定制:Pyecharts允许用户自定义图表的各个部分,包括颜色、字体、标签等,使得用户能够根据自己的需求定制出独特的图表。
不足:
-
性能问题:在处理大规模数据集时,Pyecharts的性能可能会受到影响,导致渲染速度变慢。
-
社区活跃度:虽然Pyecharts有一定的用户基础,但相对于其他一些流行的数据可视化库(如D3.js、Plotly等),其社区活跃度可能较低,这可能会影响到用户获取帮助和解决问题的速度。
-
文档和示例不足:虽然Pyecharts的文档涵盖了基本的使用方法和一些常见配置项,但对于一些高级用法和特定场景下的配置,文档可能不够详细。同时,提供的示例也相对较少,这可能会增加用户的学习成本。
-
集成其他工具的能力有限:Pyecharts主要关注于生成图表本身,而在与其他工具(如数据库、数据分析库等)的集成方面可能存在一定的限制。这可能会使得用户在使用Pyecharts时需要花费额外的时间和精力来进行数据预处理和集成工作。
2. 对未来数据可视化技术的展望
-
智能化和自动化:随着人工智能和机器学习技术的发展,未来的数据可视化技术将更加智能化和自动化。例如,通过机器学习算法自动选择最适合的图表类型和配置参数;通过自然语言处理技术使得用户能够通过自然语言来查询和展示数据等。
-
实时性和动态性:随着物联网和大数据技术的发展,未来的数据可视化技术将更加注重实时性和动态性。用户需要能够实时地查看和更新数据,并通过动态图表来展示数据的变化趋势。
-
跨平台和多设备支持:未来的数据可视化技术将更加注重跨平台和多设备支持。用户需要能够在各种设备和平台上查看和交互图表,包括手机、平板、电脑等。
-
安全性和隐私保护:随着数据安全和隐私保护问题的日益突出,未来的数据可视化技术将更加注重安全性和隐私保护。例如,通过加密技术来保护数据的安全;通过访问控制和权限管理来限制用户对数据的访问等。
-
可视化和分析的深度融合:未来的数据可视化技术将更加注重可视化和分析的深度融合。用户需要能够通过图表来直观地展示数据,并通过分析功能来深入挖掘数据背后的规律和趋势。这将使得数据可视化技术成为数据分析中不可或缺的一部分。
八、附录
- Pyecharts官方文档链接:https://pyecharts.org/#