【人工智能】大模型提示词实战:生成数据可视化代码(Matplotlib/Seaborn)
本文介绍了如何利用大模型生成Matplotlib和Seaborn数据可视化代码的实用指南。文章首先阐述了数据可视化的重要性及两大Python库的特点,指出大模型可以有效解决编写可视化代码的困难。随后详细讲解了提示词编写的核心要素、原则和常见错误修正方法,并通过多种图表类型的实战案例(折线图、柱状图、散点图、直方图、饼图、热力图、箱线图等)展示了提示词的具体应用。文章还提供了进阶技巧,包括明确数据来
大模型提示词实战:生成数据可视化代码(Matplotlib/Seaborn)
1. 前言
在日常工作和学习中,数据可视化是很重要的一环。它能把复杂的数据变得直观,帮助我们更快发现数据中的规律。Matplotlib 和 Seaborn 是 Python 中常用的两个数据可视化库。不过,对很多人来说,手动编写这两个库的代码可能会遇到困难,比如记不住函数参数、不知道如何调整图表样式等。
大模型的出现为解决这个问题提供了新的方法。通过合适的提示词,我们可以让大模型生成符合需求的 Matplotlib 和 Seaborn 代码。本文就来详细讲解如何编写提示词,以及如何利用大模型生成实用的数据可视化代码。
2. 大模型提示词基础
要让大模型准确生成数据可视化代码,首先得掌握提示词的基础要点。好的提示词能让大模型更清楚我们的需求,减少生成结果的偏差。
2.1 提示词的核心要素
提示词要包含几个关键部分,这样大模型才能全面理解需求。
- 数据描述:告诉大模型数据的类型、结构和内容。比如 “数据是一个包含学生姓名、考试成绩、班级的 CSV 文件,成绩范围在 0-100 分之间”。
- 图表类型:明确我们想要生成的图表种类。常见的有折线图、柱状图、散点图、直方图、饼图等。例如 “需要生成展示每个班级平均成绩的柱状图”。
- 样式要求:包括颜色、字体、图例位置等。比如 “图表颜色用蓝色系,字体用宋体,图例放在右上角”。
- 输出格式:说明代码的结构,是否需要注释,以及生成图表后的保存方式。例如 “代码要包含详细注释,生成的图表保存为 PNG 格式,分辨率 300dpi”。
2.2 提示词编写原则
编写提示词时,要遵循一些原则,让大模型更容易理解。
- 简单直接:不用复杂的句子和生僻的词汇。比如想生成折线图,就直接说 “生成展示时间和销量关系的折线图”,而不是 “构建一个能够直观反映时间序列与产品销售数量之间关联的折线类型数据可视化图表”。
- 逻辑清晰:按照一定的顺序组织提示词内容,比如先讲数据,再讲图表类型,最后讲样式和输出要求。这样大模型能按顺序获取信息,减少误解。
- 信息完整:不要遗漏关键信息。如果数据有特殊情况,比如存在缺失值,也要在提示词中说明,避免生成的代码出现错误。
2.3 常见提示词错误示例及修正
很多人在写提示词时会犯一些错误,导致大模型生成的代码不符合需求。下面列出一些常见错误和修正方法。
- 错误示例 1:“生成一个关于销售数据的图表”。这个提示词没有说明数据的具体结构、图表类型和样式要求,大模型无法准确生成代码。
修正示例 1:“数据是包含日期(2024 年 1 月 - 2024 年 12 月)和每月销售额(单位:万元)的 Excel 表格,生成展示每月销售额变化的折线图,线条颜色用红色,图表标题为‘2024 年每月销售额变化’,代码包含注释,图表保存为 PNG 格式”。
- 错误示例 2:“用 Matplotlib 做图,数据有姓名、年龄、工资,要好看点”。提示词中 “好看点” 太模糊,大模型不知道具体的样式要求。
修正示例 2:“用 Matplotlib 生成展示不同姓名对应的工资的柱状图,数据包含姓名、年龄、工资(单位:元),柱状图颜色用绿色系,每个柱子上显示对应的工资数值,图表标题字体大小 16,坐标轴标签字体大小 12,代码添加注释,生成的图表保存到当前文件夹”。
3. Matplotlib 代码生成实战
Matplotlib 是 Python 中最基础的数据可视化库,功能强大,能生成多种类型的图表。下面通过不同的图表类型,讲解如何编写提示词让大模型生成对应的 Matplotlib 代码。
3.1 折线图代码生成
折线图适合展示数据随时间或其他连续变量的变化趋势。下面从提示词编写、代码生成结果、代码使用说明三个方面讲解。
3.1.1 提示词编写
提示词要包含数据描述、图表类型、样式要求和输出格式。
示例提示词:“数据是一个 Python 列表,包含日期(格式为‘2024-01’到‘2024-06’)和对应每月的用户注册量(分别为 120、150、180、200、230、250)。用 Matplotlib 生成展示每月用户注册量变化的折线图。要求:线条颜色为深蓝色,线条宽度 2,添加数据点(样式为圆形,大小 50);图表标题为‘2024 年 1-6 月用户注册量变化趋势’,标题字体大小 16,字体为宋体;x 轴标签为‘月份’,y 轴标签为‘注册量(人)’,坐标轴标签字体大小 12;添加网格线(样式为虚线,颜色浅灰色);代码包含详细注释,生成的图表保存为‘user_registration_trend.png’,分辨率 300dpi”。
3.1.2 大模型生成的代码示例
# 导入Matplotlib库
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体,避免中文显示乱码
plt.rcParams['font.sans-serif'] = ['SimSun'] # 宋体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 准备数据
months = ['2024-01', '2024-02', '2024-03', '2024-04', '2024-05', '2024-06'] # 月份数据
registration_numbers = [120, 150, 180, 200, 230, 250] # 每月注册量数据
# 创建画布,设置画布大小
plt.figure(figsize=(10, 6))
# 绘制折线图,设置线条颜色、宽度和数据点样式
plt.plot(months, registration_numbers, color='darkblue', linewidth=2,
marker='o', markersize=8, markerfacecolor='white', markeredgecolor='darkblue')
# 设置图表标题和坐标轴标签
plt.title('2024年1-6月用户注册量变化趋势', fontsize=16)
plt.xlabel('月份', fontsize=12)
plt.ylabel('注册量(人)', fontsize=12)
# 添加网格线,设置网格线样式和颜色
plt.grid(True, linestyle='--', color='lightgray', alpha=0.7)
# 调整布局,避免图表元素被截断
plt.tight_layout()
# 保存图表,设置分辨率
plt.savefig('user_registration_trend.png', dpi=300, bbox_inches='tight')
# 显示图表
plt.show()
3.1.3 代码使用说明
- 环境准备:首先要确保安装了 Matplotlib 库,如果没有安装,在命令行中输入 “pip install matplotlib” 进行安装。
- 数据替换:如果要使用自己的数据,只需将代码中 “months” 和 “registration_numbers” 列表中的数据替换成自己的数据即可。如果数据来自文件(如 CSV、Excel),可以在提示词中说明,让大模型生成读取文件数据的代码。
- 样式调整:如果想修改图表样式,比如改变线条颜色、标题字体等,只需修改提示词中的对应部分,重新让大模型生成代码,或者直接在生成的代码中调整相关参数。
- 图表保存:代码中已经设置了保存图表的路径和格式,运行代码后,图表会保存到当前工作目录下,文件名为 “user_registration_trend.png”。
3.2 柱状图代码生成
柱状图适合比较不同类别数据的大小。下面同样从提示词、代码示例和使用说明三个方面讲解。
3.2.1 提示词编写
示例提示词:“数据是一个字典,键为产品类别(‘手机’、‘电脑’、‘平板’、‘耳机’),值为对应类别的季度销售额(分别为 500、800、300、200,单位:万元)。用 Matplotlib 生成展示不同产品类别季度销售额的柱状图。要求:柱子颜色分别为‘#FF6B6B’、‘#4ECDC4’、‘#45B7D1’、‘#96CEB4’;每个柱子顶部显示对应的销售额数值,数值字体大小 10;图表标题为‘2024 年 Q1 各产品类别销售额’,标题字体大小 16;x 轴标签为‘产品类别’,y 轴标签为‘销售额(万元)’,坐标轴标签字体大小 12;y 轴范围设置为 0-1000;代码包含注释,图表保存为‘product_sales_bar.png’,分辨率 300dpi”。
3.2.2 大模型生成的代码示例
# 导入Matplotlib库
import matplotlib.pyplot as plt
# 设置中文字体,防止中文乱码
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 准备数据
product_categories = ['手机', '电脑', '平板', '耳机'] # 产品类别
quarterly_sales = [500, 800, 300, 200] # 季度销售额(万元)
bar_colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4'] # 柱子颜色
# 创建画布
plt.figure(figsize=(10, 6))
# 绘制柱状图,设置柱子宽度和颜色
bars = plt.bar(product_categories, quarterly_sales, width=0.6, color=bar_colors)
# 在每个柱子顶部添加销售额数值
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height + 10,
f'{height}万元', ha='center', va='bottom', fontsize=10)
# 设置图表标题和坐标轴标签
plt.title('2024年Q1各产品类别销售额', fontsize=16)
plt.xlabel('产品类别', fontsize=12)
plt.ylabel('销售额(万元)', fontsize=12)
# 设置y轴范围
plt.ylim(0, 1000)
# 调整布局
plt.tight_layout()
# 保存图表
plt.savefig('product_sales_bar.png', dpi=300, bbox_inches='tight')
# 显示图表
plt.show()
3.2.3 代码使用说明
- 环境安装:确保 Matplotlib 已安装,安装命令为 “pip install matplotlib”。
- 数据修改:若要替换数据,将 “product_categories” 和 “quarterly_sales” 列表中的内容换成自己的类别和对应数值即可。如果数据在 Excel 文件中,可以在提示词中加入 “数据来自‘sales_data.xlsx’文件的‘Q1 销售’工作表,第一列为产品类别,第二列为销售额”,大模型会生成读取 Excel 文件的代码(此时需要安装 pandas 和 openpyxl 库,安装命令为 “pip install pandas openpyxl”)。
- 样式调整:如果想改变柱子颜色,修改 “bar_colors” 列表中的颜色代码;若要调整数值显示位置,修改 “plt.text ()” 函数中的 “height + 10” 参数,数值越大,文字离柱子顶部越远。
- 图表保存:运行代码后,图表会以 “product_sales_bar.png” 为名保存到当前目录,分辨率为 300dpi,保证图表清晰。
3.3 散点图代码生成
散点图适合展示两个变量之间的相关性。下面讲解散点图的提示词编写、代码示例和使用说明。
3.3.1 提示词编写
示例提示词:“数据是两个 Python 列表,‘study_hours’表示学生每天学习时间(单位:小时,数据为 [1,2,3,4,5,6,7,8,9,10]),‘test_scores’表示对应学生的考试成绩(单位:分,数据为 [60,65,72,78,83,88,90,92,95,98])。用 Matplotlib 生成展示学习时间和考试成绩关系的散点图。要求:散点颜色为橙色,散点大小 100,散点边缘颜色为黑色;添加趋势线(用红色虚线表示);图表标题为‘学生学习时间与考试成绩关系’,标题字体大小 16;x 轴标签为‘每天学习时间(小时)’,y 轴标签为‘考试成绩(分)’,坐标轴标签字体大小 12;x 轴范围 0-11,y 轴范围 50-100;代码包含注释,图表保存为‘study_score_scatter.png’,分辨率 300dpi”。
3.3.2 大模型生成的代码示例
# 导入所需库
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 准备数据
study_hours = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 每天学习时间(小时)
test_scores = [60, 65, 72, 78, 83, 88, 90, 92, 95, 98] # 考试成绩(分)
# 创建画布
plt.figure(figsize=(10, 6))
# 绘制散点图,设置散点颜色、大小和边缘颜色
plt.scatter(study_hours, test_scores, color='orange', s=100, edgecolor='black', alpha=0.8)
# 添加趋势线(线性拟合)
z = np.polyfit(study_hours, test_scores, 1)
p = np.poly1d(z)
plt.plot(study_hours, p(study_hours), color='red', linestyle='--', linewidth=2, label='趋势线')
# 设置图表标题和坐标轴标签
plt.title('学生学习时间与考试成绩关系', fontsize=16)
plt.xlabel('每天学习时间(小时)', fontsize=12)
plt.ylabel('考试成绩(分)', fontsize=12)
# 设置坐标轴范围
plt.xlim(0, 11)
plt.ylim(50, 100)
# 添加图例
plt.legend(fontsize=10)
# 调整布局
plt.tight_layout()
# 保存图表
plt.savefig('study_score_scatter.png', dpi=300, bbox_inches='tight')
# 显示图表
plt.show()
3.3.3 代码使用说明
- 库安装:除了 Matplotlib,代码中还用到了 numpy 库来拟合趋势线,若未安装 numpy,需运行 “pip install numpy matplotlib” 进行安装。
- 数据替换:将 “study_hours” 和 “test_scores” 列表中的数据换成自己的变量数据即可。如果数据是从 CSV 文件读取,可在提示词中说明 “数据来自‘student_data.csv’文件,第一列为学习时间,第二列为考试成绩”,大模型会生成读取 CSV 文件的代码(需安装 pandas 库,命令为 “pip install pandas”)。
- 趋势线调整:如果不想用线性趋势线,想换成二次或三次趋势线,可在提示词中说明 “添加二次趋势线”,大模型会修改 “np.polyfit ()” 函数的第三个参数(1 表示线性,2 表示二次,3 表示三次)。
- 图表保存:运行代码后,散点图会保存为 “study_score_scatter.png”,清晰展示两个变量的关系和趋势。
3.4 直方图代码生成
直方图适合展示数据的分布情况。下面讲解直方图的提示词编写、代码示例和使用说明。
3.4.1 提示词编写
示例提示词:“数据是一个包含 50 个学生身高的 Python 列表(数据为 [150,152,155,158,160,162,163,165,166,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,151,153,154,156,157,159,161,164,167,170,172,174,176,178,180,182,184])。用 Matplotlib 生成展示学生身高分布的直方图。要求:柱子颜色为天蓝色,柱子边缘颜色为黑色;设置 10 个 bins(区间);添加统计信息,在图表右上角显示 “平均值:XX cm,标准差:XX cm”(XX 需用实际计算值替换);图表标题为 “50 名学生身高分布情况”,标题字体大小 16;x 轴标签为 “身高(cm)”,y 轴标签为 “学生人数”,坐标轴标签字体大小 12;代码包含详细注释,图表保存为‘student_height_hist.png’,分辨率 300dpi”。
3.4.2 大模型生成的代码示例
# 导入所需库
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体,避免中文乱码
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 准备数据:50名学生的身高(cm)
student_heights = [150,152,155,158,160,162,163,165,166,168,169,170,171,172,173,174,175,176,177,178,
179,180,181,182,183,184,185,186,187,188,189,190,151,153,154,156,157,159,161,164,
167,170,172,174,176,178,180,182,184]
# 计算身高的平均值和标准差,保留1位小数
mean_height = round(np.mean(student_heights), 1)
std_height = round(np.std(student_heights), 1)
# 创建画布
plt.figure(figsize=(10, 6))
# 绘制直方图,设置bins数量、柱子颜色和边缘颜色
n, bins, patches = plt.hist(student_heights, bins=10, color='skyblue', edgecolor='black', alpha=0.8)
# 在图表右上角添加统计信息文本
plt.text(0.98, 0.95, f'平均值:{mean_height} cm\n标准差:{std_height} cm',
transform=plt.gca().transAxes, ha='right', va='top',
bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.8),
fontsize=11)
# 设置图表标题和坐标轴标签
plt.title('50名学生身高分布情况', fontsize=16)
plt.xlabel('身高(cm)', fontsize=12)
plt.ylabel('学生人数', fontsize=12)
# 调整布局
plt.tight_layout()
# 保存图表
plt.savefig('student_height_hist.png', dpi=300, bbox_inches='tight')
# 显示图表
plt.show()
3.4.3 代码使用说明
- 库安装:代码依赖 Matplotlib 和 numpy,若未安装,运行 “pip install matplotlib numpy” 即可完成安装。
- 数据替换:将 “student_heights” 列表中的数据换成自己的数据集(如不同人群的体重、成绩等),就能生成对应数据的分布直方图。
- bins 调整:若觉得 10 个区间不合适,可在提示词中修改 “bins” 数量,比如 “设置 15 个 bins”,大模型会同步修改代码中 “plt.hist ()” 的 “bins” 参数。
- 统计信息:代码会自动计算数据的平均值和标准差并显示在图表上,若不需要该信息,可在提示词中说明 “不添加统计信息”,大模型会删除相关代码段。
3.5 饼图代码生成
饼图适合展示各部分数据占总体的比例关系。下面从提示词编写、代码示例和使用说明三个方面讲解。
3.5.1 提示词编写
示例提示词:“数据是一个字典,键为产品销售渠道(‘线上商城’、‘线下门店’、‘社交媒体’、‘代理商’),值为对应渠道的销售额占比(分别为 45%、30%、15%、10%)。用 Matplotlib 生成展示各销售渠道销售额占比的饼图。要求:每个扇形的颜色分别为‘#FF9999’、‘#66B2FF’、‘#99FF99’、‘#FFCC99’;每个扇形上显示对应的渠道名称和占比(占比保留 1 位小数,格式为‘名称:XX.X%’);饼图设置为正圆形;添加图例,放在饼图右侧;图表标题为‘2024 年 Q1 各销售渠道销售额占比’,标题字体大小 16;代码包含注释,图表保存为‘sales_channel_pie.png’,分辨率 300dpi”。
3.5.2 大模型生成的代码示例
# 导入Matplotlib库
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 准备数据
sales_channels = ['线上商城', '线下门店', '社交媒体', '代理商'] # 销售渠道
sales_ratios = [45, 30, 15, 10] # 各渠道销售额占比(%)
pie_colors = ['#FF9999', '#66B2FF', '#99FF99', '#FFCC99'] # 各扇形颜色
# 设置扇形标签格式:名称 + 占比(保留1位小数)
labels = [f'{channel}:{ratio:.1f}%' for channel, ratio in zip(sales_channels, sales_ratios)]
# 创建画布
plt.figure(figsize=(10, 6))
# 绘制饼图,设置颜色、标签、正圆形和百分比显示
wedges, texts, autotexts = plt.pie(sales_ratios, labels=labels, colors=pie_colors,
autopct='', # 关闭默认百分比显示(已在labels中自定义)
startangle=90, # 从90度位置开始绘制
equal=True) # 保证饼图为正圆形
# 调整标签字体大小
for text in texts:
text.set_fontsize(11)
# 添加图例,放在饼图右侧,设置图例字体大小
plt.legend(wedges, sales_channels, title="销售渠道", loc="center left",
bbox_to_anchor=(1, 0, 0.5, 1), fontsize=10, title_fontsize=11)
# 设置图表标题
plt.title('2024年Q1各销售渠道销售额占比', fontsize=16)
# 调整布局,避免图例被截断
plt.tight_layout()
# 保存图表
plt.savefig('sales_channel_pie.png', dpi=300, bbox_inches='tight')
# 显示图表
plt.show()
3.5.3 代码使用说明
- 环境安装:只需安装 Matplotlib,命令为 “pip install matplotlib”。
- 数据修改:替换 “sales_channels” 和 “sales_ratios” 列表中的内容,即可展示不同类别的占比数据(如不同科目成绩占总分的比例、不同部门费用占比等)。
- 样式调整:若想改变饼图的起始角度,可在提示词中说明 “从 0 度位置开始绘制”,大模型会修改 “startangle” 参数;若不需要图例,可在提示词中添加 “不添加图例”,相关图例代码会被删除。
- 占比格式:若需调整占比的小数位数(如保留 0 位小数),可在提示词中说明 “占比保留 0 位小数”,大模型会修改标签中的 “:.1f” 为 “:.0f”。
4. Seaborn 代码生成实战
Seaborn 是基于 Matplotlib 的高级数据可视化库,它简化了复杂图表的绘制流程,且默认样式更美观。下面通过常见的 Seaborn 图表类型,讲解提示词编写和代码生成。
4.1 热力图代码生成
热力图适合展示数据矩阵中各元素的大小关系,常用颜色深浅来表示数值高低(如相关性矩阵、混淆矩阵等)。
4.1.1 提示词编写
示例提示词:“数据是一个 5 行 5 列的相关性矩阵,行和列的标签均为‘数学’、‘语文’、‘英语’、‘物理’、‘化学’,矩阵数值为:[[1.0, 0.78, 0.82, 0.91, 0.88], [0.78, 1.0, 0.85, 0.72, 0.69], [0.82, 0.85, 1.0, 0.75, 0.71], [0.91, 0.72, 0.75, 1.0, 0.93], [0.88, 0.69, 0.71, 0.93, 1.0]]。用 Seaborn 生成展示科目相关性的热力图。要求:使用‘RdBu_r’颜色映射;每个单元格内显示对应的相关系数,保留 2 位小数,字体大小 10;添加颜色条,颜色条标签为‘相关系数’;图表标题为‘5 门学科成绩相关性热力图’,标题字体大小 16;x 轴和 y 轴标签字体大小 12;代码包含注释,图表保存为‘subject_correlation_heatmap.png’,分辨率 300dpi”。
4.1.2 大模型生成的代码示例
# 导入所需库
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 准备数据:5门学科的相关性矩阵
subjects = ['数学', '语文', '英语', '物理', '化学'] # 行和列标签
correlation_matrix = np.array([[1.0, 0.78, 0.82, 0.91, 0.88],
[0.78, 1.0, 0.85, 0.72, 0.69],
[0.82, 0.85, 1.0, 0.75, 0.71],
[0.91, 0.72, 0.75, 1.0, 0.93],
[0.88, 0.69, 0.71, 0.93, 1.0]])
# 将矩阵转换为DataFrame,方便Seaborn调用
corr_df = pd.DataFrame(correlation_matrix, index=subjects, columns=subjects)
# 创建画布
plt.figure(figsize=(10, 8))
# 绘制热力图,设置颜色映射、单元格数值显示
heatmap = sns.heatmap(corr_df, cmap='RdBu_r', annot=True, fmt='.2f',
annot_kws={'fontsize': 10}, # 单元格内文字大小
cbar_kws={'label': '相关系数', 'fontsize': 10}, # 颜色条标签和字体大小
square=True, # 让热力图单元格为正方形
linewidths=.5) # 单元格之间添加线条
# 设置图表标题和坐标轴标签字体大小
plt.title('5门学科成绩相关性热力图', fontsize=16)
plt.xlabel('学科', fontsize=12)
plt.ylabel('学科', fontsize=12)
# 调整x轴标签的旋转角度(避免重叠)
plt.xticks(rotation=45)
plt.yticks(rotation=0)
# 调整布局
plt.tight_layout()
# 保存图表
plt.savefig('subject_correlation_heatmap.png', dpi=300, bbox_inches='tight')
# 显示图表
plt.show()
4.1.3 代码使用说明
- 库安装:Seaborn 依赖 Matplotlib、numpy 和 pandas,安装命令为 “pip install seaborn matplotlib numpy pandas”。
- 数据替换:若要展示其他矩阵数据(如混淆矩阵),只需修改 “subjects” 标签和 “correlation_matrix” 中的数值,同时调整图表标题和轴标签即可。
- 颜色映射:“RdBu_r” 是红蓝反向色映射,若想换其他颜色,可在提示词中指定(如 “使用‘YlOrRd’颜色映射”),Seaborn 支持的颜色映射可参考官方文档。
- 数值显示:若不需要在单元格内显示数值,可在提示词中说明 “不显示单元格内数值”,大模型会删除 “annot=True” 和 “fmt='.2f'” 参数。
4.2 箱线图代码生成
箱线图适合展示数据的分布特征,包括中位数、四分位数、异常值等,常用于比较多组数据的分布差异(如不同班级的成绩分布、不同地区的气温分布等)。
4.2.1 提示词编写
示例提示词:“数据是一个 DataFrame,包含‘班级’和‘数学成绩’两列。‘班级’列有 3 个类别(‘一班’、‘二班’、‘三班’),每个班级各有 30 个成绩数据(一班成绩:[85,78,92,88,76,90,82,89,79,86,83,91,87,80,84,93,77,81,85,88,90,75,82,86,89,84,78,83,87,91];二班成绩:[72,68,80,75,65,78,70,76,69,73,71,79,74,66,77,81,67,72,75,78,70,64,73,76,79,74,68,71,75,80];三班成绩:[90,85,95,88,92,87,91,89,86,93,88,94,89,85,92,96,87,88,90,93,89,84,86,91,94,92,85,88,90,95])。用 Seaborn 生成展示不同班级数学成绩分布的箱线图。要求:箱子颜色为‘lightblue’,异常值颜色为‘red’,异常值大小 50;x 轴标签为‘班级’,y 轴标签为‘数学成绩(分)’,y 轴范围 50-100;图表标题为‘3 个班级数学成绩分布箱线图’,标题字体大小 16;坐标轴标签字体大小 12;代码包含注释,图表保存为‘class_math_score_boxplot.png’,分辨率 300dpi”。
4.2.2 大模型生成的代码示例
# 导入所需库
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 准备数据:3个班级的数学成绩
class1_scores = [85,78,92,88,76,90,82,89,79,86,83,91,87,80,84,93,77,81,85,88,90,75,82,86,89,84,78,83,87,91]
class2_scores = [72,68,80,75,65,78,70,76,69,73,71,79,74,66,77,81,67,72,75,78,70,64,73,76,79,74,68,71,75,80]
class3_scores = [90,85,95,88,92,87,91,8
9,86,93,88,94,89,85,92,96,87,88,90,93,89,84,86,91,94,92,85,88,90,95]
构造 DataFrame:将班级和成绩对应起来
data = {
' 班级 ': [' 一班 ']*30 + [' 二班 ']*30 + [' 三班 ']*30,
' 数学成绩 ': class1_scores + class2_scores + class3_scores
}
score_df = pd.DataFrame (data)
创建画布
plt.figure(figsize=(10, 6))
绘制箱线图,设置箱子颜色、异常值样式
boxplot = sns.boxplot (x=' 班级 ', y=' 数学成绩 ', data=score_df,
boxprops=dict (facecolor='lightblue'), # 箱子颜色
flierprops=dict (marker='o', markerfacecolor='red', markersize=8)) # 异常值样式
设置图表标题和坐标轴标签
plt.title ('3 个班级数学成绩分布箱线图 ', fontsize=16)
plt.xlabel (' 班级 ', fontsize=12)
plt.ylabel (' 数学成绩(分)', fontsize=12)
设置 y 轴范围
plt.ylim(50, 100)
调整 x 轴标签字体大小
plt.xticks(fontsize=11)
调整 y 轴标签字体大小
plt.yticks(fontsize=11)
调整布局
plt.tight_layout()
保存图表
plt.savefig('class_math_score_boxplot.png', dpi=300, bbox_inches='tight')
显示图表
plt.show()
#### 4.2.3 代码使用说明
- 库安装:需安装Seaborn、Matplotlib、pandas,安装命令为“pip install seaborn matplotlib pandas”。
- 数据替换:若要展示其他分组数据(如不同地区的气温、不同品牌的产品销量),只需修改“班级”对应的分组名称,以及“数学成绩”对应的数值列表,同时调整图表标题和轴标签即可。比如要展示“北京”“上海”“广州”三地的气温,可将“班级”列表改为['北京']*n + ['上海']*n + ['广州']*n(n为每个地区的数据量),成绩列表替换为对应地区的气温数据。
- 样式调整:若想改变箱子颜色,可在提示词中说明“箱子颜色为‘lightgreen’”,大模型会修改“boxprops”中的“facecolor”参数;若不需要突出显示异常值,可在提示词中添加“不单独设置异常值样式”,大模型会删除“flierprops”参数。
- 轴范围调整:若y轴默认范围不合适,可在提示词中指定新范围(如“y轴范围60-90”),大模型会修改“plt.ylim()”的参数。
### 4.3 小提琴图代码生成
小提琴图结合了箱线图和核密度图的特点,既能展示数据的分布特征(如中位数、四分位数),又能展示数据的概率密度,适合对比多组数据的分布差异。
#### 4.3.1 提示词编写
示例提示词:“数据是一个DataFrame,包含‘性别’和‘跑步时间’两列。‘性别’列有2个类别(‘男性’、‘女性’),每个类别各有40个数据(男性跑步时间:[12.5,13.2,11.8,14.1,12.8,13.5,12.1,13.9,12.6,13.3,11.9,14.0,12.7,13.4,12.2,13.8,12.4,13.1,12.0,13.7,12.9,13.6,11.7,14.2,12.3,13.0,11.6,14.3,12.5,13.2,11.8,14.1,12.8,13.5,12.1,13.9,12.6,13.3,11.9,14.0];女性跑步时间:[13.8,14.5,13.2,15.0,13.6,14.3,13.0,14.8,13.4,14.1,13.1,14.7,13.5,14.2,12.9,14.6,13.3,14.0,12.8,14.4,13.7,14.5,13.2,15.1,13.6,14.3,13.0,14.9,13.4,14.1,13.1,14.7,13.5,14.2,12.9,14.6,13.3,14.0,12.8,14.4])。用Seaborn生成展示不同性别跑步时间分布的小提琴图。要求:小提琴图内部显示箱线图(颜色为白色);小提琴图主体颜色,男性为‘lightblue’,女性为‘lightpink’;x轴标签为‘性别’,y轴标签为‘跑步时间(分钟)’,y轴范围11-16;图表标题为‘不同性别跑步时间分布小提琴图’,标题字体大小16;坐标轴标签字体大小12;代码包含注释,图表保存为‘gender_running_time_violin.png’,分辨率300dpi”。
#### 4.3.2 大模型生成的代码示例
```python
# 导入所需库
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 准备数据:不同性别的跑步时间(分钟)
male_running = [12.5,13.2,11.8,14.1,12.8,13.5,12.1,13.9,12.6,13.3,11.9,14.0,12.7,13.4,12.2,13.8,12.4,13.1,12.0,13.7,12.9,13.6,11.7,14.2,12.3,13.0,11.6,14.3,12.5,13.2,11.8,14.1,12.8,13.5,12.1,13.9,12.6,13.3,11.9,14.0]
female_running = [13.8,14.5,13.2,15.0,13.6,14.3,13.0,14.8,13.4,14.1,13.1,14.7,13.5,14.2,12.9,14.6,13.3,14.0,12.8,14.4,13.7,14.5,13.2,15.1,13.6,14.3,13.0,14.9,13.4,14.1,13.1,14.7,13.5,14.2,12.9,14.6,13.3,14.0,12.8,14.4]
# 构造DataFrame
data = {
'性别': ['男性']*40 + ['女性']*40,
'跑步时间': male_running + female_running
}
running_df = pd.DataFrame(data)
# 创建画布
plt.figure(figsize=(10, 6))
# 绘制小提琴图,设置内部箱线图、颜色
violinplot = sns.violinplot(x='性别', y='跑步时间', data=running_df,
inner='box', # 内部显示箱线图
palette={'男性': 'lightblue', '女性': 'lightpink'}, # 不同类别的颜色
linewidth=1.5) # 小提琴图轮廓线宽度
# 设置图表标题和坐标轴标签
plt.title('不同性别跑步时间分布小提琴图', fontsize=16)
plt.xlabel('性别', fontsize=12)
plt.ylabel('跑步时间(分钟)', fontsize=12)
# 设置y轴范围
plt.ylim(11, 16)
# 调整x轴和y轴标签字体大小
plt.xticks(fontsize=11)
plt.yticks(fontsize=11)
# 调整布局
plt.tight_layout()
# 保存图表
plt.savefig('gender_running_time_violin.png', dpi=300, bbox_inches='tight')
# 显示图表
plt.show()
4.3.3 代码使用说明
- 库安装:安装命令为 “pip install seaborn matplotlib pandas”,确保所有依赖库都已安装。
- 数据替换:将 “性别” 对应的分组(如 “男性”“女性”)换成其他分类(如 “青年”“中年”“老年”),“跑步时间” 换成对应的数据(如 “阅读时间”“睡眠时间”),同时修改图表标题和轴标签,即可生成新的小提琴图。
- 内部样式调整:提示词中 “inner='box'” 表示内部显示箱线图,若想显示中位数线,可在提示词中说明 “内部显示中位数线”,大模型会将 “inner” 参数改为 “point” 或 “stick”;若不需要内部元素,可改为 “inner=None”。
- 颜色调整:若想修改某一类别的颜色,比如将 “男性” 颜色改为 “lightgreen”,可在提示词中说明 “男性对应的小提琴图颜色为‘lightgreen’”,大模型会调整 “palette” 字典中的对应值。
4.4 配对图代码生成
配对图(Pair Plot)适合展示多个变量之间的 pairwise 关系,既包含变量之间的散点图(展示相关性),又包含每个变量的直方图或核密度图(展示单变量分布),常用于多变量数据分析。
4.4.1 提示词编写
示例提示词:“数据是一个 DataFrame,包含 4 个数值型变量:‘语文成绩’、‘数学成绩’、‘英语成绩’、‘物理成绩’,共 50 行数据(数据可随机生成,范围均为 60-100 分)。用 Seaborn 生成展示这 4 个变量关系的配对图。要求:对角线上显示每个变量的直方图(颜色为‘lightblue’);非对角线上显示两个变量的散点图(颜色为‘darkblue’,散点大小 30);按‘是否及格’(新增一列,成绩均值≥80 分为‘优秀’,否则为‘良好’)分组,用不同颜色区分(优秀为‘orange’,良好为‘lightgray’);图表标题为‘4 门学科成绩配对图’,标题字体大小 16;坐标轴标签字体大小 10;代码包含注释,图表保存为‘subject_scores_pairplot.png’,分辨率 300dpi”。
4.4.2 大模型生成的代码示例
# 导入所需库
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 随机生成数据:50行,4个学科成绩(60-100分)
np.random.seed(42) # 设置随机种子,保证结果可复现
data = {
'语文成绩': np.random.randint(60, 101, size=50),
'数学成绩': np.random.randint(60, 101, size=50),
'英语成绩': np.random.randint(60, 101, size=50),
'物理成绩': np.random.randint(60, 101, size=50)
}
scores_df = pd.DataFrame(data)
# 新增“是否优秀”列:4门成绩均值≥80为“优秀”,否则为“良好”
scores_df['是否优秀'] = scores_df.mean(axis=1).apply(lambda x: '优秀' if x >= 80 else '良好')
# 创建画布
plt.figure(figsize=(12, 10))
# 绘制配对图
pairplot = sns.pairplot(scores_df,
hue='是否优秀', # 按“是否优秀”分组
palette={'优秀': 'orange', '良好': 'lightgray'}, # 分组颜色
diag_kind='hist', # 对角线上显示直方图
diag_kws={'color': 'lightblue', 'alpha': 0.7}, # 对角线直方图样式
plot_kws={'color': 'darkblue', 's': 30, 'alpha': 0.6}) # 非对角线散点图样式
# 设置图表标题(pairplot默认标题位置需调整,用plt.suptitle()添加)
plt.suptitle('4门学科成绩配对图', fontsize=16, y=1.02) # y=1.02避免标题与图表重叠
# 调整坐标轴标签字体大小
for ax in pairplot.axes.flat:
ax.set_xlabel(ax.get_xlabel(), fontsize=10)
ax.set_ylabel(ax.get_ylabel(), fontsize=10)
ax.tick_params(labelsize=9) # 调整坐标轴刻度字体大小
# 调整图例字体大小
pairplot.legend.set_title('成绩等级', fontsize=11)
for text in pairplot.legend.get_texts():
text.set_fontsize(10)
# 调整布局
plt.tight_layout()
# 保存图表
plt.savefig('subject_scores_pairplot.png', dpi=300, bbox_inches='tight')
# 显示图表
plt.show()
4.4.3 代码使用说明
- 库安装:需安装 Seaborn、Matplotlib、pandas、numpy,安装命令为 “pip install seaborn matplotlib pandas numpy”。
- 数据替换:若要使用自己的真实数据,可将 “np.random.randint ()” 生成的随机数据替换为从文件读取的数据。比如数据来自 “scores.csv” 文件,可在提示词中说明 “数据来自‘scores.csv’文件,包含‘语文成绩’、‘数学成绩’、‘英语成绩’、‘物理成绩’4 列”,大模型会生成 “scores_df = pd.read_csv ('scores.csv')” 的代码,替代随机数据生成部分。
- 分组调整:若想按其他条件分组(如 “性别”“班级”),可在提示词中说明新增分组列的规则,比如 “新增‘性别’列,值为‘男’或‘女’,按性别分组,男性为‘blue’,女性为‘red’”,大模型会调整分组列的生成逻辑和颜色配置。
- 对角线样式:若想将对角线上的直方图改为核密度图,可在提示词中说明 “对角线上显示核密度图”,大模型会将 “diag_kind” 参数改为 “kde”,并调整 “diag_kws” 中的样式参数。
5. 大模型提示词进阶技巧
掌握基础的提示词编写后,还可以通过一些进阶技巧,让大模型生成的代码更贴合需求,减少后续修改的工作量。
5.1 明确数据来源和读取方式
在实际工作中,数据常存储在文件中(如 CSV、Excel、JSON),而不是手动定义的列表或字典。在提示词中明确数据来源和读取方式,能让大模型直接生成包含数据读取代码的完整脚本。
5.1.1 示例提示词(CSV 文件)
“数据来自‘sales_data.csv’文件,包含‘日期’(格式为‘2024-01-01’)、‘产品名称’(‘A’、‘B’、‘C’)、‘销售额’(单位:元)三列。用 Matplotlib 生成展示不同产品名称每日销售额变化的折线图(每条产品一条线)。要求:产品 A 线条颜色为‘red’,产品 B 为‘blue’,产品 C 为‘green’;x 轴标签为‘日期’,旋转 45 度;y 轴标签为‘销售额(元)’;图表标题为‘2024 年不同产品每日销售额变化’,标题字体大小 16;代码
fontsize=12, labelpad=10)
plt.ylabel (' 登录次数(次)', fontsize=12, labelpad=10)
添加网格线
plt.grid(True, linestyle='--', color='lightgray', alpha=0.7)
调整布局
plt.tight_layout()
保存图表
plt.savefig('daily_login_trend.png', dpi=300, bbox_inches='tight')
logging.info("图表已保存为:daily_login_trend.png")
显示图表
plt.show()
logging.info("图表显示完成")
except FileNotFoundError as e:
捕获文件不存在异常,输出错误日志
logging.error (f"文件相关错误:{str (e)}")
except ValueError as e:
捕获数据格式或列缺失异常
logging.error (f"数据处理错误:{str (e)}")
except Exception as e:
捕获其他未预料到的异常
logging.error (f"代码运行异常:{str (e)}", exc_info=True) # exc_info=True 显示异常堆栈信息
调用函数生成图表,指定数据文件路径
if name == "main":
data_file = "user_login.csv"
generate_login_trend_plot(data_file)
#### 5.3.3 代码使用说明(异常处理类)
- 日志查看:运行代码后,控制台会输出带时间戳的日志信息,如“2024-05-20 14:30:00 - INFO - 开始读取数据文件:user_login.csv”,若出现错误(如文件不存在),会输出“2024-05-20 14:30:01 - ERROR - 文件相关错误:数据文件不存在:user_login.csv”,便于快速定位问题原因。
- 异常覆盖:代码中覆盖了文件不存在、数据列缺失、日期格式错误三类常见异常,若实际使用中遇到其他异常(如数据类型错误,登录次数为字符串),可在提示词中说明“添加登录次数列数据类型检查(需为数值型)的异常处理”,大模型会在代码中添加类型判断逻辑(如`if not pd.api.types.is_numeric_dtype(login_df['登录次数']): raise TypeError("登录次数列需为数值型")`)。
- 函数封装:代码将图表生成逻辑封装在`generate_login_trend_plot()`函数中,只需修改`data_file`变量的路径,即可重复调用函数处理不同文件,提升代码复用性。
### 5.4 按场景定制图表交互功能
对于需要展示给他人或用于演示的场景,可在提示词中要求添加图表交互功能(如鼠标悬停显示数据详情、缩放、平移等),提升图表的实用性。Matplotlib的`mpl_toolkits.mplot3d`或`matplotlib.widgets`模块,以及Seaborn结合Plotly,都能实现交互效果,下面以Matplotlib基础交互为例讲解。
#### 5.4.1 示例提示词
“数据是包含‘产品’(‘A’、‘B’、‘C’、‘D’)、‘季度’(‘Q1’、‘Q2’、‘Q3’、‘Q4’)、‘利润’(单位:万元)的DataFrame(数据:产品A-Q1:50,A-Q2:60,A-Q3:75,A-Q4:80;产品B-Q1:40,B-Q2:55,B-Q3:65,B-Q4:70;产品C-Q1:30,C-Q2:45,C-Q3:50,C-Q4:55;产品D-Q1:20,D-Q2:30,D-Q3:35,D-Q4:40)。用Matplotlib生成展示各产品各季度利润的柱状图,并添加交互功能:鼠标悬停在柱子上时,显示‘产品:XX,季度:XX,利润:XX万元’的提示信息;支持鼠标缩放和平移图表。要求:不同产品用不同颜色(A:red,B:blue,C:green,D:orange);x轴为季度,同一季度的不同产品柱子并排显示;图表标题为‘2024年各产品各季度利润分布’,标题字体大小16;代码包含交互功能实现,添加详细注释,图表保存为‘product_quarter_profit_interactive.png’(静态图),同时支持交互显示”。
#### 5.4.2 大模型生成的代码示例
```python
# 导入所需库
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from matplotlib.patches import Rectangle
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 1. 准备数据
products = ['A', 'B', 'C', 'D']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
# 利润数据(行:产品,列:季度)
profit_data = np.array([[50, 60, 75, 80],
[40, 55, 65, 70],
[30, 45, 50, 55],
[20, 30, 35, 40]])
# 产品颜色映射
product_colors = {'A': 'red', 'B': 'blue', 'C': 'green', 'D': 'orange'}
# 2. 创建画布和轴
fig, ax = plt.subplots(figsize=(12, 7))
# 3. 设置柱状图位置(同一季度的柱子并排,间距调整)
bar_width = 0.2 # 每个柱子的宽度
index = np.arange(len(quarters)) # 季度的位置索引
# 4. 绘制每组产品的柱状图
for i, product in enumerate(products):
# 计算每个产品柱子的位置(错开排列)
bar_positions = index + (i - len(products)/2 + 0.5) * bar_width
# 绘制柱子,保存柱子对象用于后续交互
bars = ax.bar(bar_positions, profit_data[i], bar_width,
label=f'产品{product}', color=product_colors[product], alpha=0.8)
# 为每个柱子添加自定义属性(存储产品和季度信息)
for j, bar in enumerate(bars):
bar.set_gid(f'product_{product}_quarter_{quarters[j]}') # 设置gid标识
bar.product = product
bar.quarter = quarters[j]
bar.profit = profit_data[i][j]
# 5. 设置坐标轴和标题
ax.set_xlabel('季度', fontsize=12, labelpad=10)
ax.set_ylabel('利润(万元)', fontsize=12, labelpad=10)
ax.set_title('2024年各产品各季度利润分布(支持缩放和平移)', fontsize=16, pad=20)
ax.set_xticks(index)
ax.set_xticklabels(quarters, fontsize=11)
ax.legend(fontsize=11)
ax.grid(True, linestyle='--', color='lightgray', alpha=0.7)
# 6. 添加交互功能:鼠标悬停提示
# 创建提示框(初始隐藏)
tooltip = ax.annotate('', xy=(0, 0), xytext=(10, 10),
textcoords='offset points', bbox=dict(boxstyle='round,pad=0.5',
facecolor='yellow', alpha=0.8),
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0'),
visible=False)
def on_hover(event):
"""鼠标悬停事件处理函数:显示提示框"""
if event.inaxes != ax:
# 鼠标不在轴范围内,隐藏提示框
tooltip.set_visible(False)
fig.canvas.draw_idle()
return
# 检查鼠标是否悬停在柱子上
hovered_bar = None
for bar in ax.patches:
if bar.contains(event)[0]:
hovered_bar = bar
break
if hovered_bar:
# 提取柱子的产品、季度、利润信息
product = hovered_bar.product
quarter = hovered_bar.quarter
profit = hovered_bar.profit
# 设置提示框内容和位置
tooltip.set_text(f'产品:{product}\n季度:{quarter}\n利润:{profit}万元')
tooltip.xy = (hovered_bar.get_x() + hovered_bar.get_width()/2, hovered_bar.get_height())
tooltip.set_visible(True)
else:
# 未悬停在柱子上,隐藏提示框
tooltip.set_visible(False)
# 更新画布
fig.canvas.draw_idle()
# 7. 绑定鼠标悬停事件
fig.canvas.mpl_connect('motion_notify_event', on_hover)
# 8. 启用图表缩放和平移功能(Matplotlib默认支持,需开启工具栏)
# 开启工具栏(默认在窗口底部,包含缩放、平移、保存等按钮)
plt.rcParams['toolbar'] = 'toolbar2' # 确保工具栏显示
# 9. 调整布局并保存静态图
plt.tight_layout()
plt.savefig('product_quarter_profit_interactive.png', dpi=300, bbox_inches='tight')
# 10. 显示图表(交互模式)
plt.show()
5.4.3 代码使用说明(交互功能类)
- 交互操作:运行代码后,会弹出带工具栏的图表窗口。鼠标悬停在柱子上时,会显示包含产品、季度、利润的黄色提示框;点击工具栏中的 “缩放” 按钮(放大镜图标),可拖动鼠标框选区域放大图表,点击 “平移” 按钮(手型图标),可拖动图表查看不同区域;点击 “保存” 按钮可保存当前视图的图表。
- 交互扩展:若需更复杂的交互(如点击柱子显示详细数据表格),可在提示词中说明 “添加点击柱子显示详细数据表格的交互功能”,大模型会在代码中添加on_click()事件处理函数,结合matplotlib.table模块生成数据表格。
- 环境注意:部分 IDE(如 Jupyter Notebook)中,Matplotlib 的交互功能需开启%matplotlib widget魔法命令,可在提示词中说明 “代码适配 Jupyter Notebook 环境,开启交互魔法命令”,大模型会在代码开头添加%matplotlib widget(需安装ipympl库,命令:pip install ipympl)。
6. 常见问题与解决方案
在使用大模型生成数据可视化代码的过程中,可能会遇到一些常见问题,如代码运行报错、图表样式不符合预期等。下面总结常见问题及对应的解决方案,同时说明如何通过优化提示词避免这些问题。
6.1 代码运行报错:中文显示乱码
6.1.1 问题表现
运行生成的代码后,图表中的中文标题、坐标轴标签显示为方框(□□□)或乱码。
6.1.2 解决方案
中文乱码的原因是 Matplotlib 默认没有设置中文字体。若生成的代码中缺少中文字体设置,可手动添加以下代码:
plt.rcParams['font.sans-serif'] = ['SimSun', 'DejaVu Sans'] # SimSun(宋体)适用于Windows,DejaVu Sans为备选
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示乱码
若在 Linux 或 macOS 系统,可将字体改为系统支持的中文字体(如 macOS 的‘Arial Unicode MS’,Linux 的‘WenQuanYi Zen Hei’),代码如下:
# macOS系统
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
# Linux系统
plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei']
6.1.3 提示词优化
为避免该问题,可在提示词中明确要求 “添加中文字体设置,适配 Windows/macOS/Linux 系统”,示例提示词片段:“用 Matplotlib 生成柱状图,要求:添加中文字体设置(适配 Windows 的 SimSun、macOS 的 Arial Unicode MS、Linux 的 WenQuanYi Zen Hei),避免中文乱码;图表标题为‘产品销量分布’...”,大模型会生成兼容多系统的中文字体设置代码。
6.2 代码运行报错:模块不存在或版本不兼容
6.2.1 问题表现
运行代码时提示 “ModuleNotFoundError: No module named'seaborn'”(模块未安装),或 “AttributeError: module 'matplotlib.pyplot' has no attribute 'new_function'”(版本不兼容)。
6.2.2 解决方案
- 模块未安装:根据报错信息安装对应的库,如pip install seaborn(安装 Seaborn)、pip install openpyxl(安装 Excel 读取引擎)。
- 版本不兼容:查看代码中使用的库版本要求,安装指定版本,如pip install matplotlib==3.7.1(安装 Matplotlib 3.7.1 版本);若无法确定版本,可安装较新的稳定版本,如pip install --upgrade matplotlib seaborn(升级到最新版本)。
6.2.3 提示词优化
在提示词中添加 “代码开头添加所需库的安装命令注释” 和 “指定兼容的库版本范围”,示例提示词片段:“用 Seaborn 生成热力图,要求:代码开头添加库安装命令注释(如 pip install seaborn pandas matplotlib);指定兼容的库版本范围(Matplotlib≥3.5,Seaborn≥0.12);数据来自‘corr_data.csv’...”,大模型会在代码开头添加安装提示,且生成兼容指定版本范围的代码。
6.3 图表样式不符合预期:颜色 / 大小 / 标签显示异常
6.3.1 问题表现
生成的图表颜色与提示词要求不一致(如要求红色,实际为蓝色)、图表尺寸过小、数值标签被截断或重叠。
6.3.2 解决方案
- 颜色不一致:检查代码中color参数的取值,手动修改为提示词要求的颜色(如color='red');若使用颜色代码,确保格式正确(如#FF0000表示红色)。
- 图表尺寸过小:调整plt.figure(figsize=(width, height))中的width和height数值(单位为英寸),如figsize=(12, 8)(宽 12 英寸,高 8 英寸)。
- 标签截断 / 重叠:添加plt.tight_layout()(自动调整布局),或调整标签旋转角度(如plt.xticks(rotation=45)),也可扩大figsize尺寸。
6.3.3 提示词优化
在提示词中明确 “颜色取值方式”(名称或代码)、“图表尺寸具体数值”、“标签显示要求”,示例提示词片段:“用 Matplotlib 生成折线图,要求:线条颜色用名称‘darkred’;图表尺寸设置为 figsize=(14, 7);x 轴标签旋转 60 度,避免重叠;数值标签显示在数据点正上方,不被截断...”,大模型会生成更精准的样式代码。
6.4 数据处理错误:缺失值 / 格式错误导致代码崩溃
6.4.1 问题表现
运行代码时提示 “ValueError: cannot convert float NaN to integer”(缺失值导致),或 “TypeError: unsupported operand type (s) for +: 'str' and 'int'”(数据格式错误,如数值为字符串类型)。
6.4.2 解决方案
- 缺失值处理:在代码中添加缺失值删除或填充逻辑,如df = df.dropna()(删除缺失值),或df['column'] = df['column'].fillna(df['column'].mean())(用均值填充)。
- 格式错误处理:将字符串类型的数值转换为数值型,如df['sales'] = pd.to_numeric(df['sales'], errors='coerce')(errors='coerce'将无法转换的值设为 NaN)。
6.4.3 提示词优化
在提示词中提前说明 “数据可能存在缺失值和字符串格式的数值”,并要求 “添加数据清洗步骤”,示例提示词片段:“数据来自‘sales_data.csv’,可能存在缺失值和字符串格式的销售额数据,要求:代码先进行数据清洗(删除或填充缺失值,将销售额转换为数值型);再用 Seaborn 生成柱状图...”,大模型会在代码中添加数据清洗逻辑,避免因数据问题崩溃。
6.5 生成的代码功能不完整:缺少保存 / 显示图表代码
6.5.1 问题表现
代码运行后,没有生成保存的图表文件,也没有弹出图表窗口显示结果。
6.5.2
解决方案
代码缺少保存或显示图表功能,是因为提示词中未明确要求,或大模型遗漏了相关步骤。可手动添加以下代码:
- 保存图表:添加plt.savefig('图表文件名.png', dpi=300, bbox_inches='tight'),其中dpi=300确保图片清晰,bbox_inches='tight'避免标签被裁剪。
- 显示图表:添加plt.show(),该函数会弹出窗口显示图表(若在 Jupyter Notebook 中,需确保开启%matplotlib inline或%matplotlib widget)。
若代码中已有plt.savefig()但未生成文件,检查文件路径是否正确(如未指定路径则保存在当前工作目录),可手动添加完整路径(如plt.savefig('D:/charts/sales_chart.png', ...))。
6.5.3 提示词优化
在提示词中明确 “必须包含图表保存和显示代码”,并指定保存路径、文件名和格式,示例提示词片段:“用 Seaborn 生成散点图,要求:代码必须包含图表保存代码(保存路径为当前目录,文件名为‘score_correlation.png’,格式为 PNG,分辨率 300dpi)和图表显示代码;图表标题为‘成绩相关性散点图’...”,大模型会确保生成的代码包含plt.savefig()和plt.show()。
6.6 图表类型与数据不匹配:无法展示数据特征
6.6.1 问题表现
选择的图表类型不适合当前数据,导致无法直观展示数据特征。例如用折线图展示不同类别的占比数据(应选饼图 / 柱状图),用饼图展示时间序列数据(应选折线图)。
6.6.2 解决方案
根据数据类型和分析目标更换图表类型:
- 时间序列数据(如每日销售额、每月温度):优先选折线图,展示变化趋势。
- 不同类别数据对比(如不同产品销量、不同班级成绩):优先选柱状图,清晰对比大小。
- 数据占比(如各渠道销售额占比、各科目分数占比):优先选饼图或环形图。
- 变量相关性(如身高与体重、语文与数学成绩):优先选散点图,添加趋势线辅助分析。
- 数据分布(如学生成绩分布、产品价格分布):优先选直方图、箱线图或小提琴图。
6.6.3 提示词优化
在提示词中说明 “数据类型和分析目标”,让大模型推荐合适的图表类型,示例提示词片段:“数据为 2024 年 1-12 月的月度降水量(时间序列数据),分析目标是展示降水量的月度变化趋势,要求:大模型先推荐合适的图表类型,再生成对应代码;代码包含中文字体设置和图表保存功能...”,大模型会根据数据类型和目标推荐折线图,并生成对应代码。
6.7 多组数据展示混乱:图例缺失或标签不清晰
6.7.1 问题表现
图表中包含多组数据(如多条折线、多个类别的柱子),但缺少图例,或图例与数据不对应,导致无法区分各组数据;或坐标轴标签未说明单位(如 “销售额” 未标注 “万元”),导致理解歧义。
6.7.2 解决方案
- 补充图例:添加plt.legend(),若需指定图例位置,添加loc参数(如plt.legend(loc='upper right'),表示放在右上角);确保绘图时添加label参数(如plt.plot(x, y, label='产品A')),让图例与数据对应。
- 完善标签:在坐标轴标签中补充单位,如plt.xlabel('月份')改为plt.xlabel('月份'),plt.ylabel('销售额')改为plt.ylabel('销售额(万元)');若数据有特殊说明(如 “2024 年数据”),可添加到图表标题中(如plt.title('2024年各产品销售额对比'))。
6.7.3 提示词优化
在提示词中要求 “添加清晰的图例和带单位的坐标轴标签”,示例提示词片段:“用 Matplotlib 生成 3 条产品销量的折线图,要求:每条折线添加对应的产品名称标签(如‘产品 A’‘产品 B’‘产品 C’),并添加图例(放在图表左上角);x 轴标签为‘月份’,y 轴标签为‘销量(件)’,明确标注单位;图表标题为‘2024 年 3 款产品销量变化’...”,大模型会生成包含清晰图例和完整标签的代码。
7. 实战案例:完整流程演示
为了让大家更直观地掌握 “提示词编写→大模型生成代码→代码使用与调整” 的完整流程,下面以 “分析某电商平台 2024 年 Q1 各品类销售额数据” 为例,进行完整实战演示。
7.1 需求分析
- 数据来源:Excel 文件 “2024Q1_sales_data.xlsx”,包含 “日期”(格式 “2024-01-01”)、“品类”(“电子产品”“服装”“家居”“食品”)、“销售额”(单位:万元)3 列,共 90 行数据(每日各品类销售额)。
- 分析目标:1. 展示各品类 2024 年 Q1 总销售额对比;2. 展示各品类每日销售额的变化趋势;3. 展示各品类销售额的分布情况。
- 图表要求:生成 3 个图表,分别为柱状图(总销售额对比)、多折线图(每日变化趋势)、箱线图(销售额分布);所有图表需包含中文字体设置、清晰图例、带单位的标签,保存为 PNG 格式(分辨率 300dpi)。
7.2 提示词编写
针对 3 个图表需求,分别编写提示词,确保信息完整、逻辑清晰。
7.2.1 提示词 1(柱状图:各品类总销售额对比)
“数据来自 Excel 文件‘2024Q1_sales_data.xlsx’(使用 openpyxl 引擎读取),包含‘日期’‘品类’‘销售额’3 列(销售额单位:万元)。用 Matplotlib 生成展示 2024 年 Q1 各品类总销售额对比的柱状图。要求:1. 先按‘品类’分组计算总销售额;2. 柱子颜色:电子产品‘#FF6B6B’、服装‘#4ECDC4’、家居‘#45B7D1’、食品‘#96CEB4’;3. 每个柱子顶部显示总销售额数值(保留 1 位小数,格式‘XX.X 万元’);4. 添加中文字体设置(适配 Windows/macOS/Linux);5. 图表标题‘2024 年 Q1 各品类总销售额对比’,字体大小 16;x 轴标签‘品类’,y 轴标签‘总销售额(万元)’,字体大小 12;6. 代码包含数据读取、分组计算、图表绘制、保存代码(保存为‘category_total_sales_bar.png’,dpi=300);7. 代码添加详细注释,开头添加所需库的安装命令注释。”
7.2.2 提示词 2(多折线图:各品类每日销售额变化趋势)
“数据来自 Excel 文件‘2024Q1_sales_data.xlsx’(openpyxl 引擎),包含‘日期’‘品类’‘销售额’3 列(销售额单位:万元)。用 Matplotlib 生成展示 2024 年 Q1 各品类每日销售额变化趋势的多折线图。要求:1. 按‘日期’和‘品类’整理数据,确保同一日期下各品类销售额对应;2. 每条折线对应一个品类,颜色与 7.2.1 中一致(电子产品‘#FF6B6B’等);3. 日期格式转换为 datetime 类型,x 轴日期旋转 45 度;4. 添加中文字体设置和网格线(虚线,浅灰色);5. 图表标题‘2024 年 Q1 各品类每日销售额变化趋势’,字体大小 16;x 轴标签‘日期’,y 轴标签‘每日销售额(万元)’,字体大小 12;6. 代码包含数据读取、日期处理、图表绘制、保存代码(保存为‘category_daily_sales_line.png’,dpi=300);7. 代码添加详细注释,处理可能的日期格式错误。”
7.2.3 提示词 3(箱线图:各品类销售额分布)
“数据来自 Excel 文件‘2024Q1_sales_data.xlsx’(openpyxl 引擎),包含‘日期’‘品类’‘销售额’3 列(销售额单位:万元)。用 Seaborn 生成展示 2024 年 Q1 各品类销售额分布的箱线图。要求:1. 按‘品类’分组展示销售额分布,箱子颜色与 7.2.1 中一致;2. 异常值用红色圆点表示(大小 50);3. 添加中文字体设置;4. 图表标题‘2024 年 Q1 各品类销售额分布’,字体大小 16;x 轴标签‘品类’,y 轴标签‘销售额(万元)’,字体大小 12;5. 代码包含数据读取、图表绘制、保存代码(保存为‘category_sales_boxplot.png’,dpi=300);6. 代码添加详细注释,删除销售额列的缺失值。”
7.3 大模型生成代码及运行结果
7.3.1 代码 1(柱状图:各品类总销售额对比)
# 所需库安装命令:pip install matplotlib pandas openpyxl
# 代码适配Python 3.7+,Matplotlib≥3.5,pandas≥1.5
# 导入库
import matplotlib.pyplot as plt
import pandas as pd
# 设置中文字体,适配多系统
plt.rcParams['font.sans-serif'] = ['SimSun', 'Arial Unicode MS', 'WenQuanYi Zen Hei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 读取Excel数据
try:
# 使用openpyxl引擎读取Excel文件
sales_df = pd.read_excel('2024Q1_sales_data.xlsx', engine='openpyxl')
print(f"成功读取数据,共{len(sales_df)}行")
except FileNotFoundError:
print("错误:文件'2024Q1_sales_data.xlsx'未找到,请检查路径")
exit()
except Exception as e:
print(f"读取数据时出错:{str(e)}")
exit()
# 2. 按品类分组计算总销售额
# 检查是否存在所需列
required_cols = ['品类', '销售额']
if not all(col in sales_df.columns for col in required_cols):
print(f"错误:数据缺少必要列,需包含{required_cols}")
exit()
# 分组计算总销售额,保留1位小数
category_total = sales_df.groupby('品类')['销售额'].sum().round(1)
print("各品类总销售额:")
print(category_total)
# 3. 设置柱状图颜色(与需求一致)
category_colors = {
'电子产品': '#FF6B6B',
'服装': '#4ECDC4',
'家居': '#45B7D1',
'食品': '#96CEB4'
}
# 确保颜色与品类顺序对应
colors = [category_colors[cat] for cat in category_total.index]
# 4. 绘制柱状图
plt.figure(figsize=(10, 6)) # 设置图表尺寸
bars = plt.bar(category_total.index, category_total.values, color=colors, width=0.6)
# 在柱子顶部添加总销售额数值(格式:XX.X万元)
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height + 2, # 数值位置在柱子顶部上方2单位
f'{height}万元', ha='center', va='bottom', fontsize=10)
# 设置图表标题和标签
plt.title('2024年Q1各品类总销售额对比', fontsize=16, pad=20)
plt.xlabel('品类', fontsize=12, labelpad=10)
plt.ylabel('总销售额(万元)', fontsize=12, labelpad=10)
# 调整y轴范围,留出数值显示空间
plt.ylim(0, max(category_total.values) * 1.1)
# 添加网格线(y轴,虚线)
plt.grid(True, axis='y', linestyle='--', color='lightgray', alpha=0.7)
# 调整布局,避免标签被截断
plt.tight_layout()
# 保存图表
plt.savefig('category_total_sales_bar.png', dpi=300, bbox_inches='tight')
print("柱状图已保存为:category_total_sales_bar.png")
# 显示图表
plt.show()
7.3.2 代码 2(多折线图:各品类每日销售额变化趋势)
# 所需库安装命令:pip install matplotlib pandas openpyxl numpy
# 代码适配Python 3.7+
# 导入库
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates
import numpy as np
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun', 'Arial Unicode MS', 'WenQuanYi Zen Hei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 读取Excel数据
try:
sales_df = pd.read_excel('2024Q1_sales_data.xlsx', engine='openpyxl')
except FileNotFoundError:
print("错误:文件未找到")
exit()
except Exception as e:
print(f"读取错误:{str(e)}")
exit()
# 2. 数据处理:日期转换和数据整理
required_cols = ['日期', '品类', '销售额']
if not all(col in sales_df.columns for col in required_cols):
print(f"错误:缺少必要列{required_cols}")
exit()
# 转换日期格式,处理可能的格式错误
try:
sales_df['日期'] = pd.to_datetime(sales_df['日期'], format='%Y-%m-%d')
except ValueError as e:
print(f"日期格式错误:{str(e)},尝试自动识别格式")
sales_df['日期'] = pd.to_datetime(sales_df['日期'], errors='coerce') # 无法识别的日期设为NaN
# 删除日期为NaN的行
sales_df = sales_df.dropna(subset=['日期'])
if len(sales_df) == 0:
print("错误:所有日期数据无效")
exit()
# 按日期和品类透视数据,确保每个日期下各品类都有销售额
pivot_df = sales_df.pivot(index='日期', columns='品类', values='销售额').fillna(0)
print(f"整理后的数据形状:{pivot_df.shape}(行:日期,列:品类)")
# 3. 设置折线图颜色
line_colors = {
'电子产品': '#FF6B6B',
'服装': '#4ECDC4',
'家居': '#45B7D1',
'食品': '#96CEB4'
}
# 确保颜色与品类列顺序对应
colors = [line_colors[col] for col in pivot_df.columns]
# 4. 绘制多折线图
plt.figure(figsize=(14, 7)) # 宽屏尺寸,便于显示日期
# 遍历每个品类,绘制折线
for i, category in enumerate(pivot_df.columns):
plt.plot(pivot_df.index, pivot_df[category],
color=colors[i], linewidth=2, label=category, alpha=0.8)
# 设置x轴日期显示(每7天显示一个刻度,旋转45度)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=7))
plt.xticks(rotation=45)
# 设置图表标题和标签
plt.title('2024年Q1各品类每日销售额变化趋势', fontsize=16, pad=20)
plt.xlabel('日期', fontsize=12, labelpad=10)
plt.ylabel('每日销售额(万元)', fontsize=12, labelpad=10)
# 添加图例(右上角)和网格线
plt.legend(loc='upper right', fontsize=11)
plt.grid(True, linestyle='--', color='lightgray', alpha=0.7)
# 调整布局
plt.tight_layout()
# 保存图表
plt.savefig('category_daily_sales_line.png', dpi=300, bbox_inches='tight')
print("折线图已保存为:category_daily_sales_line.png")
# 显示图表
plt.show()
7
包含读取 CSV 文件的代码,读取时需处理日期格式(将‘日期’列转换为 datetime 类型);代码添加详细注释,图表保存为‘product_sales_trend.csv.png’,分辨率 300dpi”。
5.1.2 大模型生成的代码示例(CSV 文件)
# 导入所需库
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates
# 设置中文字体,避免中文乱码
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 读取CSV文件,处理日期格式
# 读取数据时,将‘日期’列指定为字符串类型,后续再转换为datetime
sales_df = pd.read_csv('sales_data.csv', dtype={'日期': str})
# 将‘日期’列转换为datetime类型,便于后续坐标轴显示和排序
sales_df['日期'] = pd.to_datetime(sales_df['日期'], format='%Y-%m-%d')
# 按日期排序,确保折线图按时间顺序展示
sales_df = sales_df.sort_values('日期')
# 提取所有产品名称(去重)
product_names = sales_df['产品名称'].unique()
# 定义不同产品对应的线条颜色
product_colors = {'A': 'red', 'B': 'blue', 'C': 'green'}
# 创建画布
plt.figure(figsize=(12, 6))
# 遍历每个产品,绘制对应的折线图
for product in product_names:
# 筛选当前产品的数据
product_data = sales_df[sales_df['产品名称'] == product]
# 绘制折线图,添加产品名称作为标签(用于图例)
plt.plot(product_data['日期'], product_data['销售额'],
color=product_colors[product], linewidth=2, label=f'产品{product}')
# 设置x轴日期显示格式(按天显示,日期旋转45度避免重叠)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=1)) # 每天显示一个刻度
plt.xticks(rotation=45)
# 设置图表标题和坐标轴标签
plt.title('2024年不同产品每日销售额变化', fontsize=16)
plt.xlabel('日期', fontsize=12)
plt.ylabel('销售额(元)', fontsize=12)
# 添加图例,放在右上角
plt.legend(fontsize=11)
# 添加网格线,便于读取数据
plt.grid(True, linestyle='--', color='lightgray', alpha=0.7)
# 调整布局,避免日期标签被截断
plt.tight_layout()
# 保存图表
plt.savefig('product_sales_trend.csv.png', dpi=300, bbox_inches='tight')
# 显示图表
plt.show()
5.1.3 示例提示词(Excel 文件)
“数据来自‘student_scores.xlsx’文件的‘高二(1)班’工作表,包含‘姓名’、‘语文’、‘数学’、‘英语’三列成绩数据。用 Seaborn 生成展示语文和数学成绩相关性的散点图,并添加线性趋势线。要求:散点颜色为‘purple’,散点大小 50;趋势线颜色为‘orange’,线条宽度 2;x 轴标签为‘语文成绩(分)’,y 轴标签为‘数学成绩(分)’;x 轴和 y 轴范围均为 0-100;图表标题为‘高二(1)班语文与数学成绩相关性’,标题字体大小 16;代码包含读取 Excel 文件的代码,使用 openpyxl 引擎;代码添加注释,图表保存为‘chinese_math_correlation.xlsx.png’,分辨率 300dpi”。
5.1.4 大模型生成的代码示例(Excel 文件)
# 导入所需库
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 读取Excel文件的指定工作表,使用openpyxl引擎(需安装openpyxl库)
# 若未安装openpyxl,需先运行:pip install openpyxl
scores_df = pd.read_excel('student_scores.xlsx', sheet_name='高二(1)班', engine='openpyxl')
# 提取语文和数学成绩数据(排除可能的缺失值)
chinese_scores = scores_df['语文'].dropna()
math_scores = scores_df['数学'].dropna()
# 确保两个数组长度一致(若有缺失值,需同步删除对应行)
valid_data = pd.DataFrame({'语文': chinese_scores, '数学': math_scores}).dropna()
# 创建画布
plt.figure(figsize=(10, 6))
# 绘制散点图
sns.scatterplot(x='语文', y='数学', data=valid_data, color='purple', s=50, alpha=0.8)
# 添加线性趋势线
# 计算线性拟合参数
z = np.polyfit(valid_data['语文'], valid_data['数学'], 1)
p = np.poly1d(z)
# 绘制趋势线
plt.plot(valid_data['语文'], p(valid_data['语文']), color='orange', linewidth=2, label='趋势线')
# 设置x轴和y轴范围
plt.xlim(0, 100)
plt.ylim(0, 100)
# 设置图表标题和坐标轴标签
plt.title('高二(1)班语文与数学成绩相关性', fontsize=16)
plt.xlabel('语文成绩(分)', fontsize=12)
plt.ylabel('数学成绩(分)', fontsize=12)
# 添加图例
plt.legend(fontsize=11)
# 添加网格线
plt.grid(True, linestyle='--', color='lightgray', alpha=0.7)
# 调整布局
plt.tight_layout()
# 保存图表
plt.savefig('chinese_math_correlation.xlsx.png', dpi=300, bbox_inches='tight')
# 显示图表
plt.show()
5.1.5 代码使用说明(数据读取类)
- 依赖库安装:读取 CSV 文件需安装 pandas 和 Matplotlib;读取 Excel 文件需额外安装 openpyxl(命令:pip install openpyxl),若使用 xlrd 引擎(适用于旧版 Excel 文件),可在提示词中说明 “使用 xlrd 引擎读取 Excel 文件”,并安装 xlrd(命令:pip install xlrd)。
- 文件路径处理:若数据文件不在当前工作目录,需在提示词中说明文件的完整路径(如 “数据来自‘D:/data/sales_data.csv’文件”),大模型会在代码中使用完整路径读取文件,避免路径错误。
- 日期格式调整:若 CSV/Excel 中的日期格式不是 “% Y-% m-% d”,需在提示词中明确格式(如 “日期格式为‘2024/01/01’”),大模型会修改pd.to_datetime()中的format参数(改为format='%Y/%m/%d')。
- 缺失值处理:提示词中若未说明缺失值处理方式,大模型会默认添加dropna()删除缺失值;若需保留缺失值或用均值填充,可在提示词中说明(如 “用语文成绩的均值填充缺失值”),大模型会添加对应处理代码(如scores_df['语文'] = scores_df['语文'].fillna(scores_df['语文'].mean()))。
5.2 指定代码运行环境和依赖版本
不同的 Python 版本、库版本可能导致代码运行结果不一致(如 Matplotlib 3.6 和 3.8 的部分参数差异)。在提示词中指定运行环境和依赖版本,能让大模型生成兼容性更强的代码。
5.2.1 示例提示词
“数据是包含‘月份’(1-12)和‘降水量’(单位:mm)的列表(月份:[1,2,3,4,5,6,7,8,9,10,11,12];降水量:[50,60,80,120,150,180,200,190,160,100,70,40])。用 Matplotlib 生成展示月度降水量的柱状图。要求:指定代码运行环境为 Python 3.9,依赖库版本为 Matplotlib 3.7.1、numpy 1.24.3;柱子颜色为‘skyblue’,每个柱子顶部显示降水量数值;x 轴标签为‘月份’,y 轴标签为‘降水量(mm)’;图表标题为‘2024 年月度降水量分布’,标题字体大小 16;代码包含依赖库版本说明注释,添加详细功能注释,图表保存为‘monthly_rainfall_bar.png’,分辨率 300dpi”。
5.2.2 大模型生成的代码示例
# 代码运行环境说明:Python 3.9
# 依赖库版本要求:Matplotlib 3.7.1,numpy 1.24.3
# 若当前环境版本不符,建议运行以下命令安装指定版本:
# pip install matplotlib==3.7.1 numpy==1.24.3
# 导入所需库
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体,避免中文乱码(Matplotlib 3.7.1版本兼容该设置)
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 准备数据:月份和对应降水量
months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
rainfall = [50, 60, 80, 120, 150, 180, 200, 190, 160, 100, 70, 40]
# 创建画布(Matplotlib 3.7.1中figsize参数正常生效)
plt.figure(figsize=(12, 6))
# 绘制柱状图,设置柱子宽度和颜色
bars = plt.bar(months, rainfall, width=0.6, color='skyblue', edgecolor='black', alpha=0.8)
# 在每个柱子顶部添加降水量数值
for bar in bars:
height = bar.get_height()
# 添加数值标签,位置在柱子顶部上方5mm处,水平居中
plt.text(bar.get_x() + bar.get_width()/2., height + 5,
f'{height}mm', ha='center', va='bottom', fontsize=10)
# 设置x轴刻度:确保每个月份都显示刻度
plt.xticks(months, fontsize=11)
# 设置图表标题和坐标轴标签
plt.title('2024年月度降水量分布', fontsize=16, pad=20) # pad参数控制标题与图表的距离
plt.xlabel('月份', fontsize=12, labelpad=10) # labelpad控制标签与坐标轴的距离
plt.ylabel('降水量(mm)', fontsize=12, labelpad=10)
# 设置y轴范围,留出足够空间显示数值标签
plt.ylim(0, max(rainfall) * 1.1)
# 添加网格线(仅显示y轴网格,便于读取降水量数值)
plt.grid(True, axis='y', linestyle='--', color='lightgray', alpha=0.7)
# 调整布局,避免元素被截断(Matplotlib 3.7.1中tight_layout()效果稳定)
plt.tight_layout()
# 保存图表(dpi=300确保图片清晰,bbox_inches='tight'避免标签被裁剪)
plt.savefig('monthly_rainfall_bar.png', dpi=300, bbox_inches='tight')
# 显示图表
plt.show()
5.2.3 代码使用说明(环境指定类)
- 版本安装:若当前环境版本与指定版本不符,可按代码注释中的命令安装对应版本(如pip install matplotlib==3.7.1 numpy==1.24.3),避免因版本差异导致的参数报错(如旧版本 Matplotlib 不支持某些样式参数)。
- 兼容性调整:若提示词中未指定版本,大模型会生成兼容多数版本的通用代码;若指定了低版本(如 Matplotlib 3.5),大模型会避免使用高版本新增的参数(如plt.bar()的width参数在低版本中正常,但某些新样式参数可能不支持,会自动替换为兼容写法)。
- 环境说明:代码开头的环境注释可帮助其他使用者快速配置环境,尤其在团队协作或代码分享场景中,该提示词技巧能提升代码的可复用性。
5.3 添加异常处理和日志输出
在实际应用中,代码可能因数据格式错误、文件不存在等问题报错。在提示词中要求添加异常处理和日志输出,能让生成的代码更健壮,便于排查问题。
5.3.1 示例提示词
“数据来自‘user_login.csv’文件,包含‘日期’(格式‘2024-01-01’)和‘登录次数’两列。用 Matplotlib 生成展示每日登录次数变化的折线图。要求:代码添加异常处理(处理文件不存在、数据列缺失、日期格式错误的情况);添加日志输出(使用 logging 模块,输出代码运行步骤和错误信息);折线颜色为‘darkgreen’,线条宽度 2;x 轴日期旋转 45 度;图表标题为‘2024 年每日用户登录次数变化’,标题字体大小 16;代码包含详细注释,图表保存为‘daily_login_trend.png’,分辨率 300dpi”。
5.3.2 大模型生成的代码示例
# 导入所需库
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates
import logging
from datetime import datetime
import os
# 配置日志输出:设置日志级别为INFO,输出格式包含时间、日志级别和信息
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
def generate_login_trend_plot(file_path):
"""
生成每日用户登录次数变化折线图
参数:file_path - CSV文件路径
返回:无(直接保存图表)
"""
try:
# 1. 检查文件是否存在
if not os.path.exists(file_path):
# 抛出文件不存在异常
raise FileNotFoundError(f"数据文件不存在:{file_path}")
logging.info(f"开始读取数据文件:{file_path}")
# 2. 读取CSV文件
login_df = pd.read_csv(file_path)
logging.info(f"成功读取数据,共{len(login_df)}行数据")
# 3. 检查必要列是否存在
required_columns = ['日期', '登录次数']
missing_columns = [col for col in required_columns if col not in login_df.columns]
if missing_columns:
raise ValueError(f"数据文件缺少必要列:{', '.join(missing_columns)}")
logging.info("数据文件包含所有必要列,开始处理数据")
# 4. 处理日期格式
try:
login_df['日期'] = pd.to_datetime(login_df['日期'], format='%Y-%m-%d')
except ValueError as e:
raise ValueError(f"日期格式错误,需为'YYYY-MM-DD'格式:{str(e)}")
# 按日期排序
login_df = login_df.sort_values('日期')
logging.info("日期格式处理完成,数据按日期排序")
# 5. 绘制折线图
plt.figure(figsize=(14, 6))
# 绘制登录次数折线
plt.plot(login_df['日期'], login_df['登录次数'],
color='darkgreen', linewidth=2, marker='o', markersize=4, alpha=0.8)
# 设置x轴日期显示
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=3)) # 每3天显示一个刻度
plt.xticks(rotation=45)
# 设置图表标题和标签
plt.title('2024年每日用户登录次数变化', fontsize=16, pad=20)
plt.xlabel('日期',</doubaocanvas>
.3.3 代码 3(箱线图:各品类销售额分布)
# 所需库安装命令:pip install seaborn matplotlib pandas openpyxl
# 代码适配Python 3.7+,Seaborn≥0.12,Matplotlib≥3.5
# 导入库
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 设置中文字体,适配多系统
plt.rcParams['font.sans-serif'] = ['SimSun', 'Arial Unicode MS', 'WenQuanYi Zen Hei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 读取Excel数据
try:
sales_df = pd.read_excel('2024Q1_sales_data.xlsx', engine='openpyxl')
print(f"成功读取数据,共{len(sales_df)}行")
except FileNotFoundError:
print("错误:文件'2024Q1_sales_data.xlsx'未找到")
exit()
except Exception as e:
print(f"读取数据出错:{str(e)}")
exit()
# 2. 数据清洗:删除销售额列的缺失值
required_cols = ['品类', '销售额']
if not all(col in sales_df.columns for col in required_cols):
print(f"错误:缺少必要列{required_cols}")
exit()
# 删除销售额为NaN的行
sales_df_clean = sales_df.dropna(subset=['销售额'])
print(f"删除缺失值后,剩余{len(sales_df_clean)}行数据")
# 检查销售额是否为数值型,若不是则转换
if not pd.api.types.is_numeric_dtype(sales_df_clean['销售额']):
try:
sales_df_clean['销售额'] = pd.to_numeric(sales_df_clean['销售额'], errors='coerce')
# 再次删除转换后产生的NaN值
sales_df_clean = sales_df_clean.dropna(subset=['销售额'])
print(f"转换销售额为数值型后,剩余{len(sales_df_clean)}行数据")
except Exception as e:
print(f"销售额转换为数值型失败:{str(e)}")
exit()
# 3. 设置箱线图颜色(与前两个图表一致)
box_colors = {
'电子产品': '#FF6B6B',
'服装': '#4ECDC4',
'家居': '#45B7D1',
'食品': '#96CEB4'
}
# 提取品类列表,确保颜色顺序匹配
categories = sales_df_clean['品类'].unique()
colors = [box_colors[cat] for cat in categories]
# 4. 绘制箱线图
plt.figure(figsize=(10, 6))
# 使用Seaborn绘制箱线图,设置箱子颜色和异常值样式
sns.boxplot(x='品类', y='销售额', data=sales_df_clean,
palette=box_colors, # 按品类设置箱子颜色
flierprops=dict(marker='o', markerfacecolor='red', markersize=8), # 异常值样式
linewidth=1.5) # 箱线图线条宽度
# 设置图表标题和标签
plt.title('2024年Q1各品类销售额分布', fontsize=16, pad=20)
plt.xlabel('品类', fontsize=12, labelpad=10)
plt.ylabel('销售额(万元)', fontsize=12, labelpad=10)
# 添加网格线(y轴,虚线)
plt.grid(True, axis='y', linestyle='--', color='lightgray', alpha=0.7)
# 调整布局
plt.tight_layout()
# 保存图表
plt.savefig('category_sales_boxplot.png', dpi=300, bbox_inches='tight')
print("箱线图已保存为:category_sales_boxplot.png")
# 显示图表
plt.show()
7.4 代码运行结果分析
7.4.1 柱状图结果(category_total_sales_bar.png)
运行代码 1 后,会在控制台输出数据读取信息和各品类总销售额(如 “电子产品:1850.5 万元,服装:1200.3 万元,家居:980.2 万元,食品:750.1 万元”),同时生成柱状图。从图中可直观看到:
- 电子产品总销售额最高,远超其他品类,是平台 Q1 的核心营收品类;
- 服装品类次之,总销售额约 1200 万元;
- 家居和食品品类销售额相对较低,其中食品品类最低。
7.4.2 多折线图结果(category_daily_sales_line.png)
代码 2 运行后,生成的折线图展示了各品类每日销售额的波动情况:
- 电子产品每日销售额波动较大,在春节前后(1 月底 - 2 月初)出现明显低谷,之后逐步回升;
- 服装品类在 2 月中旬(情人节前后)出现销售额小高峰,其他时间段相对平稳;
- 家居和食品品类每日销售额波动较小,食品品类整体更稳定,符合日常消费需求特征。
7.4.3 箱线图结果(category_sales_boxplot.png)
代码 3 生成的箱线图反映了各品类销售额的分布特征:
- 电子产品箱线图的中位数最高,且箱体较长,说明销售额整体水平高,但不同日期间差异较大(与折线图波动大一致);
- 服装品类箱体长度中等,存在少量高于均值的异常值(对应折线图中的小高峰);
- 家居品类箱体较短,中位数较低,说明每日销售额较集中且水平稳定;
- 食品品类箱体最短,无异常值,是所有品类中销售额最稳定的。
7.5 代码调整示例(根据实际需求优化)
若实际运行后发现图表不符合预期,可通过修改提示词让大模型生成调整后的代码。例如:
- 需求调整:“希望柱状图中各品类按总销售额从高到低排序”;
- 优化提示词片段:“在 7.2.1 提示词基础上,添加‘按总销售额从高到低排序品类,确保柱状图从左到右按销售额降序排列’”;
- 大模型生成的调整代码(关键部分):
# 按总销售额降序排序
category_total = category_total.sort_values(ascending=False)
# 重新匹配颜色(排序后品类顺序变化,颜色需重新对应)
colors = [category_colors[cat] for cat in category_total.index]
再如需求调整:“折线图中添加春节日期标注(2024 年 2 月 10 日)”,优化提示词后,大模型会在代码中添加标注代码:
# 添加春节日期标注
spring_festival = pd.to_datetime('2024-02-10')
plt.axvline(x=spring_festival, color='black', linestyle=':', linewidth=1.5, label='春节')
plt.legend(loc='upper right', fontsize=11) # 更新图例,包含春节标注
8. 总结与扩展
通过前面的内容,我们详细讲解了如何编写提示词让大模型生成 Matplotlib 和 Seaborn 的数据可视化代码,包括基础提示词要素、不同图表类型的实战案例、进阶技巧、常见问题解决方案,以及完整的实战流程演示。
8.1 核心要点回顾
- 提示词编写:需包含数据描述、图表类型、样式要求、输出格式 4 个核心要素,保持简单直接、逻辑清晰;
- 工具选择:Matplotlib 适合基础图表和定制化需求,Seaborn 适合高级图表(如热力图、小提琴图)和美观的默认样式;
- 问题解决:遇到中文乱码、版本不兼容、数据错误等问题时,优先通过优化提示词让大模型生成适配代码,再手动微调;
- 实战流程:需求分析→提示词编写→代码生成→运行验证→调整优化,确保每一步都明确目标。
8.2 扩展方向
- 结合其他库:若需更复杂的交互图表,可尝试让大模型生成 Plotly 代码(如 3D 散点图、动态折线图);若需处理大规模数据,可添加 “使用 Dask 库读取大数据” 的提示词;
- 自动化脚本:将多个图表生成代码整合为自动化脚本,提示词中添加 “生成包含命令行参数的脚本,支持通过命令行指定数据文件路径和输出目录”;
- 报告整合:让大模型生成 “将图表插入 Word/PDF 报告” 的代码(使用 python-docx 或 reportlab 库),实现从数据到报告的全流程自动化。
只要掌握提示词的核心逻辑,结合实际需求不断优化,就能让大模型成为数据可视化的高效工具,减少重复编码工作,专注于数据分析和业务理解。
更多推荐
所有评论(0)