You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pyecharts中如何让折线置于柱状图上层及数值千位简化

解决Pyecharts柱状图与折线图层级及数值格式化问题

需求说明

  • 将折线图移至柱状图上层显示
  • 将数值转换为千位格式(如80000显示为80K)

解决方案及修改后的代码

关键修改点

  1. 折线图层级调整:在Line的add_yaxis中添加z_level=10参数,让折线图拥有更高层级,确保显示在柱状图上方。
  2. 数值千位格式化:
    • 为折线图对应的右侧Y轴(yaxis_index=1)设置axislabel_opts的格式化规则,将数值除以1000并添加"K"后缀。
    • 自定义tooltip的格式化逻辑,统一处理不同系列的数值显示,柱状图保留原数值,折线图转换为K格式。
from pyecharts.charts import Bar, Line
from pyecharts import options as opts
from pyecharts.globals import ThemeType

# 定义千位格式化函数
def format_k(value):
    return f"{int(value / 1000)}K" if value >= 1000 else value

bar = (
    Bar(init_opts=opts.InitOpts(width='100%', theme=ThemeType.VINTAGE))
    .add_xaxis(["Category-1" , "Category-2", "Category-3", "Category-4", "Category-5"])
    .add_yaxis('No. Of Investments', [100,700,900,500,400], label_opts=opts.LabelOpts(is_show=False))  # 修正原数据长度不一致问题
    .add_yaxis('No. Of Investors', [24,65,30,41,88], label_opts=opts.LabelOpts(is_show=False))
    .extend_axis(
        yaxis=opts.AxisOpts(
            name="Value",
            type_="value", 
            name_textstyle_opts=opts.TextStyleOpts(font_size=14, font_weight='bold', font_family='Dubai'),
            axislabel_opts=opts.LabelOpts(formatter=format_k)  # 右侧Y轴数值格式化
        )
    )
    .set_global_opts(
        legend_opts=opts.LegendOpts(
            is_show=True, 
            pos_right=0,
            textstyle_opts=opts.TextStyleOpts(font_size=14, font_weight='bold', font_family='Dubai')
        ),
        yaxis_opts=opts.AxisOpts(
            name='Count',
            name_location='middle',
            name_gap=50,
            type_="value",
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True),
            axispointer_opts=opts.AxisPointerOpts(is_show=False),
            name_textstyle_opts=opts.TextStyleOpts(font_size=14, font_weight='bold', font_family='Dubai')
        ),
        xaxis_opts=opts.AxisOpts(
            type_="category",
            axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
            name_textstyle_opts=opts.TextStyleOpts(font_size=14, font_weight='bold', font_family='Dubai'), 
            axislabel_opts=opts.LabelOpts(font_family='Dubai', rotate=30, font_size=11)
        ),
        tooltip_opts=opts.TooltipOpts(
            is_show=True,
            trigger="axis",
            textstyle_opts=opts.TextStyleOpts(font_family='Dubai'),
            # 自定义tooltip格式化
            formatter=lambda params: '<br/>'.join([
                f"{param.name}" if i == 0 else f"{param.seriesName}: {format_k(param.value) if param.seriesName == 'Investments Value' else param.value}"
                for i, param in enumerate(params)
            ])
        ),
        toolbox_opts=opts.ToolboxOpts(
            is_show=True, 
            pos_left='5%', 
            feature=opts.ToolBoxFeatureOpts(
                data_zoom=opts.ToolBoxFeatureDataZoomOpts(is_show=False), 
                data_view=opts.ToolBoxFeatureDataViewOpts(is_show=False),
                brush=None
            )
        )
    )
)

line = (
    Line()
    .add_xaxis(["Category-1" , "Category-2", "Category-3", "Category-4", "Category-5"])
    .add_yaxis(
        'Investments Value', 
        [50500,60020,84000,30150,41200],
        yaxis_index=1, 
        label_opts=opts.LabelOpts(is_show=False),
        linestyle_opts=opts.LineStyleOpts(width=2),
        z_level=10  # 设置折线图层级高于柱状图
    )
)

bar.overlap(line).render_notebook()

额外说明

  • 修正了原代码中No. Of Investments系列数据长度与X轴分类数不一致的问题(原数据有6个值,X轴仅5个分类)。
  • 若需要保留小数位,可修改format_k函数为return f"{value/1000:.1f}K"。

内容的提问来源于stack exchange,提问作者Tammam Raweh Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:35:24