pygal,一個(gè)神奇的 Python 庫(kù)
Pygal 是一個(gè)開源的 Python 庫(kù),用于使用簡(jiǎn)單直觀的語(yǔ)法創(chuàng)建 SVG 圖表。它注重易用性,旨在用最少的代碼生成具有視覺吸引力的圖表。
Pygal 支持各種圖表類型,包括折線圖、條形圖和雷達(dá)圖。它適合那些想要以最少的配置快速、直接地創(chuàng)建靜態(tài)圖表的用戶。
一、核心功能
- SVG 支持:生成的圖表為矢量格式,可無(wú)損縮放,適合網(wǎng)頁(yè)嵌入或高質(zhì)量打印。
- 豐富的圖表類型:支持柱狀圖、折線圖、餅圖、散點(diǎn)圖、雷達(dá)圖、儀表盤圖、樹狀圖、金字塔圖等 14 種以上圖表類型。
- 交互性:默認(rèn)支持鼠標(biāo)懸停顯示數(shù)據(jù)標(biāo)簽、點(diǎn)擊事件等,無(wú)需額外代碼。
- 個(gè)性化定制:可調(diào)整顏色、字體、軸標(biāo)簽、柱狀圖圓角、填充效果等。例如,通過(guò) Style 類自定義配色
二、安裝及基本用法
1. 庫(kù)安裝
通過(guò)pip進(jìn)行安裝:
pip install pygal
2. 柱狀圖
此示例中,我們將創(chuàng)建一個(gè)顯示公司季度銷售額的柱狀圖
import pygal
bar = pygal.Bar()
bar.title = "銷售額統(tǒng)計(jì)"
bar.x_labels = ['一季度', '二季度', '三季度', '四季度']
bar.add('2023年', [100, 200, 300, 400])
bar.render_to_file('sales.svg') # 保存為 SVG 文件
3. 餅圖
在此示例中,我們首先定義兩個(gè)列表 citys 和 users,分別包含城市名稱及其總?cè)藬?shù)百分比。 我們創(chuàng)建一個(gè)餅圖并將圖表的標(biāo)題設(shè)置為 "關(guān)注人數(shù)"。
import pygal
# Data
citys = ['北京', '上海', '廣州', '長(zhǎng)沙', '重慶']
users = [30, 25, 20, 15, 10]
pie_chart = pygal.Pie()
pie_chart.title = '關(guān)注人數(shù)'
for i in range(len(citys)):
pie_chart.add(citys[i], users[i])
# Render the chart
pie_chart.render_to_file('follow.svg')
4. 儀表盤圖(SolidGauge)
gauge = pygal.SolidGauge(half_pie=False, inner_radius=0.7)
gauge.title = "任務(wù)完成度"
gauge.add('進(jìn)度', 80)
gauge.render_to_file('proccess.svg')
參數(shù):
- half_pie 是否為半圓
- inner_raidus 內(nèi)部半徑
5. 雷達(dá)圖(Radar)
適用于多維數(shù)據(jù)對(duì)比,如學(xué)科能力分析:
radar = pygal.Radar(fill=True)
radar.x_labels = ['語(yǔ)文', '數(shù)學(xué)', '英語(yǔ)', '物理', '化學(xué)']
radar.add('學(xué)生A', [90, 85, 95, 80, 75])
radar.add('學(xué)生B', [85, 90, 95, 85, 75])
radar.render_to_file('radar.svg')
三、高級(jí)功能
1. 默認(rèn)懸停與點(diǎn)擊交互示例
Pygal 生成的 SVG 圖表默認(rèn)支持 懸停顯示數(shù)值,無(wú)需額外代碼。點(diǎn)擊事件需結(jié)合前端 JavaScript 實(shí)現(xiàn),但懸停效果開箱即用:
import pygal
# 創(chuàng)建柱狀圖
bar = pygal.Bar()
bar.title = "產(chǎn)品銷量(懸停查看數(shù)值)"
bar.x_labels = ['蘋果', '香蕉', '橘子', '葡萄']
bar.add('2023年', [120, 90, 150, 80])
bar.render_to_file('hover_demo.svg') # 保存為 SVG
# 打開文件查看效果(鼠標(biāo)懸停在柱子上即可顯示數(shù)值)
import webbrowser
webbrowser.open('hover_demo.svg')
鼠標(biāo)懸停在柱狀圖上方時(shí),自動(dòng)顯示對(duì)應(yīng)數(shù)值標(biāo)簽(如 120、90 等)
2. 自定義顏色樣式(使用 Style 類)
通過(guò) pygal.style.Style 自定義圖表顏色、字體等樣式:
from pygal import Bar
from pygal.style import Style
# 自定義樣式:深色背景 + 漸變柱狀圖
custom_style = Style(
background='#2d2d2d', # 背景色
plot_background='#2d2d2d', # 繪圖區(qū)背景
foreground='#dddddd', # 標(biāo)簽文字顏色
foreground_strnotallow='#ffffff', # 強(qiáng)調(diào)文字顏色(如標(biāo)題)
colors=('#ff4444', '#44ff44', '#4444ff'), # 數(shù)據(jù)序列顏色
opacity=0.8, # 透明度
opacity_hover=1.0, # 懸停時(shí)透明度
transitinotallow='400ms ease-out'# 動(dòng)畫過(guò)渡效果
)
# 應(yīng)用自定義樣式
bar = Bar(style=custom_style)
bar.title = "自定義顏色樣式示例"
bar.x_labels = ['紅色', '綠色', '藍(lán)色']
bar.add('系列1', [30, 50, 20])
bar.add('系列2', [20, 40, 60])
bar.render_to_file('custom_style.svg')
效果:
- 圖表背景為深灰色 (#2d2d2d),文字為淺灰色。
- 數(shù)據(jù)系列顏色依次為紅、綠、藍(lán),懸停時(shí)透明度增強(qiáng)。
- 保存后打開 SVG 文件查看完整效果。
3. 動(dòng)態(tài)修改單個(gè)數(shù)據(jù)點(diǎn)顏色
若需為特定數(shù)據(jù)點(diǎn)單獨(dú)著色,可傳遞顏色數(shù)組:
bar = pygal.Bar()
bar.add('銷量', [
{'value': 120, 'color': '#FF0000'}, # 紅色
{'value': 90, 'color': '#00FF00'}, # 綠色
{'value': 150, 'color': '#0000FF'}, # 藍(lán)色
{'value': 80, 'color': '#FFD700'} # 金色
])
bar.render_to_file('custom_color_points.svg')
四、應(yīng)用場(chǎng)景
- 數(shù)據(jù)分析:趨勢(shì)分析(折線圖)、分布對(duì)比(柱狀圖)。
- 教育領(lǐng)域:學(xué)生成績(jī)雷達(dá)圖、學(xué)科能力分布。
- 商業(yè)報(bào)告:銷售額堆疊柱狀圖、市場(chǎng)份額餅圖。
- 科研可視化:實(shí)驗(yàn)數(shù)據(jù)散點(diǎn)圖、多維數(shù)據(jù)雷達(dá)圖。
- 實(shí)時(shí)儀表盤:結(jié)合 Flask/Django 嵌入網(wǎng)頁(yè),動(dòng)態(tài)更新數(shù)據(jù)。