python——pyEcharts绘制折线图与堆叠柱形的混合可视化

发布于:2024-10-09 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、数据准备

  • 定义了 x_data 作为横坐标数据,代表不同的项目名称。
  • 分别准备了两个用于柱形图的数据系列 bar_data1 和 bar_data2,以及一个用于折线图的数据系列 line_data

二、创建图表

  • 堆叠柱形图创建
    • 创建 Bar 对象实例代表柱形图。
    • 设置柱形图的 x 轴数据为 x_data
    • 通过 add_yaxis 方法添加两个柱形数据系列,并设置堆叠属性和颜色样式,分别命名为 “类别一” 和 “类别二”。
    • 设置全局配置项,包括标题、图例位置、提示框样式和 x 轴标签旋转角度等。
  • 折线图创建
    • 创建 Line 对象实例代表折线图。
    • 同样设置折线图的 x 轴数据为 x_data
    • 通过 add_yaxis 方法添加折线数据系列,设置符号、符号大小、线条样式和标签显示等。
    • 设置全局配置项,主要是提示框样式。

三、混合图表与自定义 tooltip

  • 使用 overlap 方法将折线图与柱形图进行混合。
  • 通过自定义的 JavaScript 函数设置 tooltip 的显示内容,使得鼠标悬停时可以同时显示柱形图和折线图的数据信息。

四、渲染输出

  • 最后将混合后的图表渲染为 HTML 文件,以便在浏览器中查看可视化结果。

 代码展示:

from pyecharts.charts import Bar, Line
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode

# 准备数据
x_data = ["项目一", "项目二", "项目三", "项目四", "项目五"]
bar_data1 = [30, 45, 60, 50, 70]
bar_data2 = [20, 30, 40, 35, 50]
line_data = [15, 25, 35, 40, 45]

# 创建堆叠柱形图
bar = Bar()

# 设置柱形图的 x 轴数据
bar.add_xaxis(x_data)

# 添加第一个柱形数据系列
bar.add_yaxis(
    "类别一",
    bar_data1,
    stack="stack1",
    itemstyle_opts=opts.ItemStyleOpts(color="#67C23A"),
)

# 添加第二个柱形数据系列
bar.add_yaxis(
    "类别二",
    bar_data2,
    stack="stack1",
    itemstyle_opts=opts.ItemStyleOpts(color="#E6A23C"),
)

# 设置全局配置项
bar.set_global_opts(
    title_opts=opts.TitleOpts(title="折线图与堆叠柱形混合可视化"),
    legend_opts=opts.LegendOpts(pos_right="10%"),
    tooltip_opts=opts.TooltipOpts(
        trigger="axis", axis_pointer_type="shadow"
    ),
    xaxis_opts=opts.AxisOpts(
        axislabel_opts=opts.LabelOpts(rotate=-45)
    ),
)

# 创建折线图
line = Line()

# 设置折线图的 x 轴数据
line.add_xaxis(x_data)

# 添加折线数据系列
line.add_yaxis(
    "折线数据",
    line_data,
    symbol="circle",
    symbol_size=8,
    itemstyle_opts=opts.ItemStyleOpts(color="#409EFF"),
    linestyle_opts=opts.LineStyleOpts(width=3),
    label_opts=opts.LabelOpts(is_show=True),
)

# 设置全局配置项
line.set_global_opts(
    tooltip_opts=opts.TooltipOpts(trigger="axis"),
)

# 将折线图与柱形图进行混合
bar.overlap(line)

# 设置自定义的 JavaScript 函数,用于在 tooltip 中显示更多信息
formatter_js = """
function(params) {
    var tooltip_html = '';
    params.forEach(function(item) {
        if (item.seriesName === '类别一' || item.seriesName === '类别二') {
            tooltip_html += '<br/>' + item.seriesName + ': ' + item.value;
        } else if (item.seriesName === '折线数据') {
            tooltip_html += '<br/>' + item.seriesName + ': ' + item.value;
        }
    });
    return tooltip_html;
}
"""

# 将自定义的 JavaScript 函数应用到 tooltip 中
bar.set_series_opts(
    tooltip_opts=opts.TooltipOpts(formatter=JsCode(formatter_js))
)
line.set_series_opts(
    tooltip_opts=opts.TooltipOpts(formatter=JsCode(formatter_js))
)

# 渲染图表为 HTML 文件
bar.render("mixed_chart.html")

 

 数据展示

