欢迎关注 ,专注 Python、数据分析、数据挖掘、好玩工具!
如果要问:Python 中有那些可视化工具库?我想很多人都能想起来 matplotlib,这是一款初学者绕不开的库,但随着对数据可视化的要求越来越高,matplotlib 已无法满足了。
今天我将和大家详细讲解 Pyecharts 模块,说到它我们就不得不提 Echarts,它是一个由百度开源的数据可视化,结合巧妙的交互性,精巧的图表设计,得到了开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。分析遇上数据可视化时,pyecharts 诞生了。欢迎收藏学习,喜欢点赞支持。 文末提供技术交流群。
Pyecharts 具有如下特点:
- 简洁的API 设计,使用如丝滑般的照片,支持链式调用
- 囊括了30+种常见图表,应有尽有
- 支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab
- 可轻松集成至Flask,Django等主流Web框架
- 高度智能的配置项,可轻松搭配出精美的图表
- 详细的文档和示例,帮助开发者快速的上手项目
- 多达 400+ 地图文件以及自己的百度地图,为地理数据扩展提供用户支持
官方Github链接:https://github.com/pyecharts/pyecharts/
下面我们来详细讲解它
01 安装与导入模块
说到安装模块,我们可以这样来进行,
使用 Pyecharts 创建图形的基本步骤是
1. 准备数据
2. 设计图形的样式、背景颜色
3. Pyecharts 绘图
4. 设计图表的标题或者图例等属性
5. 导出至 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("商家1", Faker.values())
.add_yaxis("商家2", Faker.values())
.set_global_opts(title_opts=opts.TitleOpts(title="这是主标题", subtitle="这是副标题"))
.render("bar_base.html")
)
出来的结果是
02 数据准备
import pandas as pd
import numpy as np
data = pd.DataFrame({'x':np.arange(1,101),'y':["随机生成的数字"]})
df = pd.read_excel("你的文件的路径")
03 Pycharts还提供内置的数据集
Pyecharts内部还提供了一些数据集,主要包含类别数据、时间数据、颜色数据、地理数据、世界人口数据等等,通过choose()方法来随机选择使用哪个
def choose(self) -> list:
return random.choice(
[
self.clothes,
self.drinks,
self.phones,
self.fruits,
self.animal,
self.dogs,
self.week,
]
)
04 图形的样式
说到图形的样式,大概都这么几种
class _ThemeType:
BUILTIN_THEMES = ["light", "dark", "white"]
LIGHT = "light"
DARK = "dark"
WHITE = "white"
CHALK: str = "chalk"
ESSOS: str = "essos"
INFOGRAPHIC: str = "infographic"
MACARONS: str = "macarons"
PURPLE_PASSION: str = "purple-passion"
ROMA: str = "roma"
ROMANTIC: str = "romantic"
SHINE: str = "shine"
VINTAGE: str = "vintage"
WALDEN: str = "walden"
WESTEROS: str = "westeros"
WONDERLAND: str = "wonderland"
HALLOWEEN: str = "halloween"
06 设置标题、副标题
设置标题以及副标题的代码如下
set_global_opts(title_opts=opts.TitleOpts(title="这是主标题",subtitle="这是副标题"))
07 设置图例与位置
legend_opts=opts.LegendOpts(type_="scroll", orient="vertical",pos_top="15%",pos_left="7%")) # 图裂的位置
label_opts=opts.LabelOpts(formatter="{b}: {c}") # 结果的展现形式
08 导出结果
render("test.html")
# 如果是在jupyter notebook当中
render_notebook()
09 Pyecharts绘图
柱状图
同个品类不同类目的柱子可以堆叠起来呈现,也就是堆叠的柱状图
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家1", Faker.values(), stack="stack1")
.add_yaxis("商家2", Faker.values(), stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-堆叠数据(全部)"))
.render("bar_stack_1212.html")
)
有时候横坐标的标识字数较多,X轴上显示全,我们可以将标识的字体稍微倾斜一些
c = (
Bar()
.add_xaxis(
[
"名字相当长的X轴标签1",
"名字相当长的X轴标签2",
"名字相当长的X轴标签3",
"名字相当长的X轴标签4",
"名字相当长的X轴标签5",
"名字相当长的X轴标签6",
]
)
.add_yaxis("商家1", Faker.values())
.add_yaxis("商家2", Faker.values())
.set_global_opts(
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=15)),
title_opts=opts.TitleOpts(title="Bar-旋转X轴标签", subtitle="副标题"),
)
.render("test.html")
)
我们也可以这样放柱形图
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(Faker.days_attrs)
.add_yaxis("商家1", Faker.days_values, color=Faker.rand_color())
.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-DataZoom(滑块-垂直)"),
datazoom_opts=opts.DataZoomOpts(orient="vertical"),
)
.render("bar_datazoom_slider_vertical.html")
)
我们也可以通过拖动里面的柱子来实现数据缩放、范围的改变
c = (
Bar()
.add_xaxis(Faker.days_attrs)
.add_yaxis("商家1", Faker.days_values)
.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-DataZoom(内置+外置)"),
datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")],
)
.render("bar_datazoom_both.html")
)
在柱状图当中,不同柱子之间的距离也可以不是相同的
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.WHITE))
.add_xaxis(Faker.choose())
.add_yaxis("商家1", Faker.values(), gap="0%")
.add_yaxis("商家2", Faker.values(), gap="0%")
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-柱间距离不同"))
.render("bar_different_series_gap.html")
)
柱状图水平状态的
还有水平方向的柱状图
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家1", Faker.values())
.add_yaxis("商家2", Faker.values())
.reversal_axis()
.set_series_opts(label_opts=opts.LabelOpts(position="right"))
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-水平方向"))
.render("bar_reversal_axis.html")
)
箱型图
箱型图更加有利于我们来观察数据的内在分布
from pyecharts.charts import Boxplot
v1 = [
[850, 740, 950, 1090, 930, 850, 950, 980, 1000, 880, 1000, 980],
[980, 940, 960, 940, 900, 800, 850, 880, 950, 840, 830, 800],
]
v2 = [
[890, 820, 820, 820, 800, 770, 760, 760, 750, 760, 950, 920],
[900, 840, 800, 810, 760, 810, 790, 850, 820, 850, 870, 880],
]
c = Boxplot()
c.add_xaxis(["A", "B"])
c.add_yaxis("类目1", c.prepare_data(v1))
c.add_yaxis("类目2", c.prepare_data(v2))
c.set_global_opts(title_opts=opts.TitleOpts(title="箱型图-基本示例"))
c.render("boxplot_test.html")
日历图
日历图具体指按照日历的布局,用颜色展现每一天的数据,从而比较直观地看到全年的数据情况,例如展示超市全年的销售额,从而看出具体某个月份或者某个星期的销售额比较低
c = (
Calendar(init_opts=opts.InitOpts(theme=ThemeType.INFOGRAPHIC))
.add("", data, calendar_opts=opts.CalendarOpts(range_="2020"))
.set_global_opts(
title_opts=opts.TitleOpts(title="日历图-2020年超市的销售额"),
visualmap_opts=opts.VisualMapOpts(
max_=250000,
min_=10000,
orient="horizontal",
is_piecewise=True,
pos_top="230px",
pos_left="100px",
),
)
.render("calendar_test.html")
)
K线图
c = (
Kline(init_opts=opts.InitOpts(theme=ThemeType.ESSOS))
.add_xaxis(["2020/7/{}".format(i + 1) for i in range(31)])
.add_yaxis("kline", data)
.set_global_opts(
yaxis_opts=opts.AxisOpts(is_scale=True),
xaxis_opts=opts.AxisOpts(is_scale=True),
title_opts=opts.TitleOpts(title="K线图-基本示例"),
)
.render("kline_test.html")
)
漏斗图
from pyecharts.charts import Funnel
c = (
Funnel()
.add("类目", [list(z) for z in zip(Faker.choose(), Faker.values())])
.set_global_opts(title_opts=opts.TitleOpts(title="漏斗图-基本示例"))
.render("funnel_test.html")
)
折线图
c = (
Line()
.add_xaxis(Faker.choose())
.add_yaxis("商家1", Faker.values())
.add_yaxis("商家2", Faker.values())
.set_global_opts(title_opts=opts.TitleOpts(title="折线图-基本示例"))
.render("line_test.html")
)
水球图
水球图通常来显示指标的完成程度
from pyecharts.charts import Liquid
c = (
Liquid()
.add("lq", [0.55, 0.75])
.set_global_opts(title_opts=opts.TitleOpts(title="Liquid-基本示例"))
.render("liquid_test.html")
)
词云图
c = (
WordCloud()
.add(series_name="词云图实例", data_pair=data, word_size_range=[5, 100])
.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")
)
饼图
c = (
Pie()
.add("类目", [list(z) for z in zip(Faker.choose(), Faker.values())])
.set_global_opts(title_opts=opts.TitleOpts(title="饼图-基本示例"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
.render("pie_test.html")
)
仪表盘图
仪表盘的绘制也可以用来展示指标的完成程度
from pyecharts.charts import Gauge
c = (
Gauge()
.add("", [("完成率", 70)])
.set_global_opts(title_opts=opts.TitleOpts(title="仪表盘-基本示例"))
.render("gauge_test.html")
)
涟漪散点图
c = (
EffectScatter()
.add_xaxis(Faker.choose())
.add_yaxis("商家1", Faker.values())
.set_global_opts(title_opts=opts.TitleOpts(title="涟漪散点图-基本示例"))
.render("effectscatter_test.html")
)
地图
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.faker import Faker
from pyecharts.globals import ChartType
c = (
Geo()
.add_schema(maptype="china")
.add(
"geo",
[list(z) for z in zip(Faker.provinces, Faker.values())],
type_=ChartType.EFFECT_SCATTER,
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="Geo-EffectScatter"))
.render("geo_effectscatter.html")
)
关系图
from pyecharts import options as opts
from pyecharts.charts import Graph
nodes_data = [
opts.GraphNode(name="结点1", symbol_size=10),
opts.GraphNode(name="结点2", symbol_size=20),
opts.GraphNode(name="结点3", symbol_size=30),
opts.GraphNode(name="结点4", symbol_size=40),
opts.GraphNode(name="结点5", symbol_size=50),
opts.GraphNode(name="结点6", symbol_size=60),
]
links_data = [
opts.GraphLink(source="结点1", target="结点2", value=2),
opts.GraphLink(source="结点2", target="结点3", value=3),
opts.GraphLink(source="结点3", target="结点4", value=4),
opts.GraphLink(source="结点4", target="结点5", value=5),
opts.GraphLink(source="结点5", target="结点6", value=6),
opts.GraphLink(source="结点6", target="结点1", value=7),
]
c = (
Graph()
.add(
"",
nodes_data,
links_data,
repulsion=4000,
edge_label=opts.LabelOpts(
is_show=True, position="middle", formatter="{b} 的数据 {c}"
),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="Graph-GraphNode-GraphLink-WithEdgeLabel")
)
.render("graph_with_edge_options.html")
)
技术交流
欢迎转载、收藏、有所收获点赞支持一下!
目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
- 方式①、发送如下图片至微信,长按识别,后台回复:加群;
- 方式②、添加微信号:dkl88191,备注:来自CSDN
- 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群