如何用Pygal绘制堆叠柱状图?解决折线图代码的NameError错误
Pygal 相关问题解答
问题2:折线图代码报错「NameError: name 'x' is not defined」的修复
错误原因
代码中直接调用x.append()和y.append(),但变量x和y从未初始化(未创建空列表),Python无法识别这两个变量,因此抛出NameError。同时原代码逻辑未适配3条折线的需求,csv读取方式也不够高效。
解决方案
结合你的数据结构(年份+3个类别),以下是两种可行的修复方案:
方案1:使用pandas读取数据(推荐)
import pygal as pg import pandas as pd # 读取csv数据 df = pd.read_csv('data.csv') # 初始化折线图对象,设置X轴标签旋转避免重叠 line_chart = pg.Line(x_label_rotation=45) # 设置图表标题与X轴标签 line_chart.title = '各类别年度数据变化' line_chart.x_labels = df['Year'].astype(str) # 添加三条折线,分别对应三个类别 line_chart.add('类别1', df['Category1']) line_chart.add('类别2', df['Category2']) line_chart.add('类别3', df['Category3']) # 生成SVG格式图表文件 line_chart.render_to_file('three_lines.svg')
方案2:使用csv模块读取数据
import pygal as pg import csv filename = 'data.csv' # 先初始化空列表存储各列数据 years = [] cat1 = [] cat2 = [] cat3 = [] with open(filename, 'r') as f: # 用DictReader读取,直接通过表头名获取数据 reader = csv.DictReader(f) for row in reader: years.append(row['Year']) cat1.append(int(row['Category1'])) cat2.append(int(row['Category2'])) cat3.append(int(row['Category3'])) line_chart = pg.Line(x_label_rotation=45) line_chart.title = '各类别年度数据变化' line_chart.x_labels = years # 添加三条折线数据 line_chart.add('类别1', cat1) line_chart.add('类别2', cat2) line_chart.add('类别3', cat3) line_chart.render_to_file('three_lines.svg')
问题1:使用Pygal绘制堆叠柱状图
Pygal的Bar()类支持堆叠模式,只需初始化时传入stack=True参数,再依次添加各系列数据即可自动堆叠。
示例代码
import pygal as pg import pandas as pd df = pd.read_csv('data.csv') # 创建堆叠柱状图对象,开启堆叠模式 stacked_bar = pg.Bar(stack=True, x_label_rotation=45) stacked_bar.title = '各类别年度数据堆叠柱状图' stacked_bar.x_labels = df['Year'].astype(str) # 添加各类别数据,Pygal会自动完成堆叠 stacked_bar.add('类别1', df['Category1']) stacked_bar.add('类别2', df['Category2']) stacked_bar.add('类别3', df['Category3']) stacked_bar.render_to_file('stacked_bar.svg')
关键说明
- 核心参数是
stack=True,开启后同X轴的数据会自动堆叠 x_label_rotation用于旋转X轴年份标签,避免文字重叠
内容的提问来源于stack exchange,提问作者unleasehed
相关产品推荐
相关产品推荐