2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010
25,50,50.5,44.5,53.5,49,54,66,59,68,54
24,31,26,30.5,38,37,52,63,59,64.5,43
22,23.5,25.5,29.5,32,32,37,49,42,55,37
Series id,Year,Period,Value
LNS14000000,1948,M01,3.4
LNS14000000,1948,M02,3.8
LNS14000000,1948,M03,4
LNS14000000,1948,M04,3.9
LNS14000000,1948,M05,3.5
LNS14000000,1948,M06,3.6
LNS14000000,1948,M07,3.6
LNS14000000,1948,M08,3.9
LNS14000000,1948,M09,3.8
LNS14000000,1948,M10,3.7
LNS14000000,1948,M11,3.8
LNS14000000,1948,M12,4
LNS14000000,1949,M01,4.3
LNS14000000,1949,M02,4.7
LNS14000000,1949,M03,5
LNS14000000,1949,M04,5.3
LNS14000000,1949,M05,6.1
LNS14000000,1949,M06,6.2
LNS14000000,1949,M07,6.7
LNS14000000,1949,M08,6.8
LNS14000000,1949,M09,6.6
LNS14000000,1949,M10,7.9
LNS14000000,1949,M11,6.4
LNS14000000,1949,M12,6.6
LNS14000000,1950,M01,6.5
LNS14000000,1950,M02,6.4
LNS14000000,1950,M03,6.3
LNS14000000,1950,M04,5.8
LNS14000000,1950,M05,5.5
LNS14000000,1950,M06,5.4
LNS14000000,1950,M07,5
LNS14000000,1950,M08,4.5
LNS14000000,1950,M09,4.4
LNS14000000,1950,M10,4.2
LNS14000000,1950,M11,4.2
LNS14000000,1950,M12,4.3
LNS14000000,1951,M01,3.7
LNS14000000,1951,M02,3.4
LNS14000000,1951,M03,3.4
LNS14000000,1951,M04,3.1
LNS14000000,1951,M05,3
LNS14000000,1951,M06,3.2
LNS14000000,1951,M07,3.1
LNS14000000,1951,M08,3.1
LNS14000000,1951,M09,3.3
LNS14000000,1951,M10,3.5
LNS14000000,1951,M11,3.5
LNS14000000,1951,M12,3.1
LNS14000000,1952,M01,3.2
LNS14000000,1952,M02,3.1
LNS14000000,1952,M03,2.9
LNS14000000,1952,M04,2.9
LNS14000000,1952,M05,3
LNS14000000,1952,M06,3
LNS14000000,1952,M07,3.2
LNS14000000,1952,M08,3.4
LNS14000000,1952,M09,3.1
LNS14000000,1952,M10,3
LNS14000000,1952,M11,2.8
LNS14000000,1952,M12,2.7
LNS14000000,1953,M01,2.9
LNS14000000,1953,M02,2.6
LNS14000000,1953,M03,2.6
LNS14000000,1953,M04,2.7
LNS14000000,1953,M05,2.5
LNS14000000,1953,M06,2.5
LNS14000000,1953,M07,2.6
LNS14000000,1953,M08,2.7
LNS14000000,1953,M09,2.9
LNS14000000,1953,M10,3.1
LNS14000000,1953,M11,3.5
LNS14000000,1953,M12,4.5
LNS14000000,1954,M01,4.9
LNS14000000,1954,M02,5.2
LNS14000000,1954,M03,5.7
LNS14000000,1954,M04,5.9
LNS14000000,1954,M05,5.9
LNS14000000,1954,M06,5.6
LNS14000000,1954,M07,5.8
LNS14000000,1954,M08,6
LNS14000000,1954,M09,6.1
LNS14000000,1954,M10,5.7
LNS14000000,1954,M11,5.3
LNS14000000,1954,M12,5
LNS14000000,1955,M01,4.9
LNS14000000,1955,M02,4.7
LNS14000000,1955,M03,4.6
LNS14000000,1955,M04,4.7
LNS14000000,1955,M05,4.3
LNS14000000,1955,M06,4.2
LNS14000000,1955,M07,4
LNS14000000,1955,M08,4.2
LNS14000000,1955,M09,4.1
LNS14000000,1955,M10,4.3
LNS14000000,1955,M11,4.2
LNS14000000,1955,M12,4.2
LNS14000000,1956,M01,4
LNS14000000,1956,M02,3.9

 

import pandas as pd
from pyecharts.charts import Bar, Line
from pyecharts import options as opts
from scipy import optimize

years = ['2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010']
data1 = [25, 50, 50.5, 44.5, 53.5, 49, 54, 66, 59, 68, 54]
data2 = [24, 31, 26, 30.5, 38, 37, 52, 63, 59, 64.5, 43]
data3 = [22, 23.5, 25.5, 29.5, 32, 32, 37, 49, 42, 55, 37]

# 创建 DataFrame
df = pd.DataFrame({'Year': years, 'Data1': data1, 'Data2': data2, 'Data3': data3})

