数据分析组合可视化实例图
开篇:应女朋友的要求,于是写下了这篇详细的数据可视化代码及完整注释
一:柱状图、折线图横向组合网格布局
本段代码使用了pyecharts
库来创建一个包含多个图表(柱状图、折线图)和网格布局的复杂可视化。以下是关于每一行代码的详细解释:
实现效果展示:
python
# 从pyecharts库中导入options模块,并将其重命名为opts。
from pyecharts import options as opts
# 从pyecharts.charts模块中导入Bar(柱状图)、Grid(网格布局)和Line(折线图)类。
from pyecharts.charts import Bar, Grid, Line
# 创建第一个柱状图(bar)
# 初始化一个Bar对象。
bar = (
Bar()
# 使用.add_xaxis()方法添加X轴数据,这里是月份。
.add_xaxis(["{}月".format(i) for i in range(1, 13)])
# 使用.add_yaxis()方法添加两组Y轴数据(蒸发量和降水量),并为它们设置不同的颜色和Y轴索引。
.add_yaxis(
"蒸发量",
[2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],
yaxis_index=0,
color="#d14a61",
)
.add_yaxis(
"降水量",
[2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
yaxis_index=1,
color="#5793f3",
)
# 使用.extend_axis()方法扩展两个额外的Y轴,分别用于表示蒸发量和温度,设置它们的名称、位置、范围和样式。
.extend_axis(
yaxis=opts.AxisOpts(
name="蒸发量",
type_="value",
min_=0,
max_=250,
position="right",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#d14a61")
),
axislabel_opts=opts.LabelOpts(formatter="{value} ml"),
)
)
.extend_axis(
yaxis=opts.AxisOpts(
type_="value",
name="温度",
min_=0,
max_=25,
position="left",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#675bba")
),
axislabel_opts=opts.LabelOpts(formatter="{value} °C"),
splitline_opts=opts.SplitLineOpts(
is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1)
),
)
)
# 使用.set_global_opts()方法设置全局配置,包括Y轴配置、标题、提示框和图例。
.set_global_opts(
yaxis_opts=opts.AxisOpts(
name="降水量",
min_=0,
max_=250,
position="right",
offset=80,
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#5793f3")
),
axislabel_opts=opts.LabelOpts(formatter="{value} ml"),
),
title_opts=opts.TitleOpts(title="多X/Y轴可视化示例"),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
legend_opts=opts.LegendOpts(pos_left="25%"),
)
)
# 创建第一个折线图(line)
# 初始化一个Line对象。
line = (
Line()
# 使用.add_xaxis()方法添加X轴数据。
.add_xaxis(["{}月".format(i) for i in range(1, 13)])
# 使用.add_yaxis()方法添加一组Y轴数据(平均温度),并设置颜色和Y轴索引。
.add_yaxis(
"平均温度",
[2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2],
yaxis_index=2,
color="#675bba",
label_opts=opts.LabelOpts(is_show=False),
)
)
# 创建第二个柱状图(bar1)
# 类似于第一个柱状图的创建,但X轴和Y轴索引不同,用于在网格布局中定位。
bar1 = (
Bar()
.add_xaxis(["{}月".format(i) for i in range(1, 13)])
.add_yaxis(
"蒸发量 1",
[2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],
color="#d14a61",
xaxis_index=1,
yaxis_index=3,
)
.add_yaxis(
"降水量 2",
[2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
color="#5793f3",
xaxis_index=1,
yaxis_index=3,
)
.extend_axis(
yaxis=opts.AxisOpts(
name="蒸发量",
type_="value",
min_=0,
max_=250,
position="right",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#d14a61")
),
axislabel_opts=opts.LabelOpts(formatter="{value} ml"),
)
)
.extend_axis(
yaxis=opts.AxisOpts(
type_="value",
name="温度",
min_=0,
max_=25,
position="left",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#675bba")
),
axislabel_opts=opts.LabelOpts(formatter="{value} °C"),
splitline_opts=opts.SplitLineOpts(
is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1)
),
)
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(grid_index=1),
yaxis_opts=opts.AxisOpts(
name="降水量",
min_=0,
max_=250,
position="right",
offset=80,
grid_index=1,
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#5793f3")
),
axislabel_opts=opts.LabelOpts(formatter="{value} ml"),
),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
legend_opts=opts.LegendOpts(pos_left="65%"),
)
)
# 创建第二个折线图(line1)
# 类似于第一个折线图的创建,但X轴和Y轴索引不同,用于在网格布局中定位。
line1 = (
Line()
.add_xaxis(["{}月".format(i) for i in range(1, 13)])
.add_yaxis(
"平均温度 1",
[2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2],
color="#675bba",
label_opts=opts.LabelOpts(is_show=False),
xaxis_index=1,
yaxis_index=5,
)
)
# 重叠图表
# 使用.overlap()方法将第一个柱状图和折线图重叠。
overlap_1 = bar.overlap(line)
# 使用.overlap()方法将第二个柱状图和折线图重叠。
overlap_2 = bar1.overlap(line1)
# 创建网格布局(grid)
grid = (
# 初始化一个Grid对象,并设置初始宽度和高度。
Grid(init_opts=opts.InitOpts(width="1200px", height="500px"))
# 使用.add()方法将第一个重叠图表添加到网格的右侧。
.add(
overlap_1, grid_opts=opts.GridOpts(pos_right="58%"), is_control_axis_index=True
)
# 使用.add()方法将第二个重叠图表添加到网格的左侧。
.add(overlap_2, grid_opts=opts.GridOpts(pos_left="58%"), is_control_axis_index=True)
# 使用.render()方法生成并保存HTML文件,该文件包含所有图表和网格布局的可视化。
.render("重叠图表和网格.html")
)
二:散点图与折线图横向组合网格布局
本段代码展示了如何使用pyecharts
库来创建并组合一个散点图和一个折线图,并将它们放置在一个网格(Grid)布局中。以下是关于每一行代码的详细解释:
实现效果展示:
python
# 导入pyecharts库中的options模块(并设置别名为opts)
from pyecharts import options as opts
# 导入Grid、Line、Scatter这三个图表类。
from pyecharts.charts import Grid, Line, Scatter
# 定义了两组X轴数据(x_data_a和x_data_b)以及四组Y轴数据(y_data_a、y_data_b、y_date_c、y_date_d)。这些数据将用于创建散点图和折线图
x_data_a = ['草莓', '西瓜', '香蕉', '椰子', '蓝莓', '榴莲', '牛油果']
x_data_b = ['香菜', '蘑菇', '柿子', '黄瓜', '菠菜', '韭菜', '南瓜']
y_data_a = [10, 23, 46, 70, 54, 31, 28]
y_data_b = [15, 20, 31, 55, 35, 43, 68]
y_date_c = [23, 35, 31, 50, 54, 13, 67]
y_date_d = [56, 23, 45, 32, 12, 67, 40]
# 这创建了一个散点图对象scatter
scatter = (
Scatter()
# 设置X轴数据为x_data_a
.add_xaxis(x_data_a)
# 分别添加两组Y轴数据,并设置其系列名称为"售出"和"收益"。
.add_yaxis("售出", y_data_a)
.add_yaxis("收益", y_data_b)
# 设置全局配置项,包括标题、图例位置和X轴标签的旋转角度。
.set_global_opts(
title_opts=opts.TitleOpts(title="蔬菜"),
legend_opts=opts.LegendOpts(pos_left="20%"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),
)
)
# 创建了一个折线图对象line
line = (
Line()
# 设置X轴数据为x_data_b
.add_xaxis(x_data_b)
# 分别添加两组Y轴数据,并设置其系列名称为"售出"和"收益"
.add_yaxis("售出", y_date_c)
.add_yaxis("收益", y_date_d)
# 设置全局配置项,包括标题、图例位置和X轴标签的旋转角度
.set_global_opts(
title_opts=opts.TitleOpts(title="水果", pos_right="5%"),
legend_opts=opts.LegendOpts(pos_right="20%"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),
)
)
# 这段代码创建了一个Grid对象,用于将散点图和折线图组合在一起
grid = (
Grid()
# 将散点图添加到网格中,并设置其位置为左侧55%的位置
.add(scatter, grid_opts=opts.GridOpts(pos_left="55%"))
# 将折线图添加到网格中,并设置其位置为右侧55%的位置
.add(line, grid_opts=opts.GridOpts(pos_right="55%"))
# 渲染图表,并将其保存为HTML文件,文件名为"散点与折线组合.html"
.render("散点与折线组合.html")
)
三:柱状图、折线图竖向组合网格布局
本段代码展示了如何使用pyecharts
库创建一个包含柱状图和折线图的竖向网格布局图表,并自定义了x轴和y轴的标签和数据。以下是关于每一行代码的详细解释:
实现效果展示:
python
# 导入pyecharts库中的options模块,并重命名为opts,用于设置图表的各种选项
from pyecharts import options as opts
# 导入pyecharts库中的Bar(柱状图)、Grid(网格布局)、Line(折线图)图表类
from pyecharts.charts import Bar, Grid, Line
# 定义一个列表,自定义x轴标签
x_axis_data = ["西瓜", "香蕉", "蓝莓", "椰子", "榴莲", "草莓", "木瓜", "水蜜桃"]
# 定义两个列表,自定义柱状图和折线图的y轴数据
bar_y_axis_data = [18, 25, 30, 44, 53, 34, 79, 56]
line_y_axis_data = [13, 30, 67, 45, 55, 67, 89, 54]
# 创建一个柱状图对象,并设置其x轴标签、y轴数据(包括销售量和利润),以及全局选项(如标题)
bar = (
Bar()
.add_xaxis(x_axis_data) # 使用自定义的x轴标签
.add_yaxis("销售量", bar_y_axis_data) # 添加一个名为"销售量"的系列,数据为bar_y_axis_data
.add_yaxis("利润", [v * 0.5 for v in bar_y_axis_data]) # 添加一个名为"利润"的系列,数据为销售量的一半
.set_global_opts(title_opts=opts.TitleOpts(title="柱状图")) # 设置全局选项,包括图表标题
)
# 创建一个折线图对象,并设置其x轴标签、y轴数据(包括销售量和利润),以及全局选项(如标题和图例位置)
line = (
Line()
.add_xaxis(x_axis_data) # 使用自定义的x轴标签
.add_yaxis("销售量", line_y_axis_data) # 添加一个名为"销售量"的系列,数据为line_y_axis_data
.add_yaxis("利润", [v * 0.5 for v in line_y_axis_data]) # 添加一个名为"利润"的系列,数据为销售量的一半
.set_global_opts(
title_opts=opts.TitleOpts(title="折线图", pos_top="48%"), # 设置图表标题及其位置
legend_opts=opts.LegendOpts(pos_top="48%"), # 设置图例位置
)
)
# 创建一个网格布局对象,将柱状图和折线图添加到布局中,并设置它们的位置,最后渲染图表到HTML文件
grid = (
Grid()
.add(bar, grid_opts=opts.GridOpts(pos_bottom="60%")) # 将柱状图添加到网格布局中,并设置其位置
.add(line, grid_opts=opts.GridOpts(pos_top="60%")) # 将折线图添加到网格布局中,并设置其位置
.render("柱状图和折线图的网格布局图表.html") # 渲染图表到HTML文件
)
四:柱状图、折线图内嵌组合网格布局
本段代码展示了如何使用pyecharts
库创建并保存一个包含柱状图和折线图的复合图表,通过设置不同的Y轴索引和扩展Y轴,实现了多Y轴的效果。以下是关于每一行代码的详细解释:
实现效果展示:
python
# 导入pyecharts库中的options模块和Bar, Grid, Line图表类。
from pyecharts import options as opts
from pyecharts.charts import Bar, Grid, Line
# 创建一个列表x_data,包含1到12月的字符串表示。
x_data = ["{}月".format(i) for i in range(1, 13)]
# 创建一个Bar对象,并添加X轴数据。
bar = (
Bar()
.add_xaxis(x_data)
# 添加一个名为"蒸发量"的Y轴系列,设置其数据、Y轴索引、颜色等属性。
.add_yaxis(
"蒸发量",
[2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],
yaxis_index=0,
color="#d14a61",
)
# 添加一个名为"降水量"的Y轴系列,设置其数据、Y轴索引、颜色等属性。
.add_yaxis(
"降水量",
[2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
yaxis_index=1,
color="#5793f3",
)
# 扩展一个名为"蒸发量"的Y轴,设置其名称、类型、最小值、最大值、位置、轴线样式、标签格式等属性。
.extend_axis(
yaxis=opts.AxisOpts(
name="蒸发量",
type_="value",
min_=0,
max_=250,
position="right",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#d14a61")
),
axislabel_opts=opts.LabelOpts(formatter="{value} ml"),
)
)
# 扩展一个名为"温度"的Y轴,设置其名称、类型、最小值、最大值、位置、轴线样式、标签格式、分割线样式等属性。
.extend_axis(
yaxis=opts.AxisOpts(
type_="value",
name="温度",
min_=0,
max_=25,
position="left",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#675bba")
),
axislabel_opts=opts.LabelOpts(formatter="{value} °C"),
splitline_opts=opts.SplitLineOpts(
is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1)
),
)
)
.set_global_opts(
yaxis_opts=opts.AxisOpts(
name="降水量",
min_=0,
max_=250,
position="right",
offset=80,
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#5793f3")
),
axislabel_opts=opts.LabelOpts(formatter="{value} ml"),
),
title_opts=opts.TitleOpts(title="多Y轴示例"),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
)
)
# 创建一个Line对象,并添加X轴数据和名为"平均温度"的Y轴系列,设置其数据、Y轴索引、颜色、标签显示等属性。
line = (
Line()
.add_xaxis(x_data)
.add_yaxis(
"平均温度",
[2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2],
yaxis_index=2,
color="#675bba",
label_opts=opts.LabelOpts(is_show=False),
)
)
# 将折线图line重叠到柱状图bar上。
bar.overlap(line)
# 创建一个Grid对象。
grid = Grid()
# 将bar图表添加到Grid中,并设置其位置参数,以及是否控制轴索引。
grid.add(bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True)
# 将Grid图表渲染为HTML文件,文件名为"树状与折线.html"。
grid.render("柱状与折线内嵌图.html")