R语言用户的AI可视化升级指南:用ChatGPT写ggplot2/Treemap代码
前言:为什么R用户特别需要AI协助
R语言有个有趣的现象:它的学习曲线在数据可视化这块特别陡。
你可能早就学会了:
- ✅ 数据导入:
read.csv(),readxl::read_excel() - ✅ 数据处理:
dplyr::filter(),dplyr::group_by() - ✅ 基础统计:
t.test(),lm()
但一到数据可视化,事情就变复杂了:
# 想要一个"漂亮的"图表?
# 需要学:ggplot2的语法结构、主题系统、图层组织...
# 还要知道:什么时候该用什么几何图形
# 更要想清楚:如何微调字体、颜色、坐标轴标签...
# 典型的ggplot2新手代码
ggplot(data, aes(x=var1, y=var2)) +
geom_point() +
theme_minimal()
# 变成专业级别的图表需要:
# +50 行额外代码配置 theme / scale / annotation...
这就是ChatGPT的价值所在。它能帮你跳过繁琐的语法查询,直接生成接近出版级的代码。
但更重要的是:你需要学会问对问题。
第一部分:准备阶段 — 问题诊断
在让ChatGPT写代码之前,先问自己这五个问题。这决定了后续Prompt的质量。
1.1 我的数据长什么样?
ChatGPT需要理解你数据的结构和规模。这个信息要尽可能具体:
# ❌ 错误的描述
"我有一个关于销售的数据集"
# ✅ 正确的描述
"我有一个销售数据框,包括:
- Year (2020-2024,数值)
- Region (华东、华南、华北、西部,分类)
- Product (A、B、C、D,分类)
- Sales (万元,数值,范围0-500)
- Profit (万元,数值,范围-50-100)
数据量:大约1000行
前几行长这样:
Year Region Product Sales Profit
2020 华东 A 120 25
2020 华东 B 85 15
2020 华南 A 95 18
最好的做法:在Prompt中粘贴 head(data) 或 str(data) 的输出结果。
1.2 我想展示什么故事?
这是最容易被忽视的问题。很多R用户会这样问ChatGPT:
"帮我画个图表对比不同地区的销售额"
但更好的问法是:
"我想展示以下故事:
1. 不同地区的总销售额排名
2. 同时展示各地区的利润率(Profit/Sales)
3. 用颜色区分利润率的高低
4. 重点突出华东地区的表现
核心信息:华东虽然销售额最高,但利润率其实不是最高的。"
为什么这个更好? 因为后者告诉ChatGPT你的叙事目标是什么,它就能建议合适的图表类型和编码方式。
1.3 这个图表的主要观众是谁?
不同的观众需要不同的图表风格:
| 观众 | 推荐风格 | 为什么 |
|---|---|---|
| 学术论文读者 | 黑白+简约 | 需要能打印,不依赖彩色 |
| 商务报告 | 彩色+品牌色 | 需要视觉冲击,传达自信 |
| 演讲幻灯片 | 大字号+高对比 | 需要远距离可见,快速理解 |
| 学位论文 | 清晰+详细 | 需要完整信息,允许较复杂 |
| 社交媒体 | 简洁+吸睛 | 需要快速抓住眼球,信息精简 |
告诉ChatGPT你的观众是谁,它会相应地建议:
- 字体大小、粗细
- 颜色方案
- 图例的位置和大小
- 是否需要直接标注数值
1.4 我想要什么样的图表类型?
这个问题的答案可能是"我不知道",这也很正常。
如果你确实不知道该用什么图表,可以这样问ChatGPT:
我有这样的数据:
[数据结构描述]
我想展示的是:
[故事描述]
请建议3种可能的图表类型,并解释每种的优缺点。
但如果你已经有想法了,一定要把想法告诉ChatGPT:
✅ "我想用Treemap来展示不同产品的销售额占比"
❌ "帮我画个图"
1.5 我对代码风格有什么要求?
这包括:
| 维度 | 选项 | 举例 |
|---|---|---|
| 代码复杂度 | 简洁/完整 | 简洁:仅用ggplot2 vs 完整:包含所有主题优化 |
| 库的选择 | 仅ggplot2 / 包含扩展包 | ggplot2 vs ggplot2+treemapify vs ggplot2+patchwork |
| 注释详细程度 | 最少/详细/非常详细 | 仅关键行 vs 每行都有注释 |
| 输出格式 | 代码块/可运行脚本/Rmd | 取决于你的用途 |
| 样式偏好 | 风格1/风格2/风格3 | 默认主题 vs Nature风格 vs 自定义主题 |
告诉ChatGPT这些偏好,它会生成更符合你需求的代码。
第二部分:核心Prompt写法
现在你已经想清楚了前面五个问题,接下来就是写一个高质量的Prompt。
2.1 标准的ggplot2 Prompt模板
这是我推荐的模板结构:
📋 Prompt模板 1 — 标准ggplot2图表
我需要用R和ggplot2创建一个数据可视化。 【数据背景】 - 数据名称: [你的数据框名称] - 数据维度: [行数 × 列数] - 主要变量: * X轴: [变量名] ([数据类型] - [值域范围/类别]) * Y轴: [变量名] ([数据类型] - [值域范围]) * 分组/颜色: [变量名] (可选) * 其他美学映射: [其他映射] (可选) 【数据样本】(粘贴 head(data, 5) 的输出) [实际数据] 【故事与目标】 我想展示: [具体的叙事目标] 核心问题: [这张图要回答什么问题] 关键洞察: [观众应该得到什么结论] 【图表要求】 1. 图表类型: [scatter/bar/line/violin/hex/density等] 2. 坐标系: [笛卡尔/极坐标/翻转等] 3. 分面(faceting): [按 [变量] 分面] 或 [不需要分面] 4. 统计变换(stat): [identity/count/summary/smooth等] 【视觉风格】 - 观众: [学术/商务/演讲/社交媒体等] - 颜色方案: [彩色/灰度/特定色系如"Deep Blue"] - 主题风格: [默认/简约/经典/自定义] - 字体: [默认/Arial/Times New Roman等] - 字号: [标题 12pt / 轴标签 10pt / 图例 8pt等] 【特殊需求】 1. [是否需要误差棒?范围是什么] 2. [是否需要直接标注数值?] 3. [是否需要统计检验标记(如显著性星号)] 4. [其他特殊要求] 【输出要求】 - 代码行数: [简洁版 / 标准版 / 完整版] - 注释详细程度: [最少 / 正常 / 详细] - 是否需要解释每一行代码: [是/否] - 图片尺寸建议: [宽 × 高,单位cm或inch] - 导出格式: [PNG/PDF/SVG等]
这个模板很长,但信息越完整,ChatGPT给出的答案越精准。
2.2 实际例子1:简单的柱状图
让我用一个具体例子来演示:
# 原始数据
sales_by_region <- data.frame(
Region = c("华东", "华南", "华北", "西部"),
Sales = c(450, 380, 290, 210),
Profit = c(95, 72, 48, 28)
)
好的Prompt写法:
我有一个销售数据框 sales_by_region,包含:
- Region: 四个地区 (华东、华南、华北、西部)
- Sales: 每个地区的销售额 (单位:万元)
- Profit: 每个地区的利润 (单位:万元)
数据:
Region Sales Profit
华东 450 95
华南 380 72
华北 290 48
西部 210 28
我想要:
一个柱状图,展示不同地区的销售额,并用颜色编码利润率(Profit/Sales)。
这样观众能一眼看出:哪个地区销售额最高?它的利润率如何?
观众:商务报告(需要专业、有冲击力)
颜色:使用RdYlGn配色(利润率高=绿色,低=红色)
其他:
- 在每个柱子上标注销售额具体数值
- 图例说明利润率含义
- 简洁清晰,不要过度装饰
请提供完整的ggplot2代码,并简要解释关键步骤。
ChatGPT会生成这样的代码(精简版):
library(ggplot2)
# 计算利润率
sales_by_region$ProfitRatio <- sales_by_region$Profit / sales_by_region$Sales
# 绘制图表
ggplot(sales_by_region, aes(x = reorder(Region, -Sales),
y = Sales,
fill = ProfitRatio)) +
geom_col() + # 柱状图
scale_fill_gradient(low = "red", high = "green",
name = "利润率",
labels = scales::percent) +
geom_text(aes(label = paste0(Sales, "万")),
vjust = -0.5, size = 4) + # 标注数值
theme_minimal() +
labs(title = "各地区销售额与利润率",
x = "地区",
y = "销售额 (万元)") +
theme(
axis.text = element_text(size = 10),
plot.title = element_text(size = 14, face = "bold", hjust = 0.5)
)
注意这段代码的关键要素:
- ✅ 用
reorder()按销售额排序,方便对比 - ✅ 用
fill映射利润率,用颜色编码额外维度 - ✅ 用
geom_text()标注具体数值 - ✅ 用
scale_fill_gradient()实现RdYlGn配色 - ✅ 用
theme_minimal()保持简洁
2.3 实际例子2:复杂的分面图
现在假设数据更复杂:
# 多年份、多地区、多产品的销售数据
sales_data <- data.frame(
Year = rep(2020:2024, 12),
Region = rep(c("华东", "华南", "华北"), each=20),
Product = rep(rep(c("A", "B", "C", "D"), each=5), 3),
Sales = rnorm(60, mean=200, sd=50),
Profit = rnorm(60, mean=40, sd=15)
)
好的Prompt:
我有一个时间序列销售数据 sales_data,包含:
- Year: 2020-2024 (5年)
- Region: 华东、华南、华北 (3个地区)
- Product: A、B、C、D (4个产品)
- Sales: 销售额 (万元)
- Profit: 利润 (万元)
数据量:60行
我想要一个分面图,展示:
1. 主要图表:不同产品在不同地区的销售趋势(折线图)
2. 分面:按地区分成3个子图(华东、华南、华北并排显示)
3. 每条折线代表一个产品,用不同颜色区分
4. X轴是年份,Y轴是销售额
目标:一眼看出 - 哪个产品在哪个地区增长最快?
观众:学位论文
风格:黑白+简约(要能打印)
标注:在每条线的末端标注产品名称
请生成ggplot2代码。
ChatGPT会生成:
library(ggplot2)
ggplot(sales_data, aes(x = Year, y = Sales, color = Product, group = Product)) +
geom_line(linewidth = 1) + # 折线
geom_point(size = 2) + # 数据点
facet_wrap(~ Region, nrow = 1) + # 按地区分面
scale_color_manual(values = c("A" = "black", "B" = "gray30",
"C" = "gray60", "D" = "lightgray")) +
theme_minimal() +
labs(title = "各产品在不同地区的销售趋势",
x = "年份", y = "销售额 (万元)",
color = "产品") +
theme(
plot.title = element_text(size = 12, face = "bold", hjust = 0.5),
axis.text = element_text(size = 9),
strip.text = element_text(size = 10, face = "bold"), # 分面标题
legend.position = "bottom"
)
这段代码的亮点:
- ✅ 用
facet_wrap()创建分面 - ✅ 用
scale_color_manual()指定黑白色系 - ✅
strip.text美化分面标题 - ✅ 用
group确保每个产品的数据点连成一条线
2.4 进阶技巧:Treemap图表
Treemap在展示层次关系和占比时特别强大。但ggplot2本身不直接支持,需要用 treemapify 包。
为Treemap写Prompt的特殊之处:
我需要用R创建一个Treemap,展示产品销售占比。
【数据】
产品数据框 products:
Product Category Sales
A 电子 450
B 电子 380
C 服装 290
D 服装 210
E 食品 180
F 食品 150
【需求】
1. 矩形大小代表销售额
2. 矩形的颜色代表产品类别
3. 在每个矩形内标注产品名称和销售额
4. 添加图例说明颜色含义
【特殊要求】
- 使用 treemapify 包(如果需要安装,告诉我命令)
- 颜色方案:使用Set2(柔和的彩色)
- 标签字号:产品名12pt,销售额10pt
- 不要显示百分比,只显示绝对值
请提供完整代码。
ChatGPT会生成:
library(ggplot2)
library(treemapify)
# 计算百分比(用于标注)
products$Label <- paste0(products$Product, "\n", products$Sales, "万元")
ggplot(products, aes(area = Sales, fill = Category, label = Label)) +
geom_treemap() + # 绘制矩形
geom_treemap_text(fontface = "bold", colour = "white",
place = "centre", size = 10) + # 标注文字
scale_fill_brewer(palette = "Set2") +
labs(title = "产品销售额分布 (按类别)",
fill = "产品类别") +
theme_minimal() +
theme(
plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
legend.position = "right"
)
Treemap的关键参数:
area = Sales- 矩形大小映射到销售额fill = Category- 颜色映射到类别label = Label- 标注文字geom_treemap_text()的place = "centre"- 文字居中放置
第二部分:Prompt最佳实践与常见错误
2.5 Prompt的常见错误及改进
❌ 错误1:信息不足,期望太高
糟糕的Prompt:
"帮我用ggplot2画一个漂亮的图表对比销售数据"
问题:
- ChatGPT不知道你的数据什么样
- 不知道你想强调什么
- 不知道"漂亮"对你意味着什么
- 结果:生成的代码与需求偏差大
改进后的Prompt:
我有销售数据框 sales_data,结构如下:
- Columns: Date (2024-01-01 to 2024-12-31),
Product (A/B/C/D),
Region (North/South/East/West),
Revenue (数值,单位万元)
- Rows: 365条日记录
我想要一个时间序列图,展示:
主要问题:2024年,哪个产品的销售增长最快?
具体需求:
- 每条线代表一个产品
- X轴:时间,Y轴:累积销售额
- 用颜色区分产品
- 突出显示趋势(可用平滑曲线)
观众:学术报告
风格:简洁、可用黑白打印
代码要求:包含详细注释
为什么改进后更好: ✅ 给了具体的数据结构
✅ 明确指出核心问题
✅ 说明了坐标轴映射
✅ 给了观众身份和风格指导
✅ ChatGPT现在有充分信息生成高质量代码
❌ 错误2:混淆美学映射与视觉效果
糟糕的Prompt:
"我想要一个漂亮的彩虹色图表"
问题:
- 没说明数据维度
- 没解释为什么要彩虹色
- ChatGPT可能生成色盲不友好的配色
改进后的Prompt:
我想用颜色编码第三维数据。
数据有:
- X轴:地区 (8个地区)
- Y轴:销售额
- 颜色:利润率 (0%-40%)
色彩要求:
- 利润率低 (0-15%) → 红色
- 利润率中 (15-30%) → 黄色
- 利润率高 (30-40%) → 绿色
这样用户能一眼看出:销售最多的地区,利润率如何
使用 scale_fill_gradient 或 scale_fill_brewer 实现
为什么好: ✅ 明确了美学映射的含义
✅ 指定了色彩顺序和理由
✅ 给了具体的参数选项
❌ 错误3:过度依赖ChatGPT做设计决策
糟糕的Prompt:
"帮我设计最好看的图表来展示这个数据"
问题:
- ChatGPT没有你对数据的理解
- ChatGPT可能生成"花哨但不实用"的图表
- 你无法解释为什么这样设计
改进后的Prompt:
我的数据包含多个维度。请帮我选择合适的图表类型。
我的数据:
- Year (2020-2024)
- Region (5个地区)
- Product (8个产品)
- Sales (连续数值)
我想同时展示:
1. 产品间的销售额差异
2. 地区间的差异
3. 时间趋势
问题:
- 应该用分面还是分组?
- 应该用什么几何图形?
- 能否用一张图展示所有维度,还是需要多图联动?
请:
1. 提出3种设计方案
2. 每种方案的优缺点
3. 你的推荐及理由
4. 对应的ggplot2代码框架
为什么好:
✅ 让ChatGPT帮你思考,而不是替你决策
✅ 你参与了设计过程,理解代码逻辑
✅ 最后选择权在你手中
2.6 不同场景的Prompt模板集
我整理了几个针对特定场景的Prompt模板,你可以直接改编使用:
模板A:论文图表(学术风格)
我正在写学位论文第[X]章,需要一个图表展示研究结果。
【研究背景】
研究问题:[你的研究问题]
假设:[核心假设]
【数据】
数据框名:[name]
样本量:[N]
主要变量:
- IV (自变量): [变量名,类型]
- DV (因变量): [变量名,类型]
- Moderator/Mediator: [如有]
【目标图表】
要展示的结果:[说明图表要展示什么统计结果]
必须元素:
□ 误差棒/置信区间 (95% CI)
□ 样本量标注 (N=...)
□ 统计显著性标记 (* p<.05, ** p<.01)
□ 图题和轴标签必须用中文/英文 [选择]
【风格要求】
- 观众:学位论文评审委员会
- 打印:黑白打印友好
- 期刊规范:[如适用,指定期刊如Nature/PNAS等]
- 图片尺寸:宽[X]cm × 高[Y]cm
【特殊需求】
[其他特殊要求,如是否需要图注等]
请提供完整的ggplot2代码和对应的图注(figure caption)文本。
模板B:商务演讲(吸睛风格)
我需要为[公司/部门]的[类型]演讲准备一张图表。
【演讲背景】
演讲主题:[标题]
观众:[如:C-level高管,销售团队,投资者等]
演讲时长:[X分钟]
我这张图的用途:[如:开场数据冲击,支撑核心论点,对比竞争对手等]
【数据】
数据来源:[内部系统/行业报告/自主调研]
数据周期:[如:2024年全年,或按季度]
关键指标:
- [指标1]: [最值数据]
- [指标2]: [最值数据]
- [指标3]: [最值数据]
【故事线】
这张图应该传递的信息:[1句话核心结论]
支持论据:[2-3个数据点]
预期反应:演讲后,观众应该理解/相信/采取行动是什么
【视觉要求】
- 颜色:[公司品牌色 或 指定的色系]
- 风格:[现代/专业/创意等]
- 字体:[无衬线/衬线]
- 对比度:[高对比,便于远距离投影]
【技术要求】
- 导出格式:[PNG/PDF/SVG]
- 分辨率:[如300 dpi用于打印]
- 尺寸:[16:9宽屏幅,具体尺寸]
请提供:1) 代码,2) 3秒内的图表解读说辞,3) 导出建议
模板C:探索性可视化(快速迭代)
我在做数据探索阶段,需要快速生成几个图表看看数据的分布。
【数据】
数据框:[name]
样本量:[N]
主要变量(简单描述):
- [var1]: [简介]
- [var2]: [简介]
- [var3]: [简介]
- ... (最多5-6个变量)
【问题】
我想快速看看:
□ 各变量的分布 (直方图/密度图)
□ 变量间的关系 (散点图/相关性)
□ 按组别的差异 (箱线图/小提琴图)
□ 时间序列变化 (折线图)
□ 其他 [具体描述]
【输出要求】
- 形式:多个子图拼接到一个图像中(用patchwork或cowplot)
- 风格:快速、简洁,不需要完美
- 代码:要易于修改(便于后续调整)
请用patchwork库拼接多个图表,代码要注释清楚便于我修改。
模板D:Treemap特定模板
我需要用Treemap展示分层结构的数据。
【数据结构】
数据有两个层级:
- 第一层(大类):[Category 1, 2, 3, ...]
- 第二层(细分):[Subcategory] 在每个大类下
数据框结构:
Category Subcategory Value [其他维度]
[例子]
数据样本:
[粘贴实际数据]
【映射】
- 矩形大小:映射到 [变量名] (代表什么?)
- 矩形颜色:映射到 [变量名] (用于区分什么?)
- 标注内容:[哪些信息要显示在矩形内]
【故事】
这个Treemap要回答的问题:
[如:哪个大类贡献最多?各大类内部如何分布?]
【设计要求】
- 颜色方案:[连续/离散] - [色系名]
- 标签:[变量名1, 变量名2, ...] 及字号
- 图例:[是否需要] [位置]
- 是否显示百分比:[是/否]
【输出】
尺寸:[宽×高] cm
格式:[PNG/PDF等]
请提供使用treemapify包的完整代码。
2.7 ChatGPT回答后的评估清单
当ChatGPT返回代码后,不要急着直接运行。先用这个清单评估一下:
【代码结构检查】
□ 是否导入了所需的库?(library 语句完整)
□ 是否假设了某些库已安装?(需要先 install.packages())
□ 代码是否从上到下可直接运行?(没有前置依赖问题)
□ 变量名是否与你的数据框名称匹配?
【美学映射检查】
□ 美学映射是否与你的故事相符?
□ 是否有多余的映射导致视觉混乱?
□ 颜色选择是否符合你的要求?
【数据处理检查】
□ 代码是否改变了你的原始数据?(理想情况:不改变)
□ 是否进行了必要的数据转换?(如排序、计算新变量)
□ 是否处理了缺失值?(如果有)
【标注和标签检查】
□ 标题、轴标签、图例是否清晰?
□ 字体大小是否合适?
□ 是否有必要的数值标注?
【主题和视觉检查】
□ 主题是否符合观众和场景?
□ 颜色是否美观且信息化?
□ 坐标轴范围是否合理?(有没有被切断的数据点)
□ 图例位置是否合理?(是否与图表内容重叠)
【可重复性检查】
□ 代码注释是否足够清晰?
□ 能否理解每一行的作用?
□ 是否容易修改某些参数?
【特殊需求检查】
□ 是否满足了你在Prompt中提出的所有要求?
□ 有没有超额完成的部分(可能过度设计)?
□ 有没有遗漏的需求?
根据这个清单,有三种处理方式:
- 满意度 >90%:直接使用,可能做微调
- 满意度 60-90%:需要要求ChatGPT修改特定部分
- 满意度 <60%:重新写Prompt,更清晰地说明需求
第三部分:代码调试与优化
3.1 常见的ggplot2代码错误及修复
当你运行ChatGPT的代码时,经常会遇到这些错误。这里教你怎么修复。
错误类型1:数据转换问题
症状: "Error: Aesthetics must be either length 1 or the same length as the data"
# 错误的代码
ggplot(df, aes(x = var1, y = var2, color = "red")) +
geom_point()
# 问题:color="red" 被当作一个映射而不是视觉属性
# 结果:R尝试将"red"这个字符串映射到数据,导致长度不匹配
修复方法:
# 正确做法1:color作为美学映射(来自数据)
ggplot(df, aes(x = var1, y = var2, color = var3)) +
geom_point()
# 正确做法2:color作为固定属性(不来自数据)
ggplot(df, aes(x = var1, y = var2)) +
geom_point(color = "red") # color在 geom_point() 里,不在 aes() 里
区别记住这一点:
aes() 内部:用于映射到数据变量
geom_point() 直接参数:用于固定视觉属性
错误类型2:因子水平排序问题
症状: 图表的X轴顺序不是你想要的(如字母顺序,而不是大小顺序)
# 数据
regions <- data.frame(
Region = c("西部", "华北", "华东", "华南"),
Sales = c(100, 200, 400, 300)
)
# 问题:X轴会按字母顺序显示:华东、华北、华南、西部
# 而你想按销售额大小排序
ggplot(regions, aes(x = Region, y = Sales)) +
geom_col()
修复方法1:用 reorder() 排序
ggplot(regions, aes(x = reorder(Region, Sales), y = Sales)) +
geom_col() +
labs(x = "地区") # 注意:X轴标签改为"地区",因为 reorder 有时会显示复杂名称
修复方法2:用 factor() 指定水平顺序
regions$Region <- factor(regions$Region,
levels = c("西部", "华北", "华南", "华东"))
ggplot(regions, aes(x = Region, y = Sales)) +
geom_col()
修复方法3:用 forcats 包(推荐)
library(forcats)
ggplot(regions, aes(x = fct_reorder(Region, Sales), y = Sales)) +
geom_col() +
labs(x = "地区")
什么时候用哪种:
reorder():快速排序,适合简单情况factor():需要精确控制顺序时forcats::fct_reorder():最灵活,支持多种排序方式
错误类型3:图层顺序导致的覆盖问题
症状: 某些图层被其他图层挡住了看不见
# 问题代码
ggplot(df, aes(x = var1, y = var2)) +
geom_point(size = 5, alpha = 0.3) + # 散点
geom_smooth() # 趋势线
# 问题:趋势线可能被散点覆盖
# 修复:调整图层顺序或透明度
ggplot(df, aes(x = var1, y = var2)) +
geom_smooth(color = "red", linewidth = 2) + # 趋势线先画
geom_point(size = 3, alpha = 0.5, color = "black") # 散点后画
关键原则:
ggplot2是"后画的在上面"。如果想让趋势线在上面,就在后面加。
错误类型4:Treemap中的坐标转换问题
症状: Treemap显示有问题,或标签重叠
# 常见问题
library(treemapify)
ggplot(data, aes(area = Sales, fill = Category, label = Product)) +
geom_treemap() +
geom_treemap_text()
# 问题:标签可能太多导致重叠,或字号不合理
# 修复
ggplot(data, aes(area = Sales, fill = Category, label = Product)) +
geom_treemap(color = "white", linewidth = 2) + # 矩形间的白线
geom_treemap_text(colour = "white",
place = "topleft", # 改变标签位置
size = 8, # 调整字号
fontface = "bold",
reflow = TRUE) # 允许文字自动换行
3.2 参数微调指南
ChatGPT生成的代码往往是"七八成完成"的版本。最后的完美需要你进行微调。
调参1:字体和字号
# 常见字号设置
theme(
plot.title = element_text(size = 14, face = "bold"), # 标题:14磅、粗体
plot.subtitle = element_text(size = 12), # 副标题:12磅
axis.title = element_text(size = 11), # 轴标题:11磅
axis.text = element_text(size = 10), # 轴标签:10磅
legend.text = element_text(size = 10), # 图例文字:10磅
strip.text = element_text(size = 11, face = "bold") # 分面标题:11磅、粗体
)
# 字体选择
# 无衬线字体(现代):Arial, Helvetica, Liberation Sans
# 衬线字体(传统):Times, Georgia, DejaVu Serif
# 使用自定义字体(需要先安装showtext包)
library(showtext)
font_add("SimHei", "SimHei.ttf") # 添加中文字体
showtext_auto()
调参2:颜色精调
# 问题:ChatGPT可能选择不够理想的颜色
# 解决:更换色板或手动指定
# 方案1:使用预定义色板(推荐)
library(RColorBrewer)
# 查看所有可用色板
display.brewer.all()
# 在代码中使用
scale_fill_brewer(palette = "Set2") # 柔和彩色
scale_fill_brewer(palette = "Dark2") # 深色
scale_fill_brewer(palette = "Spectral") # 彩虹色
# 方案2:手动指定颜色
scale_color_manual(values = c(
"Product A" = "#E41A1C", # 红色
"Product B" = "#377EB8", # 蓝色
"Product C" = "#4DAF4A" # 绿色
))
# 方案3:连续变量的梯度颜色
scale_fill_gradient(low = "#FFFFCC", high = "#006837") # 黄到绿的梯度
scale_fill_viridis_c() # 使用viridis色板(色盲友好)
调参3:坐标轴范围和标度
# 问题:坐标轴范围不合理,或需要对数标度
# 方案1:固定坐标轴范围
scale_y_continuous(limits = c(0, 500)) # Y轴范围0-500
scale_x_continuous(breaks = seq(2020, 2024, by = 1)) # 手动指定刻度
# 方案2:使用对数标度(适合数据跨度大)
scale_y_log10() # 对数标度
scale_y_sqrt() # 平方根标度
# 方案3:百分比标度
library(scales)
scale_y_continuous(labels = percent) # 轴标签显示为百分比
scale_fill_continuous(labels = percent) # 图例显示为百分比
调参4:坐标系和翻转
# 问题:某些图表需要特殊的坐标系
# 方案1:翻转坐标轴(让横向柱状图变竖向)
coord_flip()
# 方案2:极坐标(饼图、甜甜圈图)
coord_polar(theta = "x") # theta表示从哪个变量出发
# 方案3:固定宽高比
coord_fixed(ratio = 1) # 1:1比例,用于地图等
3.3 完整的代码优化示例
让我给你一个从"ChatGPT初版"到"生产级代码"的完整演变过程:
第一版:ChatGPT生成的基础代码
library(ggplot2)
ggplot(sales_data, aes(x = Region, y = Sales, fill = Region)) +
geom_col() +
theme_minimal()
问题:
- X轴顺序不对(字母顺序)
- 没有数值标注
- 颜色太多且分散注意力
- 标题和标签不清晰
第二版:改进版(应用调参技巧)
library(ggplot2)
ggplot(sales_data, aes(x = reorder(Region, -Sales), y = Sales)) +
geom_col(fill = "#3498DB", color = "white", linewidth = 1) + # 单一蓝色,加边框
geom_text(aes(label = paste0("¥", Sales, "M")), # 数值标注
vjust = -0.5, size = 4, fontface = "bold") +
scale_y_continuous(limits = c(0, max(sales_data$Sales) * 1.1), # 给标注留空间
labels = scales::dollar_format(prefix = "¥", suffix = "M")) +
labs(
title = "2024年销售额按地区排名",
subtitle = "各地区销售表现对比",
x = "地区",
y = "销售额",
caption = "数据来源:销售部"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 14, face = "bold", hjust = 0),
plot.subtitle = element_text(size = 11, color = "gray40"),
axis.text = element_text(size = 10),
axis.ticks.x = element_blank(), # 去掉X轴刻度
panel.grid.x = element_blank(), # 去掉X方向网格线
plot.margin = unit(c(1, 1, 1, 1), "cm")
)
改进点:
- ✅ X轴按销售额排序 (
reorder) - ✅ 每个柱子上标注具体数值
- ✅ 统一配色,减少视觉噪音
- ✅ 清晰的标题、副标题、图注
- ✅ 优化的主题,去掉不必要的网格线
- ✅ 正确的数值格式(带货币符号)
第三版:生产级代码(含可复用性)
# ============================================
# 销售数据可视化 - 柱状图
# ============================================
# 日期:2024-01-15
# 作者:[你的名字]
# 数据源:sales_data.csv
# ============================================
library(ggplot2)
library(scales)
# 1. 数据准备 ----
# 确保数据框存在
stopifnot(exists("sales_data"), nrow(sales_data) > 0)
# 计算必要的统计量
sales_summary <- sales_data %>%
group_by(Region) %>%
summarise(
TotalSales = sum(Sales, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(desc(TotalSales))
# 2. 颜色和主题定义 ----
# 使用自定义色板
main_color <- "#3498DB" # 蓝色
highlight_color <- "#E74C3C" # 红色(用于突出)
text_color <- "#2C3E50" # 深灰色
bg_color <- "#ECF0F1" # 浅灰色
# 3. 绘制图表 ----
p <- ggplot(sales_summary,
aes(x = reorder(Region, -TotalSales), y = TotalSales)) +
# 背景层
geom_col(fill = main_color, color = "white", linewidth = 1.2) +
# 数值标注层
geom_text(
aes(label = paste0("¥", format(TotalSales, big.mark = ","), "M")),
vjust = -0.5,
size = 4,
fontface = "bold",
color = text_color
) +
# 标度设置
scale_y_continuous(
limits = c(0, max(sales_summary$TotalSales) * 1.15),
labels = dollar_format(prefix = "¥", suffix = "M"),
expand = expansion(mult = c(0, 0)) # 从0开始,不留空隙
) +
# 标签设置
labs(
title = "2024年销售额按地区排名",
subtitle = "各地区销售表现对比 | 单位:万元",
x = NULL, # 不显示X轴标题
y = "销售额",
caption = "数据来源:销售部 | 更新日期:2024-01-15"
) +
# 主题设置
theme_minimal() +
theme(
# 标题和标签
plot.title = element_text(
size = 14,
face = "bold",
hjust = 0, # 左对齐
color = text_color,
margin = margin(b = 5)
),
plot.subtitle = element_text(
size = 11,
color = "gray50",
hjust = 0,
margin = margin(b = 10)
),
plot.caption = element_text(
size = 8,
color = "gray50",
hjust = 1,
margin = margin(t = 10)
),
# 坐标轴
axis.title.y = element_text(size = 10, color = text_color),
axis.text = element_text(size = 10, color = text_color),
axis.ticks = element_blank(),
# 网格线
panel.grid.major.y = element_line(
color = "gray90",
linewidth = 0.3,
linetype = "dashed"
),
panel.grid.major.x = element_blank(),
# 背景
plot.background = element_rect(fill = "white", color = NA),
panel.background = element_rect(fill = "white", color = NA),
# 其他
plot.margin = unit(c(1.5, 1.5, 1, 1.5), "cm")
)
# 4. 输出 ----
print(p)
# 保存为高质量图片
ggsave(
filename = "销售额按地区排名.png",
plot = p,
width = 10,
height = 6,
dpi = 300,
bg = "white"
)
# 也可以保存为矢量格式(适合论文)
ggsave(
filename = "销售额按地区排名.pdf",
plot = p,
width = 10,
height = 6
)
这个版本的优点:
- ✅ 有详细的注释和逻辑分块
- ✅ 定义了可复用的颜色和参数
- ✅ 包含了数据验证(
stopifnot) - ✅ 支持多种导出格式
- ✅ 每个细节都有理由
- ✅ 可以轻松修改参数而无需改逻辑
3.4 Treemap的常见问题与调试
Treemap因为涉及到特殊的几何图形,经常遇到独特的问题。
问题1:标签重叠或消失
# 问题代码
library(treemapify)
ggplot(data, aes(area = Sales, fill = Category, label = Product)) +
geom_treemap() +
geom_treemap_text() # 标签可能互相覆盖
# 解决方案
ggplot(data, aes(area = Sales, fill = Category, label = Product)) +
geom_treemap(color = "white", linewidth = 2) +
geom_treemap_text(
colour = "white",
place = "centre", # 标签位置:centre/topleft/bottomright等
fontface = "bold",
size = 6, # 如果矩形太小,标签自动隐藏
reflow = TRUE # 允许文字自动换行
)
# 进阶:只显示大矩形的标签
data$show_label <- ifelse(data$Sales > quantile(data$Sales, 0.5),
data$Product, "")
ggplot(data, aes(area = Sales, fill = Category, label = show_label)) +
geom_treemap() +
geom_treemap_text(fontface = "bold", color = "white")
问题2:颜色映射问题
# 问题:是否映射到连续还是离散变量
library(treemapify)
# 离散颜色(分类)
ggplot(data, aes(area = Sales, fill = Category, label = Product)) +
geom_treemap() +
scale_fill_brewer(palette = "Set3") +
geom_treemap_text()
# 连续颜色(数值)
ggplot(data, aes(area = Sales, fill = Profit_Ratio, label = Product)) +
geom_treemap() +
scale_fill_gradient(low = "red", high = "green") +
geom_treemap_text()
问题3:多层级Treemap
Treemap支持多层级(虽然需要特殊数据结构):
# 准备分层数据
library(treemapify)
# 数据框需要包含所有级别
data <- data.frame(
Level1 = c("A", "A", "A", "B", "B", "B"),
Level2 = c("A1", "A2", "A3", "B1", "B2", "B3"),
Value = c(100, 80, 60, 120, 110, 90)
)
# 简单Treemap(只显示Level2)
ggplot(data, aes(area = Value, fill = Level1, label = Level2)) +
geom_treemap() +
geom_treemap_text(fontface = "bold", color = "white")
# 如果要真正的分层Treemap,可能需要更复杂的数据准备
# 这超出了treemapify的简单使用,可能需要自定义或用其他包如 ggraph
第三部分:高级技巧与完整案例
3.5 高级技巧:多图联动与复杂布局
当单个图表无法讲完故事时,你需要用多个图表组织信息。这里教你如何用ChatGPT协助设计复杂的多图布局。
技巧1:用patchwork拼接多个图表
Prompt写法:
我需要用patchwork库将4个ggplot2图表拼接到一个图像中。
图表1:时间序列线图(销售趋势)
图表2:柱状图(地区对比)
图表3:箱线图(分布对比)
图表4:散点图(相关性)
布局要求:
- 2×2网格布局
- 每个图表占一个格子
- 图表1要比其他图表大一倍
标题和标签:
- 整个拼接图有一个总标题
- 每个子图有自己的标题(A、B、C、D)
最后导出为 300dpi 的 PNG,尺寸 16×12 cm
请提供完整的patchwork代码。
ChatGPT会生成的代码框架:
library(ggplot2)
library(patchwork)
# 创建4个独立的图表
p1 <- ggplot(data1, aes(x = Date, y = Sales)) +
geom_line() +
labs(title = "A. 销售趋势")
p2 <- ggplot(data2, aes(x = Region, y = Sales)) +
geom_col() +
labs(title = "B. 地区对比")
p3 <- ggplot(data3, aes(x = Region, y = Price)) +
geom_boxplot() +
labs(title = "C. 价格分布")
p4 <- ggplot(data4, aes(x = Var1, y = Var2)) +
geom_point() +
labs(title = "D. 相关性")
# 使用patchwork布局
combined <- (p1 / (p2 | p3 | p4)) +
plot_annotation(
title = "2024年销售数据综合分析",
subtitle = "四个关键维度的对比",
theme = theme(
plot.title = element_text(size = 16, face = "bold"),
plot.subtitle = element_text(size = 12, color = "gray50")
)
)
# 显示
print(combined)
# 保存
ggsave("综合分析.png", combined, width = 16, height = 12,
units = "cm", dpi = 300, bg = "white")
patchwork布局符号速查:
# | 表示水平并排
p1 | p2 # p1和p2并排
# / 表示竖向堆叠
p1 / p2 # p1在上,p2在下
# 组合使用
(p1 | p2) / p3 # p1和p2并排,p3在下面占满宽度
# 调整比例
p1 / (p2 | p3) # 另一种组合方式
# 用 plot_spacer() 留空
p1 | plot_spacer() | p2 # p1、空位、p2
# 设置比例
p1 | (p2 / p3) # 左边p1占1个单位,右边p2/p3各占0.5个单位
(p1 / p2) | (p3 / p4) # 2×2网格
技巧2:用cowplot对齐图表
当图表的坐标轴不一致时,cowplot能帮你对齐它们:
library(ggplot2)
library(cowplot)
# 创建两个图表
p1 <- ggplot(data1, aes(x = X, y = Y)) +
geom_point() +
theme_minimal()
p2 <- ggplot(data2, aes(x = X, y = Y)) +
geom_line() +
theme_minimal()
# 用cowplot对齐并并排显示
plot_grid(
p1, p2,
labels = c("A", "B"), # 添加标签
label_size = 12, # 标签字号
align = "v", # 按垂直方向对齐
ncol = 2 # 2列
)
3.6 AI与人工的最佳配合模式
这是我经过实践总结的最高效的工作流程。
模式1:快速原型迭代
1️⃣ 你描述需求 → ChatGPT 生成代码
(可能60%满意度)
2️⃣ 你运行代码,确定不满意的地方
(如颜色、标注、布局等)
3️⃣ 你问ChatGPT:"这部分我想改..."
(不需要重新写整个Prompt,只说改什么)
4️⃣ ChatGPT 给出修改建议或新代码
(往往3-5次迭代就能达到90%满意度)
示例对话:
你:帮我用ggplot2画柱状图对比销售额...
[第1版代码,75%满意度]
你:我不喜欢彩色柱子。改成单一蓝色,但要突出最高的那个用红色。
ChatGPT:[修改后的代码]
你:标题太小了,而且我想要添加一条参考线显示平均值。
ChatGPT:[调整标题字号 + 添加 geom_hline() 代码]
你:完美!现在帮我保存为 300dpi 的 PNG。
ChatGPT:[ggsave() 代码]
这个模式为什么高效:
- ✅ ChatGPT生成快速原型,节省时间
- ✅ 你专注于判断"对不对"而非"怎么做"
- ✅ 反复迭代收敛到完美版本
- ✅ 全程保留自主权
模式2:学习与优化并行
1️⃣ ChatGPT 生成代码
→ 你不仅运行,还仔细读代码
2️⃣ 你问ChatGPT:"为什么这里用 reorder() 而不是 factor()?"
→ ChatGPT 解释两种方法的区别和适用场景
3️⃣ 你学到了新知识
→ 下次遇到类似问题,你已经知道怎么做
4️⃣ 随着知识积累,你需要ChatGPT的频率下降
→ 但对于复杂场景,仍然能快速提升效率
为什么这很重要: ChatGPT不是替代学习,而是加速学习。通过这种模式,你:
- 学得更快(看真实代码而非教科书)
- 学得更深(理解为什么这么做)
- 学得更实用(直接应用到项目中)
模式3:风险控制与验证
对于重要的可视化(如论文、报告),添加验证步骤:
1️⃣ ChatGPT生成代码
2️⃣ 你运行代码,得到初版图表
3️⃣ 验证清单:
□ 数据点数量对不对?(数据没有被遗漏)
□ 坐标轴范围对不对?(没有被非正常切割)
□ 颜色编码对不对?(美学映射正确)
□ 标注准不准?(数值标注无误)
□ 这个图的结论对不对?(符合我对数据的理解)
4️⃣ 如果有任何一项"不对",回到ChatGPT修改
→ 不要妥协,确保100%正确
5️⃣ 最后一步:把代码和图表发给同事/导师看一遍
→ 获取第二意见,特别是对故事的理解
为什么这很重要: 科研中可视化错误会导致结论错误。AI生成的代码看起来完美,但你必须自己验证其正确性。
3.7 完整案例集合
现在我给你5个完整的现实案例,涵盖不同场景和复杂度。
案例1:论文数据呈现(医学研究)
背景: 某医学研究论文,需要展示不同治疗组的效果对比。
数据结构:
clinical_data <- data.frame(
Treatment = rep(c("Control", "Drug A", "Drug B"), each = 50),
Outcome = c(
rnorm(50, mean = 5, sd = 2),
rnorm(50, mean = 8, sd = 2),
rnorm(50, mean = 9.5, sd = 2)
),
Patient_ID = rep(1:150)
)
高质量的Prompt:
我正在写一篇医学论文,需要展示3个治疗组(对照组、药物A、药物B)的临床结果对比。
数据框 clinical_data 包含:
- Treatment: 三个治疗组
- Outcome: 观测值(如症状评分0-15分)
- Patient_ID: 患者ID
样本量:每组50例患者
我想要的图表:
一个组合图,包含两个子图:
1. 箱线图:展示每个治疗组的分布(中位数、四分位数、异常值)
2. 个体数据点:在箱线图上叠加所有患者的个体数据(带抖动以避免重叠)
视觉要求:
- 这是论文图表,需要黑白友好
- 治疗组按以下顺序显示:Control → Drug A → Drug B
- 添加统计注释:在有显著性差异的组间上方标注 * (p<.05) 或 ** (p<.01)
- y轴标注为"Clinical Outcome Score",范围0-15
特殊要求:
- 每个箱线图的宽度相等
- 个体数据点的颜色应能区分但不过于艳丽(黑白打印后仍可区分)
- 添加图注(figure caption)
图片尺寸:宽10cm × 高8cm,300dpi
请提供完整的ggplot2代码,包括:
1. 绘图代码
2. 统计检验代码(t检验或ANOVA)
3. 图注文本
期望的输出代码:
library(ggplot2)
library(ggpubr) # 用于统计注释
# 1. 数据准备 ----
# 确保Treatment是有序因子
clinical_data$Treatment <- factor(
clinical_data$Treatment,
levels = c("Control", "Drug A", "Drug B")
)
# 2. 统计检验 ----
# 方差分析
aov_result <- aov(Outcome ~ Treatment, data = clinical_data)
anova_p <- summary(aov_result)[[1]]$"Pr(>F)"[1]
# 两两比较(如需)
t_test_AB <- t.test(
clinical_data$Outcome[clinical_data$Treatment == "Control"],
clinical_data$Outcome[clinical_data$Treatment == "Drug A"]
)
# 3. 绘图 ----
p <- ggplot(clinical_data, aes(x = Treatment, y = Outcome, fill = Treatment)) +
# 箱线图
geom_boxplot(
width = 0.5,
alpha = 0.7,
outlier.shape = NA # 先隐藏异常值,后面用geom_point显示
) +
# 个体数据点(带抖动)
geom_jitter(
width = 0.15,
size = 2,
alpha = 0.4,
color = "black"
) +
# 坐标轴和标度
scale_y_continuous(
limits = c(-0.5, 15.5),
breaks = seq(0, 15, by = 3),
expand = expansion(mult = c(0, 0))
) +
# 灰度填充(黑白打印友好)
scale_fill_grey(
start = 0.6,
end = 0.9,
guide = "none" # 隐藏图例
) +
# 标签
labs(
title = "Clinical Outcomes by Treatment Group",
x = "Treatment Group",
y = "Clinical Outcome Score"
) +
# 主题
theme_minimal() +
theme(
plot.title = element_text(size = 12, face = "bold", hjust = 0.5),
axis.title = element_text(size = 11, face = "bold"),
axis.text = element_text(size = 10),
panel.grid.major.x = element_blank()
)
print(p)
# 4. 保存 ----
ggsave(
"clinical_outcomes.png",
plot = p,
width = 10,
height = 8,
units = "cm",
dpi = 300,
bg = "white"
)
# 5. 图注文本 ----
figure_caption <- "
Figure 1. Clinical Outcome Scores by Treatment Group.
Box plots show median (line), interquartile range (box), and range (whiskers).
Individual patient data points are shown as overlaid dots (n=50 per group).
ANOVA: F(2,147) = X.XX, p = X.XXX. Error bars represent ± 1 SD.
Drug A and Drug B showed significantly higher outcomes compared to Control
(both p < .001).
"
cat(figure_caption)
这个案例的关键要素:
- ✅ 包含了统计检验
- ✅ 既显示分布又显示个体数据
- ✅ 黑白打印友好
- ✅ 有完整的图注
- ✅ 坐标轴范围精确控制
案例2:商务报告仪表板(销售数据)
背景: 季度销售报告,需要一页纸呈现关键指标。
Prompt:
我需要为季度销售报告创建一个仪表板风格的可视化。
数据框 sales_dashboard:
- Quarter: Q1-Q4
- Region: 华东、华南、华北、西部、其他
- Product_Line: Premium、Standard、Basic
- Revenue: 万元
- Growth_Rate: %
我想要一个2×2的仪表板:
1. 左上:按季度的营收趋势(折线图+柱状图组合)
2. 右上:各地区的营收占比(甜甜圈图)
3. 左下:各产品线的营收对比(水平柱状图,按营收排序)
4. 右下:增长率排名(小倍数柱状图)
设计要求:
- 风格:现代商务,使用公司品牌色(蓝色、橙色、绿色)
- 目的:给C-level呈现,需要视觉冲击力
- 时间:各图表都应该能在5秒内理解
- 数据标注:关键数值必须直接显示
公司品牌色RGB:
- 主色蓝:RGB(52, 152, 219)
- 辅助橙:RGB(230, 126, 34)
- 成功绿:RGB(46, 204, 113)
图片规格:
- 尺寸:宽16in × 高10in
- 分辨率:150dpi(用于投影)
- 导出:PNG和PDF两种格式
请提供完整代码,包括:
1. 4个子图的代码
2. 用patchwork拼接的代码
3. 保存为高质量图片的代码
部分代码示例(保留重点部分):
library(ggplot2)
library(patchwork)
library(dplyr)
# 品牌色定义
brand_colors <- list(
primary_blue = "#3498DB",
secondary_orange = "#E67E22",
success_green = "#2ECC71"
)
# ========== 子图1:营收趋势 ==========
p1 <- sales_dashboard %>%
group_by(Quarter) %>%
summarise(Revenue = sum(Revenue)) %>%
ggplot(aes(x = Quarter, y = Revenue)) +
geom_col(fill = brand_colors$primary_blue, alpha = 0.8) +
geom_line(group = 1, size = 1, color = brand_colors$secondary_orange) +
geom_point(size = 3, color = brand_colors$secondary_orange) +
geom_text(aes(label = paste0("¥", Revenue, "M")),
vjust = -0.5, fontface = "bold") +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
labs(title = "季度营收趋势", x = NULL, y = "营收 (万元)") +
theme_minimal() +
theme(
plot.title = element_text(size = 13, face = "bold"),
axis.text = element_text(size = 10)
)
# ========== 子图2:地区占比(甜甜圈图)==========
region_data <- sales_dashboard %>%
group_by(Region) %>%
summarise(Revenue = sum(Revenue), .groups = "drop") %>%
mutate(Percentage = Revenue / sum(Revenue) * 100)
p2 <- ggplot(region_data, aes(x = 2, y = Revenue, fill = Region)) +
geom_col(color = "white", linewidth = 2) +
coord_polar(theta = "y") +
xlim(0.5, 2.5) +
scale_fill_manual(
values = c(
"华东" = brand_colors$primary_blue,
"华南" = brand_colors$secondary_orange,
"华北" = brand_colors$success_green,
"西部" = "#95A5A6",
"其他" = "#BDC3C7"
)
) +
geom_text(aes(label = paste0(Region, "\n",
sprintf("%.1f%%", Percentage))),
position = position_stack(vjust = 0.5),
fontface = "bold", size = 3.5) +
labs(title = "地区营收占比") +
theme_void() +
theme(
plot.title = element_text(size = 13, face = "bold", hjust = 0.5),
legend.position = "none"
)
# ========== 子图3:产品线对比(水平柱状图)==========
product_data <- sales_dashboard %>%
group_by(Product_Line) %>%
summarise(Revenue = sum(Revenue), .groups = "drop") %>%
arrange(desc(Revenue))
p3 <- ggplot(product_data,
aes(x = reorder(Product_Line, Revenue), y = Revenue)) +
geom_col(fill = brand_colors$primary_blue) +
geom_text(aes(label = paste0("¥", Revenue, "M")),
hjust = -0.1, fontface = "bold") +
coord_flip() +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
labs(title = "产品线营收排名", x = NULL, y = "营收 (万元)") +
theme_minimal() +
theme(
plot.title = element_text(size = 13, face = "bold"),
axis.text = element_text(size = 10)
)
# ========== 子图4:增长率排名 ==========
growth_data <- sales_dashboard %>%
group_by(Region) %>%
summarise(Growth_Rate = mean(Growth_Rate), .groups = "drop") %>%
arrange(desc(Growth_Rate))
p4 <- ggplot(growth_data,
aes(x = reorder(Region, Growth_Rate),
y = Growth_Rate,
fill = ifelse(Growth_Rate > 0,
brand_colors$success_green,
"#E74C3C"))) +
geom_col() +
geom_text(aes(label = paste0(Growth_Rate, "%")),
hjust = -0.1, fontface = "bold") +
coord_flip() +
scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
scale_fill_identity() +
labs(title = "增长率排名", x = NULL, y = "增长率 (%)") +
theme_minimal() +
theme(
plot.title = element_text(size = 13, face = "bold"),
axis.text = element_text(size = 10)
)
# ========== 拼接 ==========
dashboard <- (p1 | p2) / (p3 | p4) +
plot_annotation(
title = "2024年Q4销售仪表板",
subtitle = "关键指标概览",
theme = theme(
plot.title = element_text(size = 16, face = "bold"),
plot.subtitle = element_text(size = 12, color = "gray50")
)
)
print(dashboard)
# 保存
ggsave("sales_dashboard.png", dashboard,
width = 16, height = 10, units = "in", dpi = 150, bg = "white")
这个案例的亮点:
- ✅ 品牌色的一致性应用
- ✅ 多个不同类型的图表组合
- ✅ 视觉上有冲击力,适合高管演讲
- ✅ 每个图表都有明确的故事
- ✅ 技术含量中等,代码高效
案例3:学术分析(多维数据可视化)
背景: 论文需要展示三维数据的关系:产品类别、地区、时间。
Prompt:
我有一个复杂的多维销售数据,需要用分面图展示。
数据框 multi_data:
- Year: 2020-2024
- Region: 5个地区
- Category: 4个产品类别
- Sales: 销售额
- Profit: 利润
共500行数据
分析目标:
展示所有产品类别在不同地区的销售趋势(时间序列)
可视化要求:
- 按产品类别分成4个分面(2×2网格)
- 每个分面内,按地区用不同颜色显示趋势线
- X轴:年份,Y轴:销售额
- 每条线上标注最后一年的具体数值
观众:学术论文
风格:学术论文标准(黑白、可打印)
特殊要求:
- 分面间共享同一个Y轴(便于对比)
- 添加统计趋势线(linear regression)
- 在每个分面标题中显示该类别的总销售额
图片规格:
宽12cm × 高10cm,300dpi
请提供代码和解释。
代码框架:
library(ggplot2)
library(dplyr)
# 数据准备
multi_data_processed <- multi_data %>%
group_by(Category) %>%
mutate(TotalSales = sum(Sales)) %>%
ungroup()
# 绘图
ggplot(multi_data_processed, aes(x = Year, y = Sales, color = Region)) +
# 折线图
geom_line(linewidth = 1) +
geom_point(size = 2) +
# 趋势线
geom_smooth(method = "lm", se = TRUE, alpha = 0.1,
linetype = "dashed", size = 0.5) +
# 在每条线末端标注
geom_text(data = multi_data_processed %>%
filter(Year == max(Year)),
aes(label = paste0("¥", Sales)),
hjust = -0.2, size = 3) +
# 分面
facet_wrap(~ Category, labeller = labeller(
Category = setNames(
paste0(unique(multi_data_processed$Category), " | ",
scales::dollar(unique(multi_data_processed$TotalSales))),
unique(multi_data_processed$Category)
)
)) +
# 颜色(黑白友好)
scale_color_manual(values = c(
"华东" = "black",
"华南" = "gray30",
"华北" = "gray60",
"西部" = "gray80",
"其他" = "gray50"
)) +
# 坐标轴
scale_x_continuous(breaks = 2020:2024) +
# 标签和主题
labs(
title = "各产品类别在不同地区的销售趋势",
x = "年份", y = "销售额 (万元)",
color = "地区"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 12, face = "bold", hjust = 0.5),
strip.text = element_text(size = 10, face = "bold"),
axis.text = element_text(size = 9),
panel.grid.major = element_line(color = "gray90", linetype = "dashed")
)
# 保存
ggsave("multi_dimensional_analysis.png", width = 12, height = 10,
units = "cm", dpi = 300, bg = "white")
这个案例的学习点:
- ✅ 分面图的使用
- ✅ 在分面标题中嵌入数据信息
- ✅ 黑白配色方案
- ✅ 多条线的标注处理
案例4:交互式探索(初级动态)
背景: 虽然ggplot2本身是静态的,但可以生成多个相关图表供探索。
Prompt:
我想为一个数据探索项目创建多个相关的图表,以便从不同角度理解数据。
数据:产品销售数据(multi_dim_sales)
请为我生成一个"图表系列":
1. 总体图:所有产品的销售总额对比
2. 详细图:按地区分面的销售对比
3. 时间图:销售趋势随时间变化
4. 效率图:利润率vs销售额的散点图
这些图表应该:
- 能独立理解,也能联动理解
- 都使用一致的配色方案
- 便于导出成单独的PNG文件
请用一个脚本生成所有图表。
代码:
library(ggplot2)
library(dplyr)
# 定义共同的主题和颜色
common_theme <- function() {
theme_minimal() +
theme(
plot.title = element_text(size = 12, face = "bold", hjust = 0.5),
axis.text = element_text(size = 10),
legend.position = "bottom"
)
}
color_palette <- c(
"华东" = "#1f77b4", "华南" = "#ff7f0e",
"华北" = "#2ca02c", "西部" = "#d62728"
)
# 图表1:总体对比
p1 <- multi_dim_sales %>%
group_by(Product) %>%
summarise(Sales = sum(Sales), .groups = "drop") %>%
arrange(desc(Sales)) %>%
ggplot(aes(x = reorder(Product, -Sales), y = Sales)) +
geom_col(fill = "#3498DB") +
geom_text(aes(label = scales::dollar(Sales)),
vjust = -0.5, fontface = "bold") +
labs(title = "1. 产品总销售额排名", x = NULL, y = "销售额") +
common_theme()
# 图表2:地区分面对比
p2 <- multi_dim_sales %>%
group_by(Region, Product) %>%
summarise(Sales = sum(Sales), .groups = "drop") %>%
ggplot(aes(x = Product, y = Sales, fill = Region)) +
geom_col(position = "dodge") +
facet_wrap(~ Region, scales = "free_y") +
scale_fill_manual(values = color_palette) +
labs(title = "2. 各地区产品销售对比", x = NULL, y = "销售额") +
theme_minimal() +
theme(
plot.title = element_text(size = 12, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "bottom"
)
# 图表3:时间趋势
p3 <- multi_dim_sales %>%
group_by(Year, Region) %>%
summarise(Sales = sum(Sales), .groups = "drop") %>%
ggplot(aes(x = Year, y = Sales, color = Region, group = Region)) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
scale_color_manual(values = color_palette) +
labs(title = "3. 销售趋势随时间变化", x = "年份", y = "销售额") +
common_theme()
# 图表4:效率分析(利润率 vs 销售额)
p4 <- multi_dim_sales %>%
group_by(Product, Region) %>%
summarise(
Sales = sum(Sales),
ProfitRate = mean(Profit / Sales * 100),
.groups = "drop"
) %>%
ggplot(aes(x = Sales, y = ProfitRate, color = Region, size = Sales)) +
geom_point(alpha = 0.6) +
scale_color_manual(values = color_palette) +
labs(
title = "4. 销售额 vs 利润率",
x = "销售额", y = "利润率 (%)"
) +
common_theme() +
theme(legend.position = "right")
# 批量保存所有图表
charts <- list(
p1 = p1, p2 = p2, p3 = p3, p4 = p4
)
for (name in names(charts)) {
filename <- paste0("chart_", name, ".png")
ggsave(filename, charts[[name]],
width = 10, height = 8, units = "cm", dpi = 300)
cat("Saved:", filename, "\n")
}
# 或者用patchwork拼接成一个总览
library(patchwork)
overview <- (p1 | p2) / (p3 | p4)
ggsave("all_charts_overview.png", overview,
width = 16, height = 12, units = "cm", dpi = 300)
这个案例的优点:
- ✅ 展示了如何用一个脚本生成多个相关图表
- ✅ 使用循环批量保存(可扩展性强)
- ✅ 图表之间有逻辑联系,能形成一个完整的数据故事
- ✅ 代码模块化,易于维护和修改
案例5:高阶Treemap应用(分层可视化)
背景: 某公司想用Treemap展示完整的销售体系,包括产品线、品类、具体产品。
Prompt:
我想用Treemap展示公司的完整销售体系分层结构。
数据包含3个层级:
- Level 1:产品线(大类):IT、通讯、消费电子、其他
- Level 2:品类(中类):每个产品线下有2-4个品类
- Level 3:具体产品(小类):每个品类下有多个产品
数据框 product_hierarchy:
- ProductLine (Level 1)
- Category (Level 2)
- Product (Level 3)
- Sales (销售额)
- Profit (利润)
我想要的呈现方式:
- 矩形大小:代表销售额
- 矩形颜色:代表利润率 (红=低、黄=中、绿=高)
- 标注:显示产品名称 + 销售额
视觉要求:
- 利润率用色标显示:低(<10%) → 红色,中(10-20%) → 黄色,高(>20%) → 绿色
- 根据矩形大小自动调整字号
- 产品线之间有明显的分割线
这是一个内部管理仪表板,需要:
- 能直观看出哪些产品贡献最大
- 能发现哪些产品销售好但利润低(警示)
- 能识别出高利润的小众产品
图片规格:宽14in × 高10in,150dpi(投影用)
请提供完整的treemapify代码。
代码示例:
library(ggplot2)
library(treemapify)
library(dplyr)
# 数据准备
product_hierarchy <- product_hierarchy %>%
mutate(
ProfitRate = Profit / Sales * 100,
ProfitCategory = cut(
ProfitRate,
breaks = c(0, 10, 20, 100),
labels = c("低利润", "中利润", "高利润")
)
)
# 绘制Treemap
ggplot(product_hierarchy,
aes(area = Sales,
fill = ProfitRate,
label = Product,
subgroup = ProductLine)) +
# 矩形
geom_treemap(
color = "white",
linewidth = 2
) +
# 产品线边界(深色边框)
geom_treemap(
aes(subgroup = ProductLine),
fill = NA,
color = "black",
linewidth = 3
) +
# 产品名称和销售额
geom_treemap_text(
aes(label = paste0(Product, "\n¥", Sales, "M")),
color = "white",
fontface = "bold",
place = "centre",
size = 6,
reflow = TRUE
) +
# 产品线标题(仅在大矩形上显示)
geom_treemap_subgroup_text(
aes(subgroup = ProductLine),
color = "white",
fontface = "bold",
place = "topleft",
size = 10,
alpha = 0.7
) +
# 颜色标度(利润率)
scale_fill_gradient(
low = "#E74C3C", # 红色(低利润)
mid = "#F39C12", # 黄色(中利润)
high = "#27AE60", # 绿色(高利润)
midpoint = 15,
name = "利润率 (%)"
) +
# 标题和图例
labs(
title = "产品销售体系分层分析",
subtitle = "矩形大小=销售额 | 颜色=利润率",
caption = "绿色=高利润产品 | 红色=低利润产品 | 需警惕销售好但利润低的产品"
) +
# 主题
theme_minimal() +
theme(
plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 11, color = "gray50", hjust = 0.5),
plot.caption = element_text(size = 9, color = "gray50"),
legend.position = "right",
legend.title = element_text(size = 10, face = "bold"),
legend.text = element_text(size = 9)
)
# 保存
ggsave("product_hierarchy_treemap.png",
width = 14, height = 10, units = "in", dpi = 150, bg = "white")
高阶技巧解释:
- ✅ 用
subgroup参数实现分层 - ✅ 用两层
geom_treemap实现不同级别的边框 - ✅ 利用颜色梯度传递第二维数据(利润率)
- ✅ 动态调整文字大小(根据矩形大小)
- ✅ 用
geom_treemap_subgroup_text显示分组标题
3.8 常见问题解决方案速查表
Q1:我的图表太拥挤,怎么办?
问题症状: 标注重叠、图例与图表重叠、轴标签看不清
解决方案:
# 方案1:增大图片尺寸
ggsave("chart.png", p, width = 14, height = 10, units = "cm")
# 方案2:减少数据点
data_filtered <- data %>% filter(variable %in% top_10_categories)
# 方案3:调整文字大小和角度
theme(
axis.text.x = element_text(angle = 45, hjust = 1, size = 9),
axis.text.y = element_text(size = 8)
)
# 方案4:用分面替代堆积
facet_wrap(~ Category)
# 方案5:隐藏不必要的元素
theme(
legend.position = "none",
panel.grid.minor = element_blank()
)
Q2:怎样让中文标签显示正确?
问题症状: 中文显示为方框或乱码
解决方案(推荐):
# 方案1:使用showtext包(最稳定)
library(showtext)
# 导入系统字体(Windows)
font_add("SimHei", "C:/Windows/Fonts/SimHei.ttf")
# 或Mac
font_add("SimHei", "/Library/Fonts/SimHei.ttf")
# 或Linux
font_add("SimHei", "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc")
# 启用showtext
showtext_auto()
# 现在就可以正常使用中文了
ggplot(...) + labs(title = "销售数据分析")
# 导出时也要使用showtext
ggsave("chart.png", dpi = 300)
# 方案2:如果没有合适的中文字体,用英文或拼音作为替代
labs(title = "Sales Analysis", x = "shichu", y = "xiaoshue")
Q3:怎样导出为最高质量的图片?
问题症状: 导出后图片模糊或色彩失真
解决方案(最佳实践):
# 对于论文/报告(PNG)
ggsave("chart.png", p,
width = 10, # 厘米
height = 8,
units = "cm",
dpi = 300, # 300dpi是出版标准
bg = "white", # 白色背景
compression = "lzw" # 无损压缩
)
# 对于高分辨率显示器或打印(TIFF)
ggsave("chart.tiff", p,
width = 10, height = 8, units = "cm",
dpi = 600, # 超高分辨率
bg = "white",
compression = "lzw"
)
# 对于矢量图(适合论文排版)
ggsave("chart.pdf", p,
width = 10, height = 8, units = "cm"
# PDF是矢量格式,自动缩放不失真
)
# 对于演讲/投影(高分辨率PNG)
ggsave("presentation.png", p,
width = 1920, height = 1080, # 16:9分辨率
units = "px",
dpi = 96, # 屏幕标准dpi
bg = "white"
)
# 对于Web使用(优化PNG)
ggsave("web.png", p,
width = 8, height = 6, units = "in",
dpi = 72, # Web标准
bg = "white"
)
Q4:怎样批量修改所有图表的主题?
问题症状: 改了某个图表的主题后,想把这个主题应用到所有其他图表
解决方案:
# 定义一个可复用的主题函数
theme_corporate <- function() {
theme_minimal() +
theme(
plot.title = element_text(
size = 14, face = "bold",
color = "#2C3E50", hjust = 0
),
plot.subtitle = element_text(
size = 11, color = "gray50", hjust = 0
),
axis.title = element_text(size = 10, face = "bold"),
axis.text = element_text(size = 9),
panel.grid.major = element_line(
color = "gray90", linetype = "dashed"
),
panel.grid.minor = element_blank(),
legend.position = "bottom",
plot.background = element_rect(fill = "white", color = NA),
panel.background = element_rect(fill = "#F8F9FA", color = NA)
)
}
# 在所有图表中使用
p1 <- ggplot(...) + theme_corporate()
p2 <- ggplot(...) + theme_corporate()
p3 <- ggplot(...) + theme_corporate()
# 如果要临时修改某个主题,可以叠加:
p1 + theme(legend.position = "right") # 只改p1的图例位置
Q5:怎样在ggplot2中添加统计标注(p值等)?
问题症状: 需要在图表上显示统计检验结果(如 * p<.05)
解决方案:
library(ggplot2)
library(ggpubr) # 提供 stat_compare_means() 函数
# 方案1:简单的t检验标注
ggplot(data, aes(x = Group, y = Value)) +
geom_boxplot() +
geom_jitter() +
stat_compare_means(method = "t.test") # 自动添加p值
# 方案2:多组比较(ANOVA)
ggplot(data, aes(x = Group, y = Value)) +
geom_boxplot() +
stat_compare_means(
method = "anova",
label = "p.format" # 格式化p值
)
# 方案3:自定义标注位置
# 先进行统计检验
groups <- unique(data$Group)
p_value <- t.test(
data$Value[data$Group == groups[1]],
data$Value[data$Group == groups[2]]
)$p.value
# 手动添加标注
ggplot(data, aes(x = Group, y = Value)) +
geom_boxplot() +
# 在Group 1和Group 2之间画一条横线
geom_segment(
x = 1, xend = 2,
y = max(data$Value) * 0.95,
yend = max(data$Value) * 0.95
) +
# 添加p值标注
annotate(
"text",
x = 1.5,
y = max(data$Value) * 0.98,
label = ifelse(p_value < 0.001, "***",
ifelse(p_value < 0.01, "**",
ifelse(p_value < 0.05, "*", "ns")))
)
第四部分:总结与最佳实践
4.1 ChatGPT与ggplot2配合的黄金法则
基于前面的案例和技巧,我总结了10条黄金法则:
1️⃣ 【信息完整性】
在Prompt中提供完整的上下文信息(数据结构、观众、目标)
→ 信息越完整,ChatGPT生成的代码质量越高
2️⃣ 【迭代而非重做】
遇到不满意的代码时,用"修改某部分"而非"重新做一遍"
→ 这样能保留好的部分,快速收敛到完美版本
3️⃣ 【验证而非盲目】
永远在运行代码前思考一下逻辑是否正确
→ 特别是对于论文、报告等关键场景
4️⃣ 【美学有意义】
不要为了"好看"而添加复杂的美学映射
→ 每个颜色、形状、大小都应该传递信息
5️⃣ 【学习不偷懒】
理解ChatGPT代码的每一行,而不是直接复制粘贴
→ 理解后,下次遇到类似问题时你可以自己写
6️⃣ 【简洁优于复杂】
能用一个简单的柱状图说清的,就别用复杂的Treemap
→ 简洁的图表传播效果最好
7️⃣ 【坐标轴很重要】
花时间优化坐标轴范围、标签、刻度
→ 坐标轴的细节往往决定了图表的专业度
8️⃣ 【数据驱动布局】
让数据决定你的布局,而不是为了对称好看
→ 如果某个分组有5个类别,用5个分面而不是强行分成2×3
9️⃣ 【标题和标注】
图表的标题、坐标轴标签、图例、数值标注都很重要
→ 一个好的标题能减少观众的理解时间50%
🔟 【批量管理代码】
定义可复用的主题、颜色方案、函数
→ 当有多个相关图表时,维护成本下降50%
4.2 不同场景的Prompt模板总结
| 场景 | 核心信息 | 重点 |
|---|---|---|
| 学术论文 | 数据结构 + 研究问题 + 观众 | 统计信息 + 黑白友好 + 图注 |
| 商务演讲 | 关键指标 + 故事线 + 品牌色 | 视觉冲击 + 5秒理解 + 数值突出 |
| 内部仪表板 | 多维数据 + 决策需求 | 多图联动 + 实时性 + 可维护 |
| 学位论文 | 完整的研究背景 | 学术规范 + 高质量输出 + 可打印 |
| 数据探索 | 简单描述 + 探索方向 | 快速迭代 + 易修改 + 可比较 |
4.3 质量保证清单(最终检查)
在把图表交出去前,用这个清单检查一遍:
【数据正确性】
□ 数据点数量正确?(可视化的数据和原始数据一致)
□ 缺失值处理正确?(没有无意中丢失数据)
□ 数据转换正确?(聚合、分组等操作符合逻辑)
□ 数值计算正确?(百分比、平均值等计算无误)
【美学和设计】
□ 配色符合主题?(学术/商务/其他)
□ 颜色是否色盲友好?(红色+绿色组合要避免)
□ 字体和字号是否一致?(所有标题统一样式)
□ 空白利用合理?(不过拥挤,也不太空荡)
【可读性和清晰度】
□ 标题清晰吗?(一句话概括图表内容)
□ 坐标轴标签清楚吗?(带单位,中英文统一)
□ 图例必要吗?(避免冗余图例)
□ 数值标注准确吗?(检查标注数值和数据点的对应)
【技术质量】
□ 分辨率足够吗?(打印/投影时清晰)
□ 导出格式正确吗?(PNG/PDF/其他)
□ 文件大小合理吗?(不太大,但不失质量)
□ 能否跨平台使用?(Windows/Mac/Linux上都看得清)
【与整体文档的一致性】
□ 风格与其他图表一致吗?
□ 色彩主题统一吗?
□ 字体选择一致吗?
□ 编号和引用正确吗?(Figure 1, Figure 2等)
【最后阅读】
□ 我能用2秒看出这个图的主要信息吗?
□ 观众会不会误解这个图?
□ 这个图是必要的还是可以用表格替代?
4.4 ChatGPT优化Prompt的进阶技巧
当ChatGPT的回答还不完美时,这些技巧能帮你获得更好的结果:
技巧1:给ChatGPT示范
我想要这样的图表效果:
[展示一个你满意的类似图表的截图或描述]
在这个例子中我喜欢的地方:
- 配色方案:柔和的蓝色和绿色
- 布局:左侧大图,右侧三个小图
- 标注:每个数据点都有具体数值
请用这个风格为我的销售数据生成类似的图表。
为什么有效: ChatGPT现在有了具体的参考,能更准确地理解你想要的"质量等级"和"风格"。
技巧2:要求ChatGPT先解释再编码
在给我代码前,请:
1. 用一句话解释这个图表要展示什么
2. 列出将用到的ggplot2图层
3. 解释每个美学映射的含义
4. 指出数据需要的预处理步骤
然后再给出完整代码。
为什么有效: 强制ChatGPT思考,能发现问题并提前修正,也能帮你学习。
技巧3:分阶段要求
第一步:给我一个基础版本的代码(最简单的实现)
第二步:在基础版本上添加统计标注
第三步:优化主题和颜色
第四步:添加图片导出代码
请分步提供,每步之间我会检查代码是否正确。
为什么有效: 分阶段能更好地质量控制,也更容易调试。
技巧4:对比式提问
请为我生成两个版本的代码:
版本A(简洁版):
- 只显示核心数据
- 最少化修饰
版本B(详细版):
- 显示所有细节
- 包含完整的标注和统计信息
然后解释何时应该用A,何时应该用B。
为什么有效: 对比能帮你理解不同的设计权衡。
4.5 常见错误和教训
错误1:过度依赖ChatGPT做设计决策
案例:
"帮我设计一个数据可视化来展示销售数据"
后果: ChatGPT可能设计出"看起来很酷"但对业务无帮助的图表。
正确做法:
"我想重点展示哪些产品的销售增长最快,哪些地区表现最好。
请推荐最合适的图表类型并解释为什么。"
错误2:忽视数据验证
案例: 直接运行ChatGPT生成的代码,没有检查数据。
后果: 某次发现图表显示的数据点数与原数据不符,原来是过滤操作有问题。
正确做法:
# 运行代码前,先验证
cat("原始数据行数:", nrow(original_data), "\n")
cat("过滤后数据行数:", nrow(filtered_data), "\n")
cat("图表显示的数据点数:", nrow(plot_data), "\n")
# 确保数字一致
stopifnot(nrow(plot_data) == expected_count)
错误3:过度设计
案例: 用了太多的美学映射(颜色+大小+形状+透明度+线型)
后果: 观众无法理解图表,反而增加了认知负担。
正确做法:
每个图表最多用2-3个美学映射。
例如:X轴 + Y轴 + 颜色 (3个)
不要再加大小、形状等。
附录A:常用ggplot2函数速查表
| 功能 | 函数 | 用途 |
|---|---|---|
| 基础绘图 | ggplot() |
初始化画布 |
| 几何图形 | geom_point() |
散点图 |
geom_line() |
线图 | |
geom_col() |
柱状图 | |
geom_boxplot() |
箱线图 | |
geom_histogram() |
直方图 | |
geom_smooth() |
趋势线 | |
| 美学映射 | aes() |
映射数据到视觉属性 |
scale_color_manual() |
手动指定颜色 | |
scale_fill_brewer() |
使用预定义色板 | |
| 分面 | facet_wrap() |
按一个变量分面 |
facet_grid() |
按两个变量分面 | |
| 坐标系 | coord_flip() |
翻转坐标轴 |
coord_polar() |
极坐标(饼图) | |
| 主题 | theme_minimal() |
简洁主题 |
theme_classic() |
经典主题 | |
theme() |
自定义主题 | |
| 标签 | labs() |
标题、轴标签等 |
annotate() |
添加注释 | |
| 导出 | ggsave() |
保存图片 |
附录B:Prompt模板速查表
模板1:最小化Prompt(快速生成)
我需要一个[图表类型]展示[数据]。
数据框:[name]
X轴:[variable]
Y轴:[variable]
分组:[variable, 可选]
特殊要求:[如有]
请给出ggplot2代码。
模板2:标准Prompt(推荐)
【背景】
[说明这个图表的用途]
【数据】
数据框:[name]
结构:[简要描述]
样本量:[N]
关键变量:[列表]
【目标】
这个图表应该回答什么问题?
【视觉要求】
- 图表类型:[如:柱状图、折线图等]
- 颜色:[色系或具体指定]
- 观众:[如:学术报告、商务演讲等]
- 风格:[如:简洁、详细等]
【特殊需求】
[如:添加统计标注、特定的标题等]
请提供完整代码。
模板3:完整Prompt(高质量输出)
【项目背景】
[详细说明项目上下文]
【数据说明】
数据框名:[name]
来源:[如:销售系统、调查问卷等]
更新频率:[如:日更新、月更新等]
数据结构:
- [Variable 1]: [Type, Description]
- [Variable 2]: [Type, Description]
...
【可视化目标】
核心问题:[一句话]
支持论据:[2-3个具体指标]
期望洞察:[希望观众理解什么]
【设计要求】
- 图表类型:[具体说明为什么选择这个类型]
- 颜色方案:[品牌色/行业标准/其他]
- 字体和字号:[具体规格]
- 美学映射:[X/Y/Color/Size/等的具体映射]
【观众和场景】
- 观众身份:[如:学术期刊编辑、商务高管等]
- 使用场景:[如:论文、演讲、报告等]
- 预期理解时间:[如:5秒、30秒等]
【输出规格】
- 尺寸:[具体尺寸]
- 分辨率:[DPI]
- 格式:[PNG/PDF等]
- 其他:[如:黑白打印友好、色盲友好等]
【参考和约束】
- 参考图表:[如有,描述你满意的类似图表]
- 避免:[如:避免3D效果、避免太多颜色等]
- 必须包含:[如:误差棒、p值标注等]
请提供:
1. 完整的ggplot2代码
2. 代码的逐行解释
3. 如何根据需要修改代码
更多推荐


所有评论(0)