# 将年份转换为整数类型
df['Year'] = df['Year'].astype(int)

# 定义拟合函数
def fit_func(x, a, b, c):
    return a * x**2 + b * x + c

# 生成拟合曲线数据
fit_years = list(range(min(df['Year']), max(df['Year'])+1))
fit_data1 = []
fit_data2 = []
fit_data3 = []

params1, params_covariance1 = optimize.curve_fit(fit_func, df['Year'], df['Data1'])
params2, params_covariance2 = optimize.curve_fit(fit_func, df['Year'], df['Data2'])
params3, params_covariance3 = optimize.curve_fit(fit_func, df['Year'], df['Data3'])

for year in fit_years:
    fit_data1.append(fit_func(year, *params1))
    fit_data2.append(fit_func(year, *params2))
    fit_data3.append(fit_func(year, *params3))

# 创建堆叠柱形图对象
stacked_bar = Bar()

# 添加原始数据到堆叠柱形图
stacked_bar.add_xaxis(years)
stacked_bar.add_yaxis('Data1 原始数据', data1, stack='stack0')
stacked_bar.add_yaxis('Data2 原始数据', data2, stack='stack0')
stacked_bar.add_yaxis('Data3 原始数据', data3, stack='stack0')

# 创建折线图对象用于拟合曲线
line = Line()

# 添加拟合曲线数据
line.add_xaxis(years)
line.add_yaxis('Data1 拟合曲线', fit_data1)
line.add_yaxis('Data2 拟合曲线', fit_data2)
line.add_yaxis('Data3 拟合曲线', fit_data3)

overlap_chart = line.overlap(stacked_bar)

overlap_chart.set_global_opts(
    title_opts=opts.TitleOpts(title='数据堆叠柱形图与拟合曲线', pos_bottom='0%', item_gap=0),
    xaxis_opts=opts.AxisOpts(name='年份'),
    yaxis_opts=opts.AxisOpts(name='数值')
)

# 渲染图表
overlap_chart.render('stacked_bar_with_fit_curves.html')

 

import pandas as pd
from pyecharts.charts import Bar, Line
from pyecharts import options as opts
from scipy import optimize

years = ['2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010']
data1 = [25, 50, 50.5, 44.5, 53.5, 49, 54, 66, 59, 68, 54]
data2 = [24, 31, 26, 30.5, 38, 37, 52, 63, 59, 64.5, 43]
data3 = [22, 23.5, 25.5, 29.5, 32, 32, 37, 49, 42, 55, 37]

# 创建 DataFrame
df = pd.DataFrame({'Year': years, 'Data1': data1, 'Data2': data2, 'Data3': data3})

# 将年份转换为整数类型
df['Year'] = df['Year'].astype(int)

# 定义拟合函数
def fit_func(x, a, b, c):
    return a * x**2 + b * x + c

# 生成拟合曲线数据
fit_years = list(range(min(df['Year']), max(df['Year'])+1))
fit_data1 = []
fit_data2 = []
fit_data3 = []

params1, params_covariance1 = optimize.curve_fit(fit_func, df['Year'], df['Data1'])
params2, params_covariance2 = optimize.curve_fit(fit_func, df['Year'], df['Data2'])
params3, params_covariance3 = optimize.curve_fit(fit_func, df['Year'], df['Data3'])

for year in fit_years:
    fit_data1.append(fit_func(year, *params1))
    fit_data2.append(fit_func(year, *params2))
    fit_data3.append(fit_func(year, *params3))

# 创建堆叠柱形图对象
stacked_bar = Bar()

# 添加原始数据到堆叠柱形图
stacked_bar.add_xaxis(years)
stacked_bar.add_yaxis('Data1 原始数据', data1, stack='stack0')
stacked_bar.add_yaxis('Data2 原始数据', data2, stack='stack0')
stacked_bar.add_yaxis('Data3 原始数据', data3, stack='stack0')

# 创建折线图对象用于拟合曲线
line = Line()

# 添加拟合曲线数据
line.add_xaxis(years)
line.add_yaxis('Data1 拟合曲线', fit_data1)
line.add_yaxis('Data2 拟合曲线', fit_data2)
line.add_yaxis('Data3 拟合曲线', fit_data3)

overlap_chart = line.overlap(stacked_bar)

overlap_chart.set_global_opts(
    title_opts=opts.TitleOpts(title='数据堆叠柱形图与拟合曲线', pos_bottom='0%', item_gap=0),
    xaxis_opts=opts.AxisOpts(name='年份'),
    yaxis_opts=opts.AxisOpts(name='数值')
)

# 渲染图表
overlap_chart.render('stacked_bar_with_fit_curves.html')