如何通过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
相关产品推荐
相关产品推荐

