Pyecharts中如何让折线置于柱状图上层及数值千位简化
解决Pyecharts柱状图与折线图层级及数值格式化问题
需求说明
- 将折线图移至柱状图上层显示
- 将数值转换为千位格式(如80000显示为80K)
解决方案及修改后的代码
关键修改点
- 折线图层级调整:在
Line的add_yaxis中添加z_level=10参数,让折线图拥有更高层级,确保显示在柱状图上方。 - 数值千位格式化:
- 为折线图对应的右侧Y轴(
yaxis_index=1)设置axislabel_opts的格式化规则,将数值除以1000并添加"K"后缀。 - 自定义
tooltip的格式化逻辑,统一处理不同系列的数值显示,柱状图保留原数值,折线图转换为K格式。
- 为折线图对应的右侧Y轴(
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
相关产品推荐
相关产品推荐

