共计 9842 个字符,预计需要花费 25 分钟才能阅读完成。
使用 pyecharts 绘制基本图形
– 部分图形可视化基于导入的 CSV 文件
实验环境:
- windows 10
- VScode
- Python(3.7.4)
- Pyecharts(1.7.1)
准备工作:
因为绘制部分图形会用到导入的 CSV 文件,这里将会说明如何导入 CSV 文件
# 方法一:# 导入包
import csv
# 读取文件,这里使用 Filename.csv 文件
filedata = "Filename.csv"
# 建立一个空的列表
data_x = []
# 打开文件
with open(filedata) as h:
# 读取文件数据
reader = csv.reader(h)
# 按行循环读取数据
for data_row in reader:
# 用追加的方式形成数据列表
data_x.append(data_row)
# 读取列表的第一行,并赋值给 x
x = data_x[0]
# 转换数据列表中的元素为单精度浮点型,并赋值到 y
y = [float(i) for i in data_x[1]]
我们需要可视化的 CSV 文件大部分带有 中文 ,而带有 中文 文件的编码方式不是计算机能识别的 ASCII 码,这时直接使用数据会报错。因此,我们需要指定 CSV 文件的编码方式。而方法一指定会很麻烦,下面介绍方法二:
# 方法二:# 导入包
import pandas as pd
# 读取文件, 并指定文件的编码方式
filedata = pd.read_csv("Filename.csv", encoding = 'utf-8')
# 读取第一列的所有数据,转换为列表并赋值给 k
k = vote.iloc[:, 0].tolist()
案例:绘制美国 1995 年 -2009 年邮费变化折线图、阶梯图;
数据:
年份:[“1995”, “1996”, “1997”, “1998”, “1999”, “2000”,”2001″, “2002”, “2003”, “2004”, “2005”, “2006”,”2007″, “2008”, “2009”] 邮费:[0.32, 0.32, 0.32, 0.32, 0.33, 0.33, 0.34, 0.37, 0.37, 0.37, 0.37, 0.39, 0.41, 0.42, 0.44]
折线图:
思路:
- 导入绘制折线的相关库
- 写入数据
- 可视化
- 美化
步骤:
# 导入库包
import pyecharts.options as opts
from pyecharts.charts import Line
# 写入数据
years = ["1995", "1996", "1997", "1998", "1999", "2000",
"2001", "2002", "2003", "2004", "2005", "2006",
"2007", "2008", "2009"]
Postage = [0.32, 0.32, 0.32, 0.32, 0.33, 0.33, 0.34,
0.37, 0.37, 0.37, 0.37, 0.39, 0.41, 0.42, 0.44]
(Line()
# 全局配置
.set_global_opts()
# x 轴
.add_xaxis(xaxis_data=years)
# y 轴
.add_yaxis(
series_name="", # 数据所属集合的名称
y_axis=Postage, # y 轴数据
)
# 输出为 HTML 文件
.render("line_chart.html")
)
# 全局配置
.set_global_opts(
# 标题
title_opts=opts.TitleOpts(title="美国 1995 年 -2009 年邮费变化阶梯图", subtitle="李后文"),
# 开启提示框
tooltip_opts=opts.TooltipOpts(is_show=True),
# 坐标轴类型
xaxis_opts=opts.AxisOpts(type_="category"), # 类目轴
yaxis_opts=opts.AxisOpts(
type_="value", # 数值轴
# 显示坐标轴刻度
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
)
# y 轴
.add_yaxis(
series_name="", # 数据所属集合的名称
y_axis=Postage, # y 轴数据
is_symbol_show=True, # 使用鼠标悬浮数值显示
label_opts=opts.LabelOpts(is_show=False), # 点上不显示 y 轴的值
is_step=False, # 关闭阶梯图
)
# 导入库包
import pyecharts.options as opts
from pyecharts.charts import Line
# 写入数据
years = ["1995", "1996", "1997", "1998", "1999", "2000",
"2001", "2002", "2003", "2004", "2005", "2006",
"2007", "2008", "2009"]
Postage = [0.32, 0.32, 0.32, 0.32, 0.33, 0.33, 0.34,
0.37, 0.37, 0.37, 0.37, 0.39, 0.41, 0.42, 0.44]
(Line()
# 全局配置
.set_global_opts(
# 设置标题
title_opts=opts.TitleOpts(title="美国 1995 年 -2009 年邮费变化阶梯图", subtitle="李后文"),
# 开启提示框
tooltip_opts=opts.TooltipOpts(is_show=True),
# 坐标轴类型
xaxis_opts=opts.AxisOpts(type_="category"), # 类目轴
yaxis_opts=opts.AxisOpts(
type_="value", # 数值轴
# 显示坐标轴刻度
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
)
# x 轴
.add_xaxis(xaxis_data=years)
# y 轴
.add_yaxis(
series_name="", # 数据所属集合的名称
y_axis=Postage, # y 轴数据
is_symbol_show=True, # 使用鼠标悬浮数值显示
label_opts=opts.LabelOpts(is_show=False), # 点上不显示 y 轴的值
is_step=False, # 关闭阶梯图
)
# 输出为 HTML 文件
.render("line_chart.html")
)
效果:
阶梯图:
思路:
在原折线图的基础上,将 阶梯图 开启
步骤:
# y 轴
.add_yaxis(is_step=True, # 开启阶梯图)
# 导入库包
import pyecharts.options as opts
from pyecharts.charts import Line
# 写入数据
years = ["1995", "1996", "1997", "1998", "1999", "2000",
"2001", "2002", "2003", "2004", "2005", "2006",
"2007", "2008", "2009"]
Postage = [0.32, 0.32, 0.32, 0.32, 0.33, 0.33, 0.34,
0.37, 0.37, 0.37, 0.37, 0.39, 0.41, 0.42, 0.44]
(Line()
# 全局配置
.set_global_opts(
# 设置标题
title_opts=opts.TitleOpts(title="美国 1995 年 -2009 年邮费变化阶梯图", subtitle="李后文"),
# 开启提示框
tooltip_opts=opts.TooltipOpts(is_show=True),
# 坐标轴类型
xaxis_opts=opts.AxisOpts(type_="category"), # 类目轴
yaxis_opts=opts.AxisOpts(
type_="value", # 数值轴
# 显示坐标轴刻度
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
)
# x 轴
.add_xaxis(xaxis_data=years)
# y 轴
.add_yaxis(
series_name="", # 数据所属集合的名称
y_axis=Postage, # y 轴数据
is_symbol_show=True, # 使用鼠标悬浮数值显示
label_opts=opts.LabelOpts(is_show=False), # 点上不显示 y 轴的值
is_step=True, # 开启阶梯图
)
# 输出为 HTML 文件
.render("line_chart.html")
)
效果图:
案例:2000 年 -2010 年热狗大胃王比赛前三名成绩的堆叠柱形图、极坐标系 - 堆叠柱状图(南丁格尔玫瑰图)
数据文件:hot-dog-places.csv
堆叠柱形图:
思路:
- 导入绘制柱形图的相关库
- 写入数据
- 可视化
- 美化
步骤:
# 导入库
import pyecharts.options as opts
from pyecharts.charts import Bar
import csv
# 读取文件
hot_dog_places = "hot-dog-places.csv"
data_x = []
with open(hot_dog_places) as h: # 打开文件
reader = csv.reader(h) # 读取文件中的数据
for data_row in reader: # 按行循环读取数据
data_x.append(data_row) # 以追加的方式形成数据列表
x = data_x[0]
y1 = [float(i) for i in data_x[1]] # 转换数据列表中的元素为单精度浮点型,并赋值到 y1
y2 = [float(i) for i in data_x[2]]
y3 = [float(i) for i in data_x[3]]
(Bar()
# 标题
.set_global_opts(title_opts=opts.TitleOpts(title="热狗大胃王比赛前三名成绩", subtitle="李后文"))
# x 轴
.add_xaxis(x)
# y 轴数据为可堆叠,每个柱体之间的间隔为 50%
.add_yaxis("第一名", y1, stack="stack1", category_gap="50%")
.add_yaxis("第二名", y2, stack="stack1", category_gap="50%")
.add_yaxis("第三名", y3, stack="stack1", category_gap="50%")
.render("Bar.html")
)
# 导入库
from pyecharts.globals import ThemeType
(
# 自定义主题为 LIGHT
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
)
# 导入库
import pyecharts.options as opts
from pyecharts.charts import Bar
import csv
from pyecharts.globals import ThemeType
# 读取文件
hot_dog_places = "hot-dog-places.csv"
data_x = []
with open(hot_dog_places) as h: # 打开文件
reader = csv.reader(h) # 读取文件中的数据
for data_row in reader: # 按行循环读取数据
data_x.append(data_row) # 以追加的方式形成数据列表
x = data_x[0]
y1 = [float(i) for i in data_x[1]] # 转换数据列表中的元素为单精度浮点型,并赋值到 y1
y2 = [float(i) for i in data_x[2]]
y3 = [float(i) for i in data_x[3]]
(
# 自定义主题为 LIGHT
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
# 标题
.set_global_opts(title_opts=opts.TitleOpts(title="热狗大胃王比赛前三名成绩", subtitle="李后文"))
# x 轴
.add_xaxis(x)
# y 轴数据为可堆叠,每个柱体之间的间隔为 50%
.add_yaxis("第一名", y1, stack="stack1", category_gap="50%")
.add_yaxis("第二名", y2, stack="stack1", category_gap="50%")
.add_yaxis("第三名", y3, stack="stack1", category_gap="50%")
.render("Bar.html")
)
效果图:
南丁格尔玫瑰图:
思路:
南丁格尔玫瑰图 又叫 极坐标系 - 堆叠柱状图
从字面意思可以明白,只需要将 堆叠柱状图 放在 极坐标系 中就能完成
步骤:
# 导入库
import pyecharts.options as opts
from pyecharts.charts import Polar
import csv
# 读取文件
hot_dog_places = "hot-dog-places.csv"
data_x = []
with open(hot_dog_places) as h: # 打开文件
reader = csv.reader(h) # 读取文件中的数据
for data_row in reader: # 按行循环读取数据
data_x.append(data_row) # 以追加的方式形成数据列表
x = data_x[0]
y1 = [float(i) for i in data_x[1]] # 转换数据列表中的元素为单精度浮点型,并赋值到 y1
y2 = [float(i) for i in data_x[2]]
y3 = [float(i) for i in data_x[3]]
(Polar()
.add_schema()
# 标题
.set_global_opts(title_opts=opts.TitleOpts(title="hot-dog-places", subtitle="李后文"))
# 显示提示
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
# 数据类型为堆叠柱形
.add("第一名", y1, stack="stack2", type_="bar")
.add("第二名", y2, stack="stack2", type_="bar")
.add("第三名", y3, stack="stack2", type_="bar")
.render("Polar.html")
)
(Polar()
.add_schema(
# 极坐标系径向轴配置
radiusaxis_opts=opts.RadiusAxisOpts(data=x, type_="category"), # 设置轴类型
angleaxis_opts=opts.AngleAxisOpts(is_clockwise=True, max_=200),
)
)
# 导入库
import pyecharts.options as opts
from pyecharts.charts import Polar
import csv
# 读取文件
hot_dog_places = "hot-dog-places.csv"
data_x = []
with open(hot_dog_places) as h: # 打开文件
reader = csv.reader(h) # 读取文件中的数据
for data_row in reader: # 按行循环读取数据
data_x.append(data_row) # 以追加的方式形成数据列表
x = data_x[0]
y1 = [float(i) for i in data_x[1]] # 转换数据列表中的元素为单精度浮点型,并赋值到 y1
y2 = [float(i) for i in data_x[2]]
y3 = [float(i) for i in data_x[3]]
(Polar()
.add_schema(
# 极坐标系径向轴配置
radiusaxis_opts=opts.RadiusAxisOpts(data=x, type_="category"), # 设置轴类型
angleaxis_opts=opts.AngleAxisOpts(is_clockwise=True, max_=200),
)
# 标题
.set_global_opts(title_opts=opts.TitleOpts(title="hot-dog-places", subtitle="李后文"))
# 显示提示
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
# 数据类型为堆叠柱形
.add("第一名", y1, stack="stack2", type_="bar")
.add("第二名", y2, stack="stack2", type_="bar")
.add("第三名", y3, stack="stack2", type_="bar")
.render("Polar.html")
)
效果图:
案例:某网站用户感兴趣的领域的投票结果绘制饼图、环形图
数据文件:vote_result.csv
饼图:
思路:
- 导入绘制饼图的相关库
- 写入数据
- 可视化
- 美化
步骤:
# 导入库
from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
# 获取数据,并设置编码为 'utf-8'
vote = pd.read_csv("vote_result.csv", encoding = 'utf-8')
# 读取数据并赋值
k = vote.iloc[:, 0].tolist() # 读取第一列的所有,并转换为列表
v = vote.iloc[:, 1].tolist()
(Pie()
# 标题
.set_global_opts(title_opts=opts.TitleOpts(title="用户感兴趣", subtitle="李后文")
)
# 鼠标悬浮在每一块饼上显示数据的格式
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
# 列表转换为字典
.add("", [list(z) for z in zip(k, v)])
.render("Pie.html")
)
效果图:
环形图:
思路:
环形图 是在 饼图 的中间抠了一部分, 所以考虑缩减原 饼图 的内外半径
步骤:
# 导入库
from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
# 获取数据,并设置编码为 'utf-8'
vote = pd.read_csv("vote_result.csv", encoding = 'utf-8')
# 读取数据并赋值
k = vote.iloc[:, 0].tolist() # 读取第一列的所有,并转换为列表
v = vote.iloc[:, 1].tolist()
(Pie()
# 标题
.set_global_opts(title_opts=opts.TitleOpts(title="用户感兴趣", subtitle="李后文")
)
# 鼠标悬浮在每一块饼上显示数据的格式
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
# 列表转换为字典, 缩小内外半径
.add("", [list(z) for z in zip(k, v)],
radius=["50%", "70%"],)
.render("Pie.html")
)
效果图:
案例: 奥巴马的政治举措民意调查结果的堆叠柱形图
数据文件:approval_rate.csv
堆叠柱形图 2:
这个 CSV 文件使用的编码格式为 ‘utf-8’, 所以方法二进行导入
思路:
- 导入绘制柱形的相关库
- 写入数据
- 可视化
- 美化
步骤:
# 导入库
import pyecharts.options as opts
from pyecharts.charts import Bar
import pandas as pd
# 获取数据,并设置编码为 'utf-8'
approval = pd.read_csv("approval_rate.csv", encoding='utf-8')
# 读取数据并赋值
x = approval.iloc[:, 0].tolist() # 读取第一列的所有,并转换为列表
y1 = approval.iloc[:, 1].tolist()
y2 = approval.iloc[:, 2].tolist()
y3 = approval.iloc[:, 3].tolist()
(Bar()
# 标题
.set_global_opts(title_opts=opts.TitleOpts(title="奥巴马的政治举措民意调查结果", subtitle="李后文"))
# x 轴
.add_xaxis(x)
# y 轴数据为可堆叠, 每个柱体之间间隔 50%, 不在图上显示 y 轴数值
.add_yaxis("支持", y1, stack="stack1", category_gap="50%", label_opts=opts.LabelOpts(is_show=False),)
.add_yaxis("反对", y2, stack="stack1", category_gap="50%", label_opts=opts.LabelOpts(is_show=False),)
.add_yaxis("不发表意见", y3, stack="stack1", category_gap="50%", label_opts=opts.LabelOpts(is_show=False),)
.render("Bar2.html")
)
# 导入库
from pyecharts.globals import ThemeType
(Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
)
# 导入库
import pyecharts.options as opts
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType
import pandas as pd
# 获取数据,并设置编码为 'utf-8'
approval = pd.read_csv("approval_rate.csv", encoding='utf-8')
# 读取数据并赋值
x = approval.iloc[:, 0].tolist() # 读取第一列的所有,并转换为列表
y1 = approval.iloc[:, 1].tolist()
y2 = approval.iloc[:, 2].tolist()
y3 = approval.iloc[:, 3].tolist()
(Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
# 标题
.set_global_opts(title_opts=opts.TitleOpts(title="奥巴马的政治举措民意调查结果", subtitle="李后文"))
# x 轴
.add_xaxis(x)
# y 轴数据为可堆叠, 每个柱体之间间隔 50%, 不在图上显示 y 轴数值
.add_yaxis("支持", y1, stack="stack1", category_gap="50%", label_opts=opts.LabelOpts(is_show=False),)
.add_yaxis("反对", y2, stack="stack1", category_gap="50%", label_opts=opts.LabelOpts(is_show=False),)
.add_yaxis("不发表意见", y3, stack="stack1", category_gap="50%", label_opts=opts.LabelOpts(is_show=False),)
.render("Bar2.html")
)
效果图: