使用pyecharts绘制基本图形

51次阅读

共计 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")
)

效果图:


正文完
 0