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

如何通过Pygal或编辑SVG文件将Solid Gauge水平排列

解决Pygal Solid Gauge水平排列的问题

Pygal原生实现思路

Pygal的SolidGauge组件本身不支持直接将多个仪表盘水平排列,默认只能垂直堆叠。要实现预期效果,可以创建两个独立的SolidGauge实例,再把它们的SVG结果拼接成水平布局。

具体代码示例:

import pygal
from lxml import etree

# 定义你用到的格式化函数(假设已实现)
def storage_formatter(x):
    return f"{x/1000:.1f}k"

def percent_formatter(x):
    return f"{x}%"

# 生成第一个仪表盘
gauge_left = pygal.SolidGauge(half_pie=True, inner_radius=0.70, 
                              style=pygal.style.styles['default'](value_font_size=20),
                              width=300, height=200)
gauge_left.add('Series 1', [{'value': 225000, 'max_value': 1275000}], formatter=storage_formatter)
svg_left = etree.fromstring(gauge_left.render())

# 生成第二个仪表盘
gauge_right = pygal.SolidGauge(half_pie=True, inner_radius=0.70, 
                               style=pygal.style.styles['default'](value_font_size=20),
                               width=300, height=200)
gauge_right.add('Series 2', [{'value': 110, 'max_value': 100}], formatter=percent_formatter)
svg_right = etree.fromstring(gauge_right.render())

# 合并两个仪表盘的SVG,设置水平排列
container_svg = etree.Element('svg', width='600', height='200', xmlns='http://www.w3.org/2000/svg')
# 左侧仪表盘放在x=0位置
left_group = etree.SubElement(container_svg, 'g', transform='translate(0, 0)')
left_group.append(svg_left.find('.//g'))
# 右侧仪表盘放在x=300位置
right_group = etree.SubElement(container_svg, 'g', transform='translate(300, 0)')
right_group.append(svg_right.find('.//g'))

# 输出或保存合并后的SVG
combined_svg = etree.tostring(container_svg, encoding='unicode')
# 保存到文件
with open('horizontal_gauges.svg', 'w') as f:
    f.write(combined_svg)

替代方案:用Plotly快速实现

如果不想折腾SVG拼接,可以直接用Plotly的Indicator组件一步实现水平并排的仪表盘,代码更简洁:

import plotly.graph_objects as go

fig = go.Figure()

# 添加左侧存储仪表盘
fig.add_trace(go.Indicator(
    mode = "gauge+number",
    value = 225000,
    domain = {'x': [0, 0.45], 'y': [0, 1]},
    title = {'text': "Series 1"},
    gauge = {
        'axis': {'range': [None, 1275000]},
        'bar': {'color': "#1e88e5"},
        'steps': [
            {'range': [0, 637500], 'color': "#f0f0f0"},
            {'range': [637500, 1275000], 'color': "#e0e0e0"}
        ]
    }
))

# 添加右侧百分比仪表盘
fig.add_trace(go.Indicator(
    mode = "gauge+number",
    value = 110,
    domain = {'x': [0.55, 1], 'y': [0, 1]},
    title = {'text': "Series 2"},
    gauge = {
        'axis': {'range': [None, 100]},
        'bar': {'color': "#e53935"},
        'steps': [
            {'range': [0, 50], 'color': "#f0f0f0"},
            {'range': [50, 100], 'color': "#e0e0e0"}
        ]
    }
))

fig.update_layout(width=600, height=300, margin=dict(l=20, r=20))
fig.show()

说明

  • 第一种方案完全基于Pygal实现,保留原仪表盘样式,需依赖lxml处理SVG元素
  • 第二种方案用Plotly实现更快捷,自带交互效果,无需手动拼接元素

内容的提问来源于stack exchange,提问作者Himanshu Joshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:55:19