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

一、数据准备

  • 定义了 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')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张謹礧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值