最近在分析一个健康数据时,我需要展示不同疾病严重程度与治疗效果的关系。数据倒是处理好了,图也画出来了,但总感觉哪里不对劲。仔细一看,原来是图例部分的圆点太小了,根本看不清楚不同大小代表的含义。这在汇报的时候可是大忌啊!
咱们先用R自带的经典数据集mtcars来重现这个问题:
# 加载必要的包
library(ggplot2)
library(dplyr)
# 准备数据 - 使用mtcars数据集
# 我们来看看不同气缸数的车,马力、油耗和重量的关系
data_plot <- mtcars %>%
mutate(cyl = as.factor(cyl))%>%
group_by(cyl)%>%
mutate(mean_wt = mean(wt))
# 绘制基础散点图
p_base <- ggplot(data_plot, aes(x = hp, y = mpg))+
geom_point(aes(size = wt, color = cyl), alpha =0.7)+
labs(
title ="Car Performance Analysis",
x ="Horsepower",
y ="Miles per Gallon",
size ="Weight (1000 lbs)",
color ="Cylinders"
)+
theme_minimal()+
theme(
legend.position ="right",
plot.title = element_text(size =14, face ="bold"),
axis.title = element_text(size =12)
)
print(p_base)

成功创建了基础的散点图,但图例中表示重量的圆点偏小,不够清晰。
运行上面的代码,你会发现图例中表示重量(size)的圆点确实偏小,特别是当你的图需要投影或打印时,这个问题会更加明显。
其实解决这个问题特别简单,只需要一行代码!ggplot2提供了guides()函数,专门用来调整图例的各种属性。
# 方法1:单独调整size图例的大小
p_adjusted <- p_base +
guides(size = guide_legend(override.aes = list(size =8)))
print(p_adjusted)

图例中的圆点明显变大了,清晰度得到显著提升!
看到了吗?图例中的圆点瞬间变大了,清晰度立马提升!
既然学会了基础操作,咱们再来点进阶的。实际工作中,我们可能需要同时调整多个图例的属性:
# 方法2:同时调整多个图例属性
p_advanced <- p_base +
guides(
# 调整size图例
size = guide_legend(
override.aes = list(size = c(3,5,7,9)),# 自定义每个图例点的大小
title ="Weight\n(1000 lbs)",# 换行显示标题
title.position ="top"
),
# 调整color图例
color = guide_legend(
override.aes = list(size =5, alpha =1),# 让颜色图例的点也变大
title ="Cylinders",
nrow =1# 横向排列
)
)+
theme(
legend.box ="horizontal",# 图例横向排列
legend.box.background = element_rect(color ="grey80", linewidth =0.5)# 添加边框
)
print(p_advanced)

图例变得更加美观,包含多个定制化的设置。
让我们用一个更贴近医学研究的例子。这里使用survival包中的lung数据集,展示肺癌患者的生存分析:
# 加载额外的包
library(ggplot2)
library(dplyr)
library(survival)
library(scales)
# 准备数据
lung_data <- lung %>%
filter(!is.na(ph.ecog))%>%
mutate(
sex = factor(sex, levels = c(1,2), labels = c("Male","Female")),
ph.ecog = as.factor(ph.ecog),
status = factor(status, levels = c(1,2), labels = c("Censored","Dead"))
)
# 创建散点图
p_medical <- ggplot(lung_data, aes(x = age, y = time))+
geom_point(
aes(size = meal.cal, color = sex, shape = status),
alpha =0.6
)+
scale_size_continuous(
name ="Caloric Intake",
breaks = c(500,750,1000,1250),
labels = comma
)+
scale_color_manual(
values = c("Male"="#3498db","Female"="#e74c3c")
)+
labs(
title ="Lung Cancer Survival Time Analysis",
x ="Age (years)",
y ="Survival Time (days)",
shape ="Status"
)+
theme_classic()+
theme(
legend.position ="bottom",
legend.box ="vertical",
legend.title = element_text(size =10, face ="bold"),
legend.text = element_text(size =9)
)
# 应用我们的技巧调整图例
p_medical_adjusted <- p_medical +
guides(
size = guide_legend(
override.aes = list(size = c(2,4,6,8)),
order =1# 调整图例顺序
),
color = guide_legend(
override.aes = list(size =5),
order =2
),
shape = guide_legend(
override.aes = list(size =5),
order =3
)
)
print(p_medical_adjusted)

医学数据可视化完成,警告信息提示移除了包含缺失值的47行数据,这是正常的数据清理过程。
根据我的经验,调整图例时记住这几点:
大小要适中:图例点的大小一般设置在5-8之间比较合适,太大会喧宾夺主,太小又看不清楚。
保持一致性:如果同时有多个图例,尽量让它们的视觉权重保持平衡。
考虑输出场景:如果是用于PPT展示,图例可以稍大一些;如果是学术论文,则要符合期刊要求。
善用override.aes:这个参数不仅能调整大小,还能修改透明度、颜色、形状等属性。
# 综合示例:展示override.aes的多种用法
p_comprehensive <- ggplot(mtcars, aes(x = wt, y = mpg))+
geom_point(aes(color = factor(cyl), size = hp, shape = factor(am)))+
guides(
color = guide_legend(
override.aes = list(
size =6,# 统一大小
alpha =1,# 完全不透明
shape =16# 统一形状为实心圆
)
),
size = guide_legend(
override.aes = list(
shape =21,# 空心圆
fill ="grey50",# 填充颜色
color ="black"# 边框颜色
)
),
shape = guide_legend(
override.aes = list(
size =5,
color ="black"
)
)
)+
theme_minimal()
print(p_comprehensive)

综合示例展示了override.aes参数的多种用法,包括统一大小、透明度、形状等属性的调整。
图例虽小,却是图表的重要组成部分。一个清晰、美观的图例能让你的数据可视化作品更上一层楼。今天分享的这个guides()函数技巧,简单实用,一行代码就能解决大问题。
记住,好的数据可视化不仅要准确传达信息,更要让读者看得舒服、理解得轻松。下次当你发现图例太小的时候,别忘了用这个技巧哦!

现在可免费加入R语言机器学习微信群交流学习,请加微信(备注加群):

专为医学二分类预测而生!OneMonkMedical+MLR3第2版,打造您的诊断模型系统。从疾病风险到预后判断,一键驱动60+算法,四大特征选择交叉验证,确保模型稳健性。ROC/DCA/SHAP全套分析图自动生成,精准解释每一个预测。告别繁琐编码,让您的二分类研究,从数据到论文,快人一步,稳操胜券!OneMonkMedical + MLR3 医学二分类预测模型的自动驾驶完整解决方案--第2版

医学统计与模型构建,分享交流R语言医学数据分析、预测模型构建、SCI论文图表制作等心得。承接数据分析,论文修回,医学统计,生信分析,临床预测模型构建,shinyapp部署机器学习模型。若有投稿和数据分析代做需求,也可以直接联系我。欢迎加入知识星球参与讨论学习:https://t.zsxq.com/Ag6fx

加入知识星球免费送OneMonkMedical + MLR3 医学二分类预测模型全套代码:OneMonkMedical + MLR3 医学二分类预测模型的自动驾驶完整解决方案--第2